GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing python.github.io (truncated) — انواع توکار انواع توکار¶بخشهای زیر انواع استانداردی را که بهصورت توکار در مفسر وجود دارند، توصیف میکنند. انواع توکار اصلی عبارتاند از: اعداد، دنبالهها، نگاشتها، کلاسها، نمونهها و استثناها. برخی از کلاسهای مجموعه تغییرپذیر هستند. متدهایی که اعضای آنها را درجا اضافه، حذف یا بازآرایی میکنند و آیتم مشخصی را برنمیگردانند، هرگز خودِ نمونهی مجموعه را برنمیگردانند، بلکه برخی عملیات توسط چندین نوع شیء پشتیبانی میشوند؛ بهطور خاص، تقریباً همهی اشیاء را میتوان از نظر برابری مقایسه کرد، مقدار درستی آنها را بررسی کرد و به یک رشته تبدیل کرد (با تابع آزمودن ارزش درستی¶هر شیء را میتوان از نظر مقدار درستی آزمود، برای استفاده در شرط بهطور پیشفرض، یک شیء درست در نظر گرفته میشود مگر اینکه کلاس آن متدی از نوع
عملیاتها و توابع توکاری که نتیجه بولی دارند، همیشه برای نادرست عملیات بولی ---
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
عملیات |
نتیجه |
یادداشتها |
|---|---|---|
|
اگر x درست باشد، آنگاه x، وگرنه y |
(1) |
|
اگر x نادرست باشد، آنگاه x، وگرنه y |
(2) |
|
اگر x نادرست باشد، آنگاه |
(3) |
یادداشتها:
این یک عملگر اتصال کوتاه است؛ بنابراین تنها در صورتی آرگومان دوم را ارزیابی میکند که آرگومان اول نادرست باشد.
این یک عملگر اتصال کوتاه است، بنابراین تنها در صورتی آرگومان دوم را ارزیابی میکند که آرگومان اول درست باشد.
not اولویت کمتری نسبت به عملگرهای غیربولی دارد، بنابراین not a == b به صورت not (a == b) تفسیر میشود و a == not b یک خطای سینتکس است.
در پایتون هشت عملیات مقایسه وجود دارد. همگی آنها اولویت یکسانی دارند (که بالاتر از اولویت عملیات بولی است). مقایسهها را میتوان بهطور دلخواه زنجیرهای کرد؛ برای مثال، x < y <= z معادل x < y and y <= z است، با این تفاوت که y فقط یک بار ارزیابی میشود (اما در هر دو حالت، وقتی مشخص شود که x < y نادرست است، z اصلاً ارزیابی نمیشود).
این جدول عملیات مقایسه را خلاصه میکند:
عملیات |
معنی |
|---|---|
|
کاملاً کمتر از |
|
کوچکتر یا مساوی |
|
اکیداً بزرگتر از |
|
بزرگتر یا مساوی |
|
برابر |
|
نامساوی |
|
هویت شیء |
|
نقیض هویت شیء |
مگر اینکه خلاف آن ذکر شده باشد، اشیاء از انواع مختلف هرگز برابر مقایسه نمیشوند. عملگر == همیشه تعریف شده است اما برای برخی انواع شیء (برای مثال، اشیاء کلاس) معادل is است. عملگرهای <، <=، > و >= فقط در مواردی تعریف شدهاند که معنا داشته باشند؛ برای مثال، وقتی یکی از آرگومانها یک عدد مختلط باشد، استثنای TypeError را پرتاب میکنند.
نمونههای غیریکسان یک کلاس معمولاً بهصورت نابرابر مقایسه میشوند، مگر اینکه کلاس متد __eq__() را تعریف کرده باشد.
نمونههای یک کلاس را نمیتوان نسبت به سایر نمونههای همان کلاس یا انواع دیگری از اشیاء مرتب کرد، مگر اینکه کلاس تعداد کافی از متدهای __lt__()، __le__()، __gt__() و __ge__() را تعریف کند (به طور کلی، اگر معانی مرسوم عملگرهای مقایسه را میخواهید، __lt__() و __eq__() کافی هستند).
رفتار عملگرهای is و is not قابل سفارشیسازی نیست؛ همچنین میتوان این عملگرها را روی هر دو شیء دلخواه اعمال کرد و هرگز استثنایی پرتاب نمیکنند.
دو عملیات دیگر با اولویت نحوی یکسان، in و not in، توسط نوعهایی پشتیبانی میشوند که پیمایشپذیر هستند یا متد __contains__() را پیادهسازی میکنند.
int، float، complex¶سه نوع عددی متمایز وجود دارد: عددهای صحیح (integers)، عددهای ممیز شناور (floating-point numbers) و عددهای مختلط (complex numbers). علاوه بر این، بولیها زیرنوعی از عددهای صحیح هستند. عددهای صحیح دقتی نامحدود دارند. عددهای ممیز شناور معمولاً با استفاده از double در C پیادهسازی میشوند؛ اطلاعات مربوط به دقت و نمایش درونی عددهای ممیز شناور برای ماشینی که برنامه شما روی آن اجرا میشود، در sys.float_info موجود است. عددهای مختلط دارای بخش حقیقی و بخش موهومی هستند که هر یک از آنها یک عدد ممیز شناور است. برای استخراج این بخشها از یک عدد مختلط z، از z.real و z.imag استفاده کنید. (کتابخانه استاندارد همچنین شامل نوعهای عددی دیگری است: fractions.Fraction برای اعداد گویا و decimal.Decimal برای عددهای ممیز شناور با دقت قابل تعریف توسط کاربر.)
اعداد با مقادیر لفظی عددی یا بهعنوان نتیجهی توابع توکار و عملگرها ساخته میشوند. مقادیر لفظی عدد صحیح ساده (از جمله اعداد مبنای شانزده، مبنای هشت و مبنای دو) اعداد صحیح تولید میکنند. مقادیر لفظی عددی حاوی ممیز اعشار یا علامت توان، اعداد ممیز شناور تولید میکنند. افزودن 'j' یا 'J' به انتهای یک لفظی عددی، یک عدد موهومی (یک عدد مختلط با بخش حقیقی صفر) ایجاد میکند که میتوانید آن را به یک عدد صحیح یا ممیز شناور اضافه کنید تا عدد مختلطی با بخشهای حقیقی و موهومی به دست آورید.
سازندههای int()، float() و complex() میتوانند برای تولید اعدادی از یک نوع مشخص به کار روند.
پایتون بهطور کامل از حساب ترکیبی پشتیبانی میکند: هنگامی که یک عملگر حسابی دودویی عملوندهایی از انواع عددی توکار متفاوت داشته باشد، عملوندی که نوع «باریکتری» دارد به نوع عملوند دیگر گسترش مییابد:
اگر هر دو آرگومان عدد مختلط باشند، هیچ تبدیلی انجام نمیشود؛
اگر هر یک از آرگومانها عددی مختلط یا ممیز شناور باشد، دیگری به عدد ممیز شناور تبدیل میشود؛
در غیر این صورت، هر دو باید عدد صحیح باشند و هیچ تبدیلی لازم نیست.
محاسبات با عملوندهای مختلط و حقیقی بر اساس فرمول ریاضی معمول تعریف میشود، برای مثال:
x + complex(u, v) = complex(x + u, v) x * complex(u, v) = complex(x * u, x * v)
مقایسه میان اعداد از انواع مختلف چنان رفتار میکند که گویی مقادیر دقیق آن اعداد در حال مقایسه هستند. [2]
همه انواع عددی (به جز مختلط) از عملیات زیر پشتیبانی میکنند (برای اولویتهای این عملیات، به اولویت عملگرها مراجعه کنید):
عملیات |
نتیجه |
یادداشتها |
مستندات کامل |
|---|---|---|---|
|
مجموع x و y |
||
|
تفاضل x و y |
||
|
حاصلضرب x و y |
||
|
خارج قسمت x و y |
||
|
خارجقسمت کفشدهی x و y |
(1)(2) |
|
|
باقیماندهی |
(2) |
|
|
x منفیشده |
||
|
x بدون تغییر |
||
|
قدر مطلق یا اندازهی x |
||
|
x تبدیلشده به عدد صحیح |
(3)(6) |
|
|
x تبدیلشده به ممیز شناور |
(4)(6) |
|
|
عدد مختلطی با بخش حقیقی re و بخش موهومی im. مقدار پیشفرض im صفر است. |
(6) |
|
|
مزدوج عدد مختلط c |
||
|
جفت |
(2) |
|
|
x به توان y |
(5) |
|
|
x به توان y |
(5) |
یادداشتها:
همچنین به آن تقسیم عدد صحیح نیز گفته میشود. برای عملوندهایی از نوع int، نتیجه از نوع int است. برای عملوندهایی از نوع float، نتیجه از نوع float است. در حالت کلی، نتیجه یک عدد صحیح کامل است، هرچند نوع نتیجه لزوماً int نیست. نتیجه همیشه به سمت منفی بینهایت گرد میشود: 1//2 برابر با 0 است، (-1)//2 برابر با -1 است، 1//(-2) برابر با -1 است و (-1)//(-2) برابر با 0 است.
برای اعداد مختلط کاربرد ندارد. در عوض، در صورت مناسب بودن، با استفاده از abs() آنها را به اعداد اعشاری تبدیل کنید.
تبدیل از float به int به روش قطع انجام میشود و بخش اعشاری را حذف میکند. برای تبدیلهای جایگزین، توابع math.floor() و math.ceil() را ببینید.
float همچنین رشتههای "nan" و "inf" را با پیشوند اختیاری "+" یا "-" برای عدد نیست (NaN) و بینهایت مثبت یا منفی میپذیرد.
پایتون pow(0, 0) و 0 ** 0 را برابر با 1 تعریف میکند، همانگونه که در زبانهای برنامهنویسی رایج است.
مقادیر لفظی عددی (numeric literals) پذیرفتهشده شامل رقمهای 0 تا 9 یا هر معادل یونیکدی آنها هستند (نقطههای کد (code points) دارای ویژگی Nd).
برای فهرست کامل نقطههای کد دارای ویژگی Nd به استاندارد یونیکد مراجعه کنید.
همهی انواع numbers.Real (int و float) همچنین عملیات زیر را نیز شامل میشوند:
عملیات |
نتیجه |
|---|---|
x قطعشده به |
|
x گرد شده به n رقم، با گرد کردن نیم به زوج. اگر n حذف شود، به طور پیشفرض ۰ است. |
|
بزرگترین |
|
کوچکترین |
برای عملیات عددی بیشتر، ماژولهای math و cmath را ببینید.
عملیات بیتی تنها برای اعداد صحیح معنا دارند. نتیجهی عملیات بیتی چنان محاسبه میشود که گویی در مکمل دو و با تعداد نامتناهی بیت علامت انجام شده است.
اولویت تمام عملگرهای بیتی دودویی از عملیات عددی پایینتر و از مقایسهها بالاتر است؛ عملگر یکانی ~ اولویتی برابر با سایر عملگرهای عددی یکانی (+ و -) دارد.
این جدول عملیات بیتی را به ترتیب اولویت صعودی فهرست میکند:
عملیات |
نتیجه |
یادداشتها |
|---|---|---|
|
یا (or) بیتیِ x و y |
(4) |
|
یای انحصاری بیتی (exclusive or) x و y |
(4) |
|
و (and) بیتیِ x و y |
(4) |
|
x به اندازهی n بیت به چپ منتقل شده است |
(1)(2) |
|
x به اندازهی n بیت به سمت راست منتقل شده |
(1)(3) |
|
بیتهای x وارونهشده |
یادداشتها:
شمارشهای انتقال (shift) منفی غیرمجاز هستند و باعث میشوند که یک ValueError پرتاب شود.
انتقال به چپ به اندازهی n بیت معادل ضرب در pow(2, n) است.
یک انتقال به راست به اندازهی n بیت معادل تقسیم کف بر pow(2, n) است.
انجام این محاسبات با دستکم یک بیت اضافی برای بسط علامت در یک نمایش متناهی مکمل دو (پهنای بیت کاری 1 + max(x.bit_length(), y.bit_length()) یا بیشتر) برای بهدستآوردن همان نتیجهای که گویی تعداد بینهایتی بیت علامت وجود دارد، کافی است.
نوع int numbers.Integral، یعنی کلاس پایه انتزاعی، را پیادهسازی میکند. علاوه بر این، چند متد دیگر نیز ارائه میدهد:
بازگرداندن تعداد بیتهای لازم برای نمایش یک عدد صحیح در مبنای دو، بدون احتساب علامت و صفرهای ابتدایی:
>>> n = -37 >>> bin(n) '-0b100101' >>> n.bit_length() 6
دقیقتر بگوییم، اگر x ناصفر باشد، آنگاه x.bit_length() تنها عدد صحیح مثبت k است که 2**(k-1) <= abs(x) < 2**k. به بیان معادل، وقتی abs(x) به اندازه کافی کوچک باشد که لگاریتم آن بهدرستی گرد شود، آنگاه k = 1 + int(log(abs(x), 2)). اگر x صفر باشد، آنگاه x.bit_length() مقدار 0 را برمیگرداند.
معادل است با:
def bit_length(self): s = bin(self) # binary representation: bin(-37) --> '-0b100101' s = s.lstrip('-0b') # remove leading zeros and minus sign return len(s) # len('100101') --> 6
اضافه شده در نسخهی 3.1.
تعداد یکها در نمایش دودویی قدر مطلق عدد صحیح را بازمیگرداند. این عمل با نام شمارش جمعیت (population count) نیز شناخته میشود. مثال:
>>> n = 19 >>> bin(n) '0b10011' >>> n.bit_count() 3 >>> (-n).bit_count() 3
معادل است با:
def bit_count(self): return bin(self).count("1")
اضافه شده در نسخهی 3.10.
آرایهای از بایتها را برمیگرداند که یک عدد صحیح را نمایش میدهد.
>>> (1024).to_bytes(2, byteorder='big') b'\x04\x00' >>> (1024).to_bytes(10, byteorder='big') b'\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00' >>> (-1024).to_bytes(10, byteorder='big', signed=True) b'\xff\xff\xff\xff\xff\xff\xff\xff\xfc\x00' >>> x = 1000 >>> x.to_bytes((x.bit_length() + 7) // 8, byteorder='little') b'\xe8\x03'
عدد صحیح با استفاده از length بایت نمایش داده میشود و پیشفرض آن ۱ است. اگر عدد صحیح با تعداد بایتهای دادهشده قابل نمایش نباشد، یک OverflowError پرتاب میشود.
آرگومان byteorder ترتیب بایت مورد استفاده برای نمایش عدد صحیح را تعیین میکند و پیشفرض آن "big" است. اگر byteorder برابر با "big" باشد، پرارزشترین بایت در ابتدای آرایه بایتی قرار میگیرد. اگر byteorder برابر با "little" باشد، پرارزشترین بایت در انتهای آرایه بایتی قرار میگیرد.
آرگومان signed تعیین میکند که آیا از مکمل دو برای نمایش عدد صحیح استفاده میشود یا خیر. اگر signed برابر با False باشد و یک عدد صحیح منفی داده شود، استثنای OverflowError پرتاب میشود. مقدار پیشفرض برای signed برابر با False است.
میتوان از مقادیر پیشفرض برای تبدیل راحتِ یک عدد صحیح به یک شیء بایت تکبایتی استفاده کرد:
>>> (65).to_bytes() b'A'
با این حال، هنگام استفاده از آرگومانهای پیشفرض، سعی نکنید مقداری بزرگتر از ۲۵۵ را تبدیل کنید، در غیر این صورت یک OverflowError دریافت میکنید.
معادل است با:
def to_bytes(n, length=1, byteorder='big', signed=False): if byteorder == 'little': order = range(length) elif byteorder == 'big': order = reversed(range(length)) else: raise ValueError("byteorder must be either 'little' or 'big'") return bytes((n >> i*8) & 0xff for i in order)
اضافه شده در نسخهی 3.2.
تغییر یافته در نسخهی 3.11: مقادیر پیشفرض برای آرگومانهای length و byteorder افزوده شد.
عدد صحیح نمایشدادهشده توسط آرایهای از بایتهای دادهشده را بازمیگرداند.
>>> int.from_bytes(b'\x00\x10', byteorder='big') 16 >>> int.from_bytes(b'\x00\x10', byteorder='little') 4096 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=True) -1024 >>> int.from_bytes(b'\xfc\x00', byteorder='big', signed=False) 64512 >>> int.from_bytes([255, 0, 0], byteorder='big') 16711680
آرگومان bytes باید یا یک bytes-like object باشد یا یک پیمایشپذیر که بایت تولید میکند.
آرگومان byteorder ترتیب بایتی را که برای نمایش عدد صحیح به کار میرود تعیین میکند و پیشفرض آن "big" است. اگر byteorder برابر با "big" باشد، بااهمیتترین بایت در ابتدای آرایه بایت قرار میگیرد. اگر byteorder برابر با "little" باشد، بااهمیتترین بایت در انتهای آرایه بایت قرار میگیرد. برای درخواست ترتیب بایت بومی سیستم میزبان، از sys.byteorder بهعنوان مقدار ترتیب بایت استفاده کنید.
آرگومان signed نشان میدهد که آیا از مکمل دو برای نمایش عدد صحیح استفاده میشود یا خیر.
معادل است با:
def from_bytes(bytes, byteorder='big', signed=False): if byteorder == 'little': little_ordered = list(bytes) elif byteorder == 'big': little_ordered = list(reversed(bytes)) else: raise ValueError("byteorder must be either 'little' or 'big'") n = sum(b << i*8 for i, b in enumerate(little_ordered)) if signed and little_ordered and (little_ordered[-1] & 0x80): n -= 1 << 8*len(little_ordered) return n
اضافه شده در نسخهی 3.2.
تغییر یافته در نسخهی 3.11: مقدار پیشفرض برای آرگومان byteorder اضافه شد.
جفتی از اعداد صحیح را بازمیگرداند که نسبت آن با عدد صحیح اصلی برابر است و مخرجی مثبت دارد. نسبت صحیحِ اعداد صحیح (اعداد حسابی) همیشه خودِ عدد صحیح بهعنوان صورت کسر و 1 بهعنوان مخرج است.
اضافه شده در نسخهی 3.8.
True را برمیگرداند. برای سازگاری نوعدهی اردکی با float.is_integer() وجود دارد.
اضافه شده در نسخهی 3.12.
نوع float، کلاس پایه انتزاعی numbers.Real را پیادهسازی میکند. float همچنین متدهای اضافی زیر را دارد.
متد کلاس برای برگرداندن یک عدد ممیز شناور که از یک عدد x ساخته شده است.
اگر آرگومان یک عدد صحیح یا یک عدد ممیز شناور باشد، عددی ممیز شناور با همان مقدار (در حد دقت ممیز شناور پایتون) بازگردانده میشود. اگر آرگومان خارج از محدوده یک float پایتون باشد، استثنای OverflowError پرتاب میشود.
برای یک شیء عمومی پایتون x، float.from_number(x) کار را به x.__float__() واگذار میکند. اگر __float__() تعریف نشده باشد، آنگاه به __index__() رجوع میکند.
اضافه شده در نسخهی 3.14.
جفتی از اعداد صحیح برمیگرداند که نسبت آنها دقیقاً برابر با عدد اعشاری اصلی است. این نسبت سادهشده است و مخرج آن مثبت است. برای بینهایتها استثنای OverflowError و برای NaNها استثنای ValueError پرتاب میکند.
اگر نمونهی اعشاری متناهی باشد و مقدار صحیح داشته باشد، True و در غیر این صورت False برمیگرداند:
>>> (-2.0).is_integer() True >>> (3.2).is_integer() False
دو متد از تبدیل به و از رشتههای مبنای شانزده پشتیبانی میکنند. چون مقادیر float پایتون بهصورت داخلی به شکل اعداد دودویی ذخیره میشوند، تبدیل یک float به یک رشتهی دهدهی یا برعکس معمولاً با یک خطای کوچک گرد کردن همراه است. در مقابل، رشتههای مبنای شانزده امکان نمایش و تعیین دقیق اعداد ممیز شناور را فراهم میکنند. این موضوع میتواند هنگام اشکالزدایی و در کارهای عددی مفید باشد.
نمایشی از یک عدد ممیز شناور را بهصورت رشتهای در مبنای شانزده بازمیگرداند. برای اعداد ممیز شناور متناهی، این نمایش همیشه شامل یک 0x در ابتدا و یک p و توان در انتها خواهد بود.
متد کلاس برای بازگرداندن عدد اعشاری که با رشتهی مبنای شانزده s نمایش داده میشود. رشتهی s میتواند فاصلههای خالی در ابتدا و انتها داشته باشد.
توجه داشته باشید که float.hex() یک متد نمونه است، در حالی که float.fromhex() یک متد کلاس است.
یک رشته مبنای شانزده به شکل زیر است:
[sign] ['0x'] integer ['.' fraction] ['p' exponent]
در اینجا sign اختیاری میتواند + یا - باشد. integer و fraction رشتههایی از ارقام مبنای شانزده هستند و exponent یک عدد صحیح دهدهی با یک علامت پیشروِ اختیاری است. بزرگی و کوچکی حروف اهمیتی ندارد و باید حداقل یک رقم مبنای شانزده در عدد صحیح یا کسر وجود داشته باشد. این سینتکس شبیه به سینتکسِ مشخصشده در بخش ۶.۴.۴.۲ از استاندارد C99 است و همچنین به سینتکسِ استفادهشده در جاوا ۱.۵ به بعد. بهویژه، خروجیِ float.hex() بهعنوان یک لفظیِ اعشاریِ مبنای شانزده در کد C یا جاوا قابلاستفاده است و رشتههای مبنای شانزده تولیدشده توسط نویسهِ قالب %a زبان C یا Double.toHexString جاوا توسط float.fromhex() پذیرفته میشوند.
توجه داشته باشید که توان بهصورت مبنای ده و نه مبنای شانزده نوشته میشود، و اینکه این توان، توانی از ۲ را مشخص میکند که در آن ضریب ضرب میشود. برای مثال، رشتهی مبنای شانزده 0x3.a7p10 عدد ممیز شناور (3 + 10./16 + 7./16**2) * 2.0**10 یا همان 3740.0 را بازنمایی میکند:
>>> float.fromhex('0x3.a7p10') 3740.0
اعمال تبدیل معکوس روی 3740.0 رشتهای دیگر با مبنای شانزده به دست میدهد که همان عدد را نمایش میدهد:
>>> float.hex(3740.0) '0x1.d380000000000p+11'
نوع complex کلاس پایه انتزاعی numbers.Complex را پیادهسازی میکند. complex همچنین متدهای اضافی زیر را نیز دارد.
متد کلاس برای تبدیل یک عدد به یک عدد مختلط.
برای یک شیء عمومی پایتون x، complex.from_number(x) به x.__complex__() واگذاری میکند. اگر __complex__() تعریف نشده باشد، آنگاه به __float__() روی میآورد. اگر __float__() تعریف نشده باشد، آنگاه به __index__() روی میآورد.
اضافه شده در نسخهی 3.14.
برای اعداد x و y که ممکن است از نوعهای مختلف باشند، الزامی وجود دارد مبنی بر اینکه هرگاه x == y باشد، hash(x) == hash(y) نیز برقرار باشد (برای جزئیات بیشتر، مستندات متد __hash__() را ببینید). برای سهولت پیادهسازی و کارایی در میان نوعهای عددی گوناگون (از جمله int، float، decimal.Decimal و fractions.Fraction) هش پایتون برای نوعهای عددی بر پایه یک تابع ریاضی واحد استوار است که برای هر عدد گویا تعریف شده و بنابراین بر همه نمونههای int و fractions.Fraction و همه نمونههای متناهی float و decimal.Decimal اعمال میشود. در اصل، این تابع بهصورت کاهش به پیمانهی P برای یک عدد اول ثابت P داده میشود. مقدار P بهعنوان ویژگی modulus از sys.hash_info در اختیار پایتون قرار میگیرد.
در حال حاضر، عدد اول استفادهشده روی ماشینهایی که نوع long زبان C آنها ۳۲ بیتی است، P = 2**31 - 1 و روی ماشینهایی که نوع long زبان C آنها ۶۴ بیتی است، P = 2**61 - 1 میباشد.
در اینجا قواعد به تفصیل آمده است:
اگر x = m / n یک عدد گویای نامنفی باشد و n بر P بخشپذیر نباشد، hash(x) را به صورت m * invmod(n, P) % P تعریف کنید، که در آن invmod(n, P) وارون n به پیمانه P را میدهد.
اگر x = m / n یک عدد گویای نامنفی باشد و n بر P بخشپذیر باشد (اما m چنین نباشد)، آنگاه n وارونی به پیمانه P ندارد و قاعدهی بالا اعمال نمیشود؛ در این حالت hash(x) را برابر مقدار ثابت sys.hash_info.inf تعریف کنید.
اگر x = m / n یک عدد گویای منفی باشد، hash(x) را بهصورت -hash(-x) تعریف کنید. اگر هش حاصل -1 باشد، آن را با -2 جایگزین کنید.
مقادیر خاص sys.hash_info.inf و -sys.hash_info.inf بهترتیب بهعنوان مقادیر هش برای بینهایت مثبت یا بینهایت منفی استفاده میشوند.
برای یک عدد complex مانند z، مقادیر هش بخش حقیقی و بخش موهومی با محاسبهی hash(z.real) + sys.hash_info.imag * hash(z.imag) ترکیب میشوند و نتیجه به پیمانهی 2**sys.hash_info.width کاهش مییابد تا در range(-2**(sys.hash_info.width - 1), 2**(sys.hash_info.width - 1)) قرار گیرد. باز هم، اگر نتیجه -1 باشد، با -2 جایگزین میشود.
برای روشن شدن قواعد بالا، در اینجا نمونهای از کد پایتون آمده است که معادل hash توکار بوده و برای محاسبهی هش یک عدد گویا، float یا complex به کار میرود:
import sys, math def hash_fraction(m, n): """Compute the hash of a rational number m / n. Assumes m and n are integers, with n positive. Equivalent to hash(fractions.Fraction(m, n)). """ P = sys.hash_info.modulus # Remove common factors of P. (Unnecessary if m and n already coprime.) while m % P == n % P == 0: m, n = m // P, n // P if n % P == 0: hash_value = sys.hash_info.inf else: # Fermat's Little Theorem: pow(n, P-1, P) is 1, so # pow(n, P-2, P) gives the inverse of n modulo P. hash_value = (abs(m) % P) * pow(n, P - 2, P) % P if m < 0: hash_value = -hash_value if hash_value == -1: hash_value = -2 return hash_value def hash_float(x): """Compute the hash of a float x.""" if math.isnan(x): return object.__hash__(x) elif math.isinf(x): return sys.hash_info.inf if x > 0 else -sys.hash_info.inf else: return hash_fraction(*x.as_integer_ratio()) def hash_complex(z): """Compute the hash of a complex number z.""" hash_value = hash_float(z.real) + sys.hash_info.imag * hash_float(z.imag) # do a signed reduction modulo 2**sys.hash_info.width M = 2**(sys.hash_info.width - 1) hash_value = (hash_value & (M - 1)) - (hash_value & M) if hash_value == -1: hash_value = -2 return hash_value
bool¶بولیها مقادیر درستی را نشان میدهند. نوع bool دقیقاً دو نمونهی ثابت دارد: True و False.
تابع توکار bool() هر مقداری را به یک مقدار بولی تبدیل میکند، اگر بتوان آن مقدار را بهعنوان یک مقدار درستی تفسیر کرد (بخش صدق در بالا را ببینید).
برای عملیات منطقی، از عملگرهای بولی and، or و not استفاده کنید. هنگامی که عملگرهای بیتی &، | و ^ را روی دو مقدار بولی اعمال میکنید، آنها یک bool معادل عملیات منطقی «and»، «or» و «xor» برمیگردانند. با این حال، بهتر است عملگرهای منطقی and، or و != را به &، | و ^ ترجیح دهید.
منسوخ شده از نسخهی 3.12: استفاده از عملگر وارونسازی بیتی ~ منسوخ شده است و در Python 3.16 خطایی پرتاب خواهد کرد.
bool زیرکلاسی از int است (به انواع عددی --- int، float، complex مراجعه کنید). در بسیاری از زمینههای عددی، False و True مانند اعداد صحیح ۰ و ۱ رفتار میکنند. با این حال، تکیه بر این موضوع توصیه نمیشود؛ به جای آن، صریحاً با استفاده از int() تبدیل کنید.
پایتون از مفهومی به نام پیمایش روی ظرفها (containers) پشتیبانی میکند. این مفهوم با استفاده از دو متد متمایز پیادهسازی میشود؛ از این متدها استفاده میشود تا کلاسهای تعریفشده توسط کاربر بتوانند از پیمایش پشتیبانی کنند. دنبالهها، که در ادامه با جزئیات بیشتری توضیح داده میشوند، همواره از متدهای تکرار پشتیبانی میکنند.
برای آنکه اشیاء ظرف بتوانند پشتیبانی از پیمایشپذیر را فراهم کنند، باید یک متد تعریف شود:
یک شیء پیمایشگر بازمیگرداند. این شیء موظف است از پروتکل پیمایشگری که در ادامه شرح داده شده است پشتیبانی کند. اگر یک ظرف از انواع مختلف تکرار پشتیبانی میکند، میتوان متدهای اضافیای ارائه داد که بهطور خاص برای آن انواع تکرار، پیمایشگر درخواست کنند. (نمونهای از شیءای که از چند شکل پیمایش پشتیبانی میکند، ساختاری درختی است که هم پیمایش عرضی (breadth-first) و هم پیمایش عمقی (depth-first) را پشتیبانی میکند.) این متد متناظر با جایگاه tp_iter در ساختار نوع اشیاء پایتون در Python/C API است.
خود اشیاء پیمایشگر ملزم به پشتیبانی از دو متد زیر هستند که در مجموع پروتکل پیمایشگر (iterator protocol) را تشکیل میدهند:
خودِ شیء پیمایشگر را بازمیگرداند. این امر برای آن ضروری است که بتوان هم از ظرفها و هم از پیمایشگرها همراه با دستورهای for و in استفاده کرد. این متد متناظر با جایگاه tp_iter از ساختار نوع اشیاء پایتون در Python/C API است.
آیتم بعدی را از پیمایشگر برگردانید. اگر آیتمهای بیشتری وجود نداشته باشند، استثنای StopIteration را پرتاب کنید. این متد متناظر با جایگاه tp_iternext در ساختار نوع اشیاء پایتون در API پایتون/C است.
پایتون چندین شیء پیمایشگر تعریف میکند تا از پیمایش روی انواع دنبالههای عمومی و خاص، دیکشنریها و سایر شکلهای تخصصیتر پشتیبانی کند. انواع خاص، صرفنظر از پیادهسازی پروتکل پیمایشگر در آنها، اهمیتی ندارند.
بهمحض اینکه متد __next__() یک پیمایشگر استثنای StopIteration را پرتاب کند، باید به انجام همین کار در فراخوانیهای بعدی ادامه دهد. پیادهسازیهایی که از این ویژگی پیروی نمیکنند، معیوب تلقی میشوند.
تولیدگرهای پایتون — یا به عبارت دقیقتر، توابع تولیدگر و پیمایشگرهای تولیدگر — راهی مناسب برای پیادهسازی پروتکل پیمایشگر فراهم میکنند.
تابعی که شامل یک یا چند عبارت yield باشد، یک تابع تولیدگر است. برای مثال:
>>> def count_to_three(): ... yield 0 ... yield 1 ... yield 2 ... yield 3
توابع تولیدگر دقیقاً مانند توابع تعریفشده توسط کاربر معمولی رفتار میکنند (برای مثال، ویژگیهای یکسانی دارند)، با این تفاوت که فراخوانی یک تابع تولیدگر، یک پیمایشگر تولیدگر را برمیگرداند:
>>> count_to_three() <generator object count_to_three at 0x7f33a2305000>
پیمایش یک پیمایشگر تولیدگر، کد تابع تولیدگر زیربنایی را اجرا میکند و به نوبه خود هر مقدار تولیدشده با yieldرا ایجاد میکند:
>>> for number in count_to_three(): ... print(number) 0 1 2 3 >>> list(count_to_three()) [0, 1, 2, 3]
یکی از کاربردهای رایج توابع تولیدگر، پیادهسازی متد __iter__() از شیءهای پیمایشپذیر سفارشی است. برای مثال:
>>> class CardDeck: ... def __iter__(self): ... yield 'three of clubs' ... yield 'ace of hearts' >>> list(CardDeck()) ['three of clubs', 'ace of hearts']
پیمایشگرهای تولیدگر پروتکل پیمایشگر را پیادهسازی میکنند. پیمایش آنها باعث اجرای تابع تولیدگر زیربنایی میشود.
اجرای یک تابع تولیدگر را آغاز میکند یا آن را در عبارت yield که تابع در آن متوقف شده است، از سر میگیرد. هنگامی که یک تابع تولیدگر با متد __next__() از سر گرفته میشود، عبارت yield فعلی همیشه به None ارزیابی میشود. سپس اجرا به عبارت yield بعدی ادامه مییابد، جایی که تولیدگر دوباره متوقف میشود و مقدار عبارت پس از کلیدواژه yield به فراخواننده متد __next__() برگردانده میشود. اگر تولیدگر بدون تولید مقدار دیگری خارج شود، متد __next__() یک استثنای StopIteration را بالا میآورد که نشاندهندهی اتمام پیمایش است.
این متد معمولاً بهصورت ضمنی فراخوانی میشود، برای مثال توسط یک حلقهی for یا توسط تابع توکار next().
پیمایشگرهای تولیدگر نسبت به پیمایشگرهای عام، چند متد بیشتر دارند که میتوان از آنها برای کنترل اجرای تابع تولیدگر زیربنایی استفاده کرد:
یک مقدار را به درون تابع تولیدگر «ارسال» میکند: آرگومان value به نتیجهی عبارت yield فعلی تبدیل میشود.
در غیر این صورت، این متد مانند __next__() عمل میکند: تابع زیربنایی را از سر میگیرد و یا مقدار تولیدشدهی بعدی را برمیگرداند یا استثنای StopIteration را بالا میآورد.
هنگامی که متد send() برای شروع تولیدگر فراخوانی میشود، باید با آرگومان None فراخوانی شود، زیرا هیچ عبارت yield فعلی وجود ندارد که بتواند مقدار را دریافت کند.
یک استثنا در نقطهای که تولیدگر در حال حاضر معلق است، ایجاد میکند.
در غیر این صورت، این متد درست مانند __next__() عمل میکند: تابع زیرین را از سر میگیرد و یا مقدار تولیدشدهی بعدی را برمیگرداند یا استثنای StopIteration را ایجاد میکند. اگر تابع تولیدگر استثنای ارسالشده را جذب نکند، یا استثنای متفاوتی را ایجاد کند، آن استثنا به فراخواننده منتقل میشود.
هنگامی که متد throw() برای شروع تولیدگر فراخوانی میشود، تولیدگر بلافاصله خارج میشود (یعنی فراخوانیهای بعدی به __next__() استثنای StopIteration را ایجاد خواهند کرد) و استثنای پرتابشده به فراخوانندهی متد throw() منتقل میشود.
در استفادهی معمول، این متد با یک آرگومان، یعنی یک نمونهی استثنا، فراخوانی میشود که مشابه نحوهی استفاده از کلیدواژهی raise است.
با این حال، برای سازگاری با نسخههای قبلی، امضای دوم پشتیبانی میشود که از قراردادی در نسخههای قدیمیتر پایتون پیرو میکند. آرگومان type باید یک کلاس استثنا باشد و value باید یک نمونهی استثنا باشد. اگر value فراهم نشده باشد، سازندهی type برای دریافت یک نمونه فراخوانی میشود. اگر traceback فراهم شده باشد، روی استثنا تنظیم میشود، در غیر این صورت هر ویژگی __traceback__ موجود که در value ذخیره شده است ممکن است پاک شود.
تغییر یافته در نسخهی 3.12: امضای دوم (type[, value[, traceback]]) منسوخ شده است و ممکن است در نسخهی آیندهی پایتون حذف شود.
یک استثنای GeneratorExit را در نقطهای که تابع تولیدگر در حال حاضر معلق است ایجاد میکند (معادل فراخوانی throw(GeneratorExit)).
اگر تابع تولیدگر پیشتر خارج شده باشد (بهدلیل یک استثنا یا بازگشت عادی)، یا با گرفتن نکردن استثنا، GeneratorExit را بالا بیاورد، متد close() مقدار None را برمیگرداند. اگر تولیدگر مقداری را تولید کند، یک RuntimeError بالا برده میشود. اگر تولیدگر هر استثنای دیگری را بالا بیاورد، به فراخواننده منتشر میشود. اگر یک تولیدگر هنگام بسته شدن مقداری را برگرداند، آن مقدار توسط close() برگردانده میشود.
هنگامی که یک پیمایشگر تولیدگر پیش از خروج زبالهروبی شود، close() بهطور خودکار فراخوانی میشود.
تغییر یافته در نسخهی 3.13: اگر یک تولیدگر هنگام بسته شدن مقداری را برگرداند، آن مقدار توسط close() برگردانده میشود. پیشتر، مقدار None را برمیگرداند.
فراخوانی هر یک از متدهای تولیدگر (__next__()، send()، throw()، close()) در حالی که یکی از این متدها در حال اجرا است، یک استثنای ValueError ایجاد میکند.
این زیربخش متدهای یک پیمایشگر تولیدگر ناهمگام را توصیف میکند که برای کنترل اجرای یک تابع تولیدگر ناهمگام استفاده میشوند.
یک انتظارپذیر برمیگرداند که وقتی اجرا میشود، شروع به اجرای تابع تولیدگر ناهمگام میکند یا آن را در عبارت yield که در آن تابع در حال حاضر معلق است، از سر میگیرد. هنگامی که یک تابع تولیدگر ناهمگام با یک متد __anext__() از سر گرفته میشود، عبارت yield فعلی در شیء انتظارپذیر بازگرداندهشده همیشه به None ارزیابی میشود که هنگام اجرا به عبارت yield بعدی ادامه خواهد داد. مقدار عبارت پس از کلیدواژهی yield برابر با مقدار استثنای StopIteration است که توسط همروال در حال تکمیل ایجاد میشود. اگر تولیدگر ناهمگام بدون تولید مقدار دیگری خارج شود، شیء انتظارپذیر به جای آن یک استثنای StopAsyncIteration ایجاد میکند که نشان میدهد پیمایش ناهمگام کامل شده است.
این متد معمولاً بهطور ضمنی توسط یک حلقهی async for یا توسط تابع توکار anext() فراخوانی میشود.
پیمایشگرهای تولیدگر ناهمگام متدهای بیشتری نسبت به پیمایشگرهای ناهمگام عام دارند که میتوانند برای کنترل اجرای تابع تولیدگر زیرین استفاده شوند:
یک شیء انتظارپذیر برمیگرداند که وقتی اجرا میشود، مقداری را به درون تابع تولیدگر ناهمگام زیرین «ارسال» میکند: آرگومان value به نتیجهی عبارت yield فعلی تبدیل میشود.
در غیر این صورت، این متد مانند __anext__() عمل میکند: هنگامی که شیء انتظارپذیر بازگرداندهشده اجرا میشود، تابع زیرین را از سر میگیرد و یا مقدار تولیدشدهی بعدی را به عنوان مقدار استثنای ایجادشدهی StopIteration برمیگرداند یا StopAsyncIteration را ایجاد میکند.
هنگامی که متد asend() برای شروع تولیدگر ناهمگام فراخوانی میشود، باید با آرگومان None فراخوانی شود، زیرا هیچ عبارت yieldی وجود ندارد که بتواند مقدار را دریافت کند.
یک شیء انتظارپذیر (awaitable) برمیگرداند که پس از اجرا شدن، در نقطهای که تابع تولیدگر ناهمگام زیرین در حال حاضر معلق است، یک استثنا ایجاد میکند.
در غیر این صورت، این متد مانند __anext__() رفتار میکند: وقتی شیء انتظارپذیرِ برگرداندهشده اجرا میشود، تابع زیرین را (با یک استثنای ایجادشده) از سر میگیرد و یا مقدار تولیدشدهی بعدی را به عنوان مقدار StopIteration ایجادشده برمیگرداند، یا استثنای StopAsyncIteration را ایجاد میکند. اگر تابع زیرین استثنای ارسالشده را جذب نکند، یا استثنای متفاوتی را ایجاد کند، آنگاه هنگام اجرای شیء انتظارپذیر، آن استثنا به فراخوانندهی شیء انتظارپذیر منتقل میشود.
هنگامی که athrow() برای شروع تولیدگر فراخوانی میشود، تولیدگر با اجرای شیء انتظارپذیر خارج میشود (یعنی نتایج بعدیِ حاصل از __anext__() هنگام اجرا استثنای StopAsyncIteration را ایجاد خواهند کرد) و استثنای پرتابشده به فراخوانندهی شیء انتظارپذیر منتقل میشود.
در استفادهی معمول، این متد با یک آرگومان، یعنی یک نمونهی استثنا، فراخوانی میشود که مشابه نحوهی استفاده از کلیدواژهی raise است.
با این حال، به منظور سازگاری با نسخههای قبلی، امضای دوم پشتیبانی میشود. یک نمونه استثنا از سه آرگومان دقیقاً به همان روش generator.throw() ایجاد میشود.
تغییر یافته در نسخهی 3.12: امضای دوم (type[, value[, traceback]]) منسوخ شده است و ممکن است در نسخهی آیندهی پایتون حذف شود.
یک شیء انتظارپذیر (awaitable) برمیگرداند که هنگام اجرا، یک استثنای GeneratorExit را به درون تابع تولیدگر ناهمگام زیرین در نقطهای که در حال حاضر معلق است پرتاب میکند (معادل فراخوانی athrow(GeneratorExit)).
اگر تابع تولیدگر ناهمگام در این صورت به زیبایی خارج شود، از قبل بسته شده باشد، یا GeneratorExit را ایجاد کند (با جذب نکردن استثنا)، آنگاه شیء انتظارپذیرِ برگرداندهشده یک استثنای StopIteration ایجاد خواهد کرد. هر شیء انتظارپذیرِ دیگری که با فراخوانیهای بعدی به تولیدگر ناهمگام برگردانده شود، استثنای StopAsyncIteration را ایجاد خواهد کرد.
اگر تولیدگر ناهمگام مقداری را تولید کند، یک استثنای RuntimeError توسط شیء انتظارپذیر ایجاد میشود. اگر تولیدگر ناهمگام هر استثنای دیگری را ایجاد کند، آن استثنا به فراخوانندهی شیء انتظارپذیر منتقل میشود.
اگر تولیدگر ناهمگام در اثر یک استثنا یا خروج عادی از قبل خارج شده باشد، فراخوانیهای بعدی به aclose() یک شیء انتظارپذیر برمیگردانند که هیچ کاری انجام نمیدهد.
list، tuple، range¶سه نوع دنبالهی پایه وجود دارد: فهرستها، تاپلها و اشیای range. انواع دنبالهی دیگری که برای پردازش دادههای دودویی و رشتههای متنی طراحی شدهاند، در بخشهای اختصاصی توضیح داده شدهاند.
عملیاتهای جدول زیر توسط بیشتر نوعهای دنباله، هم تغییرپذیر و هم تغییرناپذیر، پشتیبانی میشوند. کلاس پایه انتزاعی (ABC) collections.abc.Sequence فراهم شده است تا پیادهسازی صحیح این عملیاتها روی نوعهای دنباله سفارشی آسانتر شود.
این جدول عملیات دنباله را به ترتیب صعودی اولویت فهرست میکند. در این جدول، s و t دنبالههایی از یک نوع هستند، n، i، j و k اعداد صحیح هستند و x شیء دلخواهی است که هر محدودیت نوع و مقدار اعمالشده توسط s را برآورده میکند.
عملیاتهای in و not in همان اولویت عملیات مقایسه را دارند. عملیاتهای + (الحاق) و * (تکرار) همان اولویت عملیات عددی متناظر را دارند. [3]
برای هزینههای عملیاتهای مختلف دنباله، به پیچیدگی زمانی عملیاتها روی انواع توکار مراجعه کنید.
عملیات |
نتیجه |
یادداشتها |
|---|---|---|
|
اگر یکی از آیتمهای s برابر با x باشد، |
(1) |
|
اگر یکی از آیتمهای s با x برابر باشد، |
(1) |
|
الحاق s و t |
(6)(7) |
|
معادل افزودن s به خودش n بار است |
(2)(7) |
|
iامین آیتم s، مبدأ ۰ |
(3)(8) |
|
اسلایسی از s از i تا j |
(3)(4) |
|
اسلایسی از s از i تا j با گام k |
(3)(5) |
|
طول s |
|
|
کوچکترین آیتم s |
|
|
بزرگترین آیتم s |
دنبالههایی از یک نوع نیز از مقایسه پشتیبانی میکنند. بهطور خاص، تاپلها و فهرستها با مقایسهی المانهای متناظر، بهصورت لغتنامهای مقایسه میشوند. این بدان معناست که برای برابر بودن در مقایسه، هر المان باید در مقایسه برابر باشد و دو دنباله باید از یک نوع بوده و طول یکسانی داشته باشند. (برای جزئیات کامل به مقایسهها در مرجع زبان رجوع کنید.)
پیمایشگرها رو به جلو و معکوس روی دنبالههای تغییرپذیر، با استفاده از یک اندیس به مقادیر دسترسی پیدا میکنند. این اندیس حتی اگر دنباله زیرین تغییر کند، همچنان به پیشروی رو به جلو (یا رو به عقب) ادامه میدهد. پیمایشگر تنها زمانی خاتمه مییابد که با یک IndexError یا یک StopIteration مواجه شود (یا هنگامی که اندیس به زیر صفر کاهش یابد).
یادداشتها:
در حالی که عملیات in و not in در حالت عمومی تنها برای آزمون سادهی شمول به کار میروند، برخی دنبالههای تخصصی (مانند str، bytes و bytearray) همچنین از آنها برای آزمون زیردنباله استفاده میکنند:
>>> "gg" in "eggs" True
مقادیر n کوچکتر از 0 مانند 0 رفتار میشوند (که دنبالهای خالی از همان نوع s تولید میکند). توجه داشته باشید که آیتمهای موجود در دنباله s کپی نمیشوند؛ بلکه چندین بار به آنها ارجاع داده میشود. این موضوع اغلب برنامهنویسان تازهکار پایتون را گرفتار میکند؛ به مثال زیر توجه کنید:
>>> lists = [[]] * 3 >>> lists [[], [], []] >>> lists[0].append(3) >>> lists [[3], [3], [3]]
آنچه رخ داده این است که [[]] فهرستی تکالمانی شامل یک فهرست خالی است؛ بنابراین هر سه المانِ [[]] * 3 ارجاعی به همین یک فهرست خالی هستند. تغییر دادن هر یک از المانهای lists همین یک فهرست را تغییر میدهد. میتوانید به این ترتیب فهرستی از فهرستهای مختلف ایجاد کنید:
>>> lists = [[] for i in range(3)] >>> lists[0].append(3) >>> lists[1].append(5) >>> lists[2].append(7) >>> lists [[3], [5], [7]]
توضیحات بیشتر در مدخل پرسشهای متداول چگونه یک فهرست چندبعدی ایجاد کنم؟ موجود است.
اگر i یا j منفی باشد، اندیس نسبت به انتهای دنبالهی s در نظر گرفته میشود: len(s) + i یا len(s) + j جایگزین میشود. اما توجه داشته باشید که -0 همچنان 0 است.
اسلایس s از i تا j بهعنوان دنبالهای از آیتمهای دارای اندیس k تعریف میشود، بهطوری که i <= k < j.
اگر i ذکر نشده باشد یا None باشد، از 0 استفاده کنید.
اگر j ذکر نشده یا None باشد، از len(s) استفاده میشود.
اگر i یا j کمتر از -len(s) باشد، از 0 استفاده کنید.
اگر i یا j بزرگتر از len(s) باشند، از len(s) استفاده کنید.
اگر i بزرگتر یا مساوی j باشد، اسلایس خالی است.
اسلایس s از i تا j با گام k بهصورت دنبالهای از آیتمها با اندیس x = i + n*k تعریف میشود که در آن 0 <= n < (j-i)/k. به عبارت دیگر، اندیسها i، i+k، i+2*k، i+3*k و به همین ترتیب هستند و با رسیدن به j متوقف میشوند (اما هرگز j را شامل نمیشوند). وقتی k مثبت است، i و j در صورت بزرگتر بودن به len(s) کاهش مییابند. وقتی k منفی است، i و j در صورت بزرگتر بودن به len(s) - 1 کاهش مییابند. اگر i یا j ذکر نشده باشند یا None باشند، به مقادیر «انتها» تبدیل میشوند (اینکه کدام انتها باشد به علامت k بستگی دارد). توجه کنید که k نمیتواند صفر باشد. اگر k برابر None باشد، مانند 1 در نظر گرفته میشود.
الحاق دنبالههای تغییرناپذیر همیشه به یک شیء جدید منجر میشود. این بدان معناست که ساخت یک دنباله از طریق الحاقهای مکرر، هزینه رانتایمی درجه دوم نسبت به طول کل دنباله خواهد داشت. برای دستیابی به هزینه رانتایم خطی، باید به یکی از جایگزینهای زیر روی آورید:
اگر در حال الحاق شیءهای str هستید، میتوانید یک فهرست بسازید و در پایان از str.join() استفاده کنید، یا در غیر این صورت در یک نمونه از io.StringIO بنویسید و پس از اتمام، مقدار آن را بازیابی کنید
اگر در حال الحاق اشیاء bytes هستید، میتوانید به همین ترتیب از bytes.join() یا io.BytesIO استفاده کنید، یا میتوانید الحاق درجا را با یک شیء bytearray انجام دهید. اشیاء bytearray تغییرپذیر هستند و دارای یک سازوکار کارآمد تخصیص بیش از حد هستند
اگر اشیاء tuple را الحاق میکنید، در عوض یک list را گسترش دهید
برای سایر انواع، مستندات کلاس مربوطه را بررسی کنید
برخی از انواع دنباله (مانند range) تنها از دنبالههایی از آیتمها که از الگوهای خاصی پیروی میکنند پشتیبانی میکنند و در نتیجه از الحاق یا تکرار دنباله پشتیبانی نمیکنند.
اگر i خارج از بازهی دنباله باشد، یک IndexError پرتاب میشود.
متدهای دنباله
انواع دنباله همچنین از متدهای زیر پشتیبانی میکنند:
تعداد کل تکرارهای value در sequence را بازمیگرداند.
اندیس اولین وقوع value در sequence را برمیگرداند.
اگر مقدار در دنباله یافت نشود، ValueError پرتاب میشود.
آرگومانهای start یا stop امکان جستجوی کارآمد در زیربخشهایی از دنباله را فراهم میکنند؛ جستجو از start آغاز شده و در stop پایان مییابد. این عمل تقریباً معادل start + sequence[start:stop].index(value) است، فقط بدون آنکه هیچ دادهای کپی شود.
احتیاط
همه انواع دنباله از ارسال آرگومانهای start و stop پشتیبانی نمیکنند.
تنها عملیاتی که انواع دنبالهی تغییرناپذیر بهطور کلی پیادهسازی میکنند و توسط انواع دنبالهی تغییرپذیر نیز پیادهسازی نمیشود، پشتیبانی از تابع توکار hash() است.
این پشتیبانی اجازه میدهد دنبالههای تغییرناپذیر، مانند نمونههای tuple، بهعنوان کلیدهای dict استفاده شوند و در نمونههای set و frozenset ذخیره شوند.
تلاش برای هش کردن یک دنبالهی تغییرناپذیر که حاوی مقادیر هشناپذیر باشد، منجر به TypeError خواهد شد.
عملیاتهای جدول زیر بر روی انواع دنباله تغییرپذیر تعریف شدهاند. برای آسانتر شدن پیادهسازی صحیح این عملیاتها بر روی انواع دنباله سفارشی، کلاس پایه انتزاعی (ABC) collections.abc.MutableSequence فراهم شده است.
در جدول، s نمونهای از یک نوع دنبالهی تغییرپذیر است، t هر شیء پیمایشپذیری است و x شیءی دلخواه است که تمام محدودیتهای نوع و مقدار اعمالشده توسط s را برآورده میکند (برای مثال، bytearray تنها اعداد صحیحی را میپذیرد که محدودیت مقدار 0 <= x <= 255 را برآورده کنند).
عملیات |
نتیجه |
یادداشتها |
|---|---|---|
|
آیتم i از s با x جایگزین میشود |
|
|
آیتم i از s را حذف میکند |
|
|
اسلایسی از s از i تا j با محتوای پیمایشپذیر t جایگزین میشود |
|
|
المانهای |
|
|
المانهای |
(1) |
|
المانهای |
|
|
s را با محتویات t گسترش میدهد (عمدتاً همانند |
|
|
s را با محتوای خود که n بار تکرار شده است بهروزرسانی میکند |
(2) |
یادداشتها:
اگر k برابر با 1 نباشد، t باید همان طول اسلایسی را داشته باشد که جایگزین آن میشود.
مقدار n یک عدد صحیح است، یا شیءای که __index__() را پیادهسازی میکند. مقادیر صفر و منفیِ n دنباله را خالی میکنند. آیتمهای موجود در دنباله کپی نمیشوند؛ بلکه چندین بار به آنها ارجاع داده میشود، همانطور که برای s * n در عملیاتهای رایج دنبالهها توضیح داده شده است.
متدهای دنبالههای تغییرپذیر
انواع دنبالههای تغییرپذیر همچنین از متدهای زیر پشتیبانی میکنند:
value را به انتهای دنباله اضافه میکند. این معادل نوشتن seq[len(seq):len(seq)] = [value] است.
اضافه شده در نسخهی 3.3.
همه آیتمهای دنباله را حذف میکند. این کار معادل نوشتن del sequence[:] است.
اضافه شده در نسخهی 3.3.
یک کپی سطحی از دنباله بسازید. این معادل نوشتن sequence[:] است.
راهنمایی
متد copy() بخشی از MutableSequence ABC نیست، اما بیشتر انواع عینی دنبالههای تغییرپذیر آن را فراهم میکنند.
sequence را با محتوای iterable گسترش میدهد. در بیشتر موارد، این همانند نوشتن seq[len(seq):len(seq)] = iterable است.
مقدار را در دنباله در اندیس دادهشده درج میکند. این معادل نوشتنِ sequence[index:index] = [value] است.
آیتمِ در index را بازیابی کنید و همچنین آن را از sequence حذف کنید. بهصورت پیشفرض، آخرین آیتم در sequence حذف و برگردانده میشود.
اولین آیتمی از دنباله را که در آن sequence[i] == value است، حذف کنید.
اگر مقدار در دنباله یافت نشود، ValueError پرتاب میشود.
آیتمهای دنباله را درجا وارونه میکند. این متد هنگام وارونهکردن یک دنباله بزرگ، صرفهجویی در فضا را حفظ میکند. برای یادآوری به کاربران اینکه این متد از طریق اثر جانبی عمل میکند، مقدار None را بازمیگرداند.
فهرستها دنبالههای تغییرپذیری هستند که معمولاً برای ذخیره مجموعههایی از آیتمهای همگن استفاده میشوند (که میزان دقیق شباهت آنها بسته به کاربرد متفاوت خواهد بود).
فهرستها را میتوان به چند روش ساخت:
استفاده از یک جفت براکت مربع برای نشان دادن فهرست خالی: []
با استفاده از کروشهها و جدا کردن آیتمها با کاما: [a]، [a, b, c]
با استفاده از یک درک فهرستی: [x for x in iterable]
با استفاده از سازندهی نوع: list() یا list(iterable)
سازنده فهرستی میسازد که آیتمهای آن همان آیتمهای iterable و در همان ترتیبِ آنها هستند. iterable میتواند یک دنباله، ظرفی که از پیمایش پشتیبانی میکند، یا یک شیء پیمایشگر باشد. اگر iterable از قبل یک فهرست باشد، نسخهای از آن ساخته شده و بازگردانده میشود؛ مشابه iterable[:]. برای مثال، list('abc') مقدار ['a', 'b', 'c'] را برمیگرداند و list( (1, 2, 3) ) مقدار [1, 2, 3] را برمیگرداند. اگر هیچ آرگومانی داده نشود، سازنده یک فهرست خالی جدید، یعنی []، ایجاد میکند.
بسیاری از عملیات دیگر نیز فهرست تولید میکنند، از جمله تابع توکار sorted().
فهرستها نسبت به نوع آیتمهای خود عام هستند.
فهرستها همهی عملیات دنبالهی مشترک و تغییرپذیر را پیادهسازی میکنند. فهرستها همچنین متد اضافی زیر را فراهم میکنند:
این متد فهرست را درجا مرتب میکند و تنها از مقایسههای < میان آیتمها استفاده میکند. استثناها سرکوب نمیشوند - اگر هر یک از عملیات مقایسه شکست بخورد، تمام عملیات مرتبسازی با شکست مواجه خواهد شد (و به احتمال زیاد فهرست در حالتی تا حدی تغییر یافته باقی خواهد ماند).
sort() دو آرگومان میپذیرد که تنها میتوان آنها را به صورت کلیدواژهای پاس داد (آرگومانهای فقط-کلیدواژهای):
key تابعی با یک آرگومان را مشخص میکند که برای استخراج کلید مقایسه از هر المان فهرست به کار میرود (برای مثال، key=str.lower). کلید متناظر با هر آیتم در فهرست فقط یک بار محاسبه میشود و سپس در تمام فرایند مرتبسازی از آن استفاده میشود. مقدار پیشفرض None بدین معناست که آیتمهای فهرست مستقیماً و بدون محاسبه مقدار کلید جداگانه مرتب میشوند.
ابزار functools.cmp_to_key() برای تبدیل یک تابع cmp به سبک 2.x به یک تابع key در دسترس است.
reverse یک مقدار بولی است. اگر روی True تنظیم شود، المانهای فهرست بهگونهای مرتب میشوند که انگار هر مقایسه معکوس شده باشد.
این متد برای صرفهجویی در فضا هنگام مرتبسازی یک دنبالهی بزرگ، دنباله را درجا تغییر میدهد. برای یادآوری این نکته به کاربران که این متد با اثر جانبی عمل میکند، دنبالهی مرتبشده را برنمیگرداند (برای درخواست صریح یک نمونهی جدید از فهرست مرتبشده از sorted() استفاده کنید).
تضمین میشود که متد sort() پایدار باشد. یک مرتبسازی زمانی پایدار است که تضمین کند ترتیب نسبی عناصری را که در مقایسه برابرند تغییر ندهد --- این برای مرتبسازی در چند گذر مفید است (برای مثال، مرتبسازی بر اساس دپارتمان و سپس بر اساس رتبه حقوقی).
برای مثالهای مرتبسازی و یک آموزش مختصر مرتبسازی، به روشهای مرتبسازی مراجعه کنید.
در حالی که یک فهرست در حال مرتبسازی است، اثر تلاش برای تغییر دادن یا حتی بازرسی کردن آن تعریفنشده است. پیادهسازی C پایتون در تمام این مدت فهرست را خالی نشان میدهد و اگر بتواند تشخیص دهد که فهرست در حین مرتبسازی تغییر داده شده است، ValueError را پرتاب میکند.
همچنین ببینید
برای اطلاعات مفصل درباره تضمینهای ایمنی نخ برای اشیاء list، به ایمنی در برابر نخها برای اشیای فهرست مراجعه کنید.
تاپلهادنبالههای تغییرناپذیری هستند که معمولاً برای ذخیره مجموعههایی از دادههای ناهمگون (مانند تاپلهای ۲تایی تولیدشده توسط تابع توکار enumerate()) به کار میروند. از تاپلها همچنین در مواردی استفاده میشود که به یک دنبالهی تغییرناپذیر از دادههای همگون نیاز باشد (مانند امکان ذخیره شدن در یک نمونه از set یا dict).
تاپلها را میتوان به روشهای گوناگونی ساخت:
استفاده از یک جفت پرانتز برای نشان دادن تاپل خالی: ()
استفاده از یک ویرگول انتهایی برای یک تاپل تکعضوی (singleton tuple): a, یا (a,)
جدا کردن آیتمها با ویرگول: a, b, c یا (a, b, c)
با استفاده از تابع توکار tuple(): tuple() یا tuple(iterable)
سازنده تاپلی میسازد که آیتمهایش با آیتمهای iterable یکسان و به همان ترتیب هستند. iterable میتواند یک دنباله، یک ظرف که از پیمایش پشتیبانی میکند، یا یک شیء پیمایشگر باشد. اگر iterable از قبل خودش یک تاپل باشد، بدون تغییر بازگردانده میشود. برای مثال، tuple('abc') مقدار ('a', 'b', 'c') را برمیگرداند و tuple( [1, 2, 3] ) مقدار (1, 2, 3) را برمیگرداند. اگر آرگومانی داده نشود، سازنده یک تاپل خالی جدید، یعنی ()، ایجاد میکند.
توجه داشته باشید که در واقع ویرگول است که تاپل را میسازد، نه پرانتزها. پرانتزها اختیاری هستند، مگر در حالت تاپل خالی، یا زمانی که برای پرهیز از ابهام نحوی ضروری باشند. برای مثال، f(a, b, c) فراخوانی تابعی با سه آرگومان است، در حالی که f((a, b, c)) فراخوانی تابعی با یک تاپل سهتایی بهعنوان تنها آرگومان آن است.
تاپلها همهی عملیات مشترک دنبالهها را پیادهسازی میکنند.
تاپلها نسبت به نوعهای محتوای خود عام هستند. برای اطلاعات بیشتر، به مستندات typing درباره حاشیهنویسی تاپلها مراجعه کنید.
برای مجموعههای دادهی ناهمگونی که در آنها دسترسی با نام روشنتر از دسترسی با اندیس است، ممکن است collections.namedtuple() انتخاب مناسبتری نسبت به یک شیء تاپل ساده باشد.
نوع range دنبالهای تغییرناپذیر از اعداد را نشان میدهد و معمولاً برای تکرار به تعداد مشخصی در حلقههای for استفاده میشود.
آرگومانهای سازندهی range باید اعداد صحیح باشند (یا int توکار، یا هر شیءای که متد ویژهی __index__() را پیادهسازی کند). اگر آرگومان step ذکر نشده باشد، مقدار پیشفرض آن 1 است. اگر آرگومان start ذکر نشده باشد، مقدار پیشفرض آن 0 است. اگر step صفر باشد، استثنای ValueError پرتاب میشود.
برای یک گام مثبت، محتویات یک بازه (range) به نام r بر اساس فرمول r[i] = start + step*i تعیین میشود که در آن i >= 0 و r[i] < stop است.
برای یک گام منفی، محتوای بازه همچنان با فرمول r[i] = start + step*i تعیین میشود، اما محدودیتها i >= 0 و r[i] > stop هستند.
اگر r[0] محدودیت مقدار را برآورده نکند، شیء range خالی خواهد بود. اشیاء range از اندیسهای منفی پشتیبانی میکنند، اما این اندیسها بهصورت اندیسگذاری از انتهای دنبالهای که توسط اندیسهای مثبت تعیین شده است تفسیر میشوند.
بازههایی که حاوی مقادیر مطلقی بزرگتر از sys.maxsize هستند مجازند، اما برخی قابلیتها (مانند len()) ممکن است OverflowError را پرتاب کنند.
مثالهای بازه:
>>> list(range(10)) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> list(range(0, 30, 5)) [0, 5, 10, 15, 20, 25] >>> list(range(0, 10, 3)) [0, 3, 6, 9] >>> list(range(0, -10, -1)) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9] >>> list(range(0)) [] >>> list(range(1, 0)) []
بازهها همهی عملیات دنبالهی مشترک را بهجز الحاق و تکرار پیادهسازی میکنند (به این دلیل که اشیای بازه تنها میتوانند دنبالههایی را نمایندگی کنند که از یک الگوی سختگیرانه پیروی میکنند و تکرار و الحاق معمولاً آن الگو را نقض میکنند).
مقدار پارامتر start (یا 0 اگر پارامتر داده نشده باشد)
مقدار پارامتر stop
مقدار پارامتر step (یا 1 اگر این پارامتر ارائه نشده باشد)
مزیت نوع range نسبت به یک list یا tuple معمولی این است که شیء range همیشه مقدار یکسانی (کم) از حافظه را مصرف میکند، بدون توجه به اندازه بازهای که نمایش میدهد (چراکه تنها مقادیر start، stop و step را ذخیره میکند و آیتمهای منفرد و زیربازهها را در صورت نیاز محاسبه میکند).
اشیای بازه کلاس پایه انتزاعی collections.abc.Sequence را پیادهسازی میکنند و ویژگیهایی مانند آزمونهای عضویت، یافتن اندیس المان، اسلایس و پشتیبانی از اندیسهای منفی را فراهم میکنند (به انواع دنباله --- list، tuple، range مراجعه کنید):
>>> r = range(0, 20, 2) >>> r range(0, 20, 2) >>> 11 in r False >>> 10 in r True >>> r.index(10) 5 >>> r[5] 10 >>> r[:5] range(0, 10, 2) >>> r[-1] 18
آزمودن اشیاء range برای برابری با == و != آنها را بهعنوان دنباله مقایسه میکند. یعنی دو شیء range برابر در نظر گرفته میشوند اگر دنباله یکسانی از مقادیر را نمایندگی کنند. (توجه داشته باشید که ممکن است دو شیء range که با هم برابر مقایسه میشوند، ویژگیهای start، stop و step متفاوتی داشته باشند؛ برای مثال range(0) == range(2, 1, 3) یا range(0, 3, 2) == range(0, 4, 2).)
تغییر یافته در نسخهی 3.2: کلاس پایه انتزاعی (ABC) دنباله را پیادهسازی میکند. از اسلایس و اندیسهای منفی پشتیبانی میکند. به جای پیمایش تمام آیتمها، بررسی عضویت اشیاء int را در زمان ثابت انجام میدهد.
تغییر یافته در نسخهی 3.3: '==' و '!=' طوری تعریف شدهاند که اشیای range را بر اساس دنبالهی مقادیری که تعریف میکنند مقایسه کنند (به جای مقایسه بر اساس هویت شیء).
همچنین ببینید
دستورالعمل linspace نشان میدهد چگونه میتوان نسخهای تنبل از range مناسب برای کاربردهای ممیز شناور پیادهسازی کرد.
جدول زیر متدهای انواع دنباله متنی و دودویی را بر اساس دستهبندی خلاصه میکند.
دسته |
|
|||||||
|---|---|---|---|---|---|---|---|---|
قالببندی |
||||||||
جستوجو و جایگزینی |
||||||||
تقسیم و الحاق |
||||||||
دستهبندی رشته |
||||||||
تغییر حالت حروف |
||||||||
پرکردن و بریدن |
||||||||
ترجمه و کدگذاری |
||||||||
str¶دادههای متنی در پایتون با اشیاء str یا رشتهها (strings) مدیریت میشوند. رشتهها دنبالههایی تغییرناپذیر از نقاط کد یونیکد هستند. رشتههای لفظیی به روشهای گوناگونی نوشته میشوند:
علامت نقلقول تکی: 'allows embedded "double" quotes'
علامت نقلقول دوتایی: "allows embedded 'single' quotes"
سهگانه نقلقولشده: '''Three single quotes'''، """Three double quotes"""
رشتههای محصور در سه علامت نقلقول میتوانند چندین خط را در بر بگیرند؛ تمام فاصلههای خالی مرتبط در رشتهی لفظی گنجانده خواهند شد.
مقادیر لفظی رشتهای (string literals) که بخشی از یک عبارت واحد هستند و تنها فاصلههای خالی میان آنها قرار دارد، بهطور ضمنی به یک لفظی رشتهای واحد تبدیل میشوند. یعنی ("spam " "eggs") == "spam eggs".
برای اطلاعات بیشتر دربارهی شکلهای گوناگون رشتههای لفظی، از جمله دنبالههای خنثیسازی پشتیبانیشده و پیشوند r («خام») که بیشترِ پردازش دنبالههای خنثیسازی را غیرفعال میکند، به مقادیر لفظی رشته و بایت مراجعه کنید.
رشتهها همچنین میتوانند با استفاده از سازندهی str از اشیای دیگر ساخته شوند.
چون نوع جداگانهای برای «نویسه» وجود ندارد، اندیسگذاری یک رشته، رشتههایی به طول ۱ تولید میکند. یعنی برای یک رشتهی غیرتهی s، s[0] == s[0:1] است.
نوعی رشته تغییرپذیر نیز وجود ندارد، اما میتوان از str.join() یا io.StringIO برای ساخت کارآمد رشتهها از چندین تکه استفاده کرد.
تغییر یافته در نسخهی 3.3: برای سازگاری رو به عقب با سری Python 2، پیشوند u بار دیگر بر روی رشتههای لفظی مجاز شمرده میشود. این پیشوند هیچ تأثیری بر معنای رشتههای لفظی ندارد و نمیتوان آن را با پیشوند r ترکیب کرد.
نسخهای رشته از object را بازمیگرداند. اگر object داده نشده باشد، رشتهی خالی را بازمیگرداند. در غیر این صورت، رفتار str() بستگی به این دارد که آیا encoding یا errors داده شده باشند یا نه، به شرح زیر است.
اگر نه encoding و نه errors داده شده باشند، str(object) مقدار type(object).__str__(object) را بازمیگرداند که نمایش رشتهای «غیررسمی» یا بهخوبی چاپشدنیِ object است. برای اشیای رشتهای، این خودِ رشته است. اگر object متد __str__() را نداشته باشد، آنگاه str() به بازگرداندن repr(object) روی میآورد.
اگر حداقل یکی از encoding یا errors داده شده باشد، object باید یک شیء bytes مانند باشد (مثلاً bytes یا bytearray). در این حالت، اگر object یک شیء از نوع bytes (یا bytearray) باشد، آنگاه str(bytes, encoding, errors) معادل bytes.decode(encoding, errors) است. در غیر این صورت، شیء bytes زیرین شیء بافر، پیش از فراخوانی bytes.decode() به دست میآید. برای اطلاعات مربوط به اشیاء بافر، انواع دنبالهای دودویی --- bytes، bytearray، memoryview و پروتکل بافر را ببینید.
دادن یک شیء bytes به str() بدون آرگومانهای encoding یا errors جزو حالت نخستِ بازگرداندن بازنمایی رشتهای غیررسمی محسوب میشود (همچنین به گزینهی خط فرمان -b پایتون مراجعه کنید). برای مثال:
>>> str(b'Zoot!') "b'Zoot!'"
برای اطلاعات بیشتر درباره کلاس str و متدهای آن، به نوع دنبالهی متنی --- str و بخش متدهای رشته در زیر مراجعه کنید. برای خروجی دادن رشتههای قالببندیشده، به بخشهای افاسترینگها و سینتکس رشته قالب مراجعه کنید. علاوه بر این، به بخش خدمات پردازش متن نیز مراجعه کنید.
رشتهها تمامی عملیاتهای دنبالهی مشترک را پیادهسازی میکنند، به همراه متدهای اضافی که در زیر شرح داده شدهاند.
رشتهها همچنین از دو سبک قالببندی رشته پشتیبانی میکنند؛ یکی درجه بالایی از انعطافپذیری و سفارشیسازی را فراهم میکند (به str.format()، سینتکس رشته قالب و قالببندی سفارشی رشته مراجعه کنید) و دیگری بر پایه قالببندی به سبک printf زبان C است که دامنه محدودتری از انواع را پوشش میدهد و استفاده صحیح از آن اندکی دشوارتر است، اما برای مواردی که میتواند مدیریت کند اغلب سریعتر است (قالببندی رشته بهسبک printf).
بخش خدمات پردازش متن کتابخانه استاندارد، تعدادی ماژول دیگر را پوشش میدهد که ابزارهای گوناگون مرتبط با متن را فراهم میکنند (از جمله پشتیبانی از عبارتهای باقاعده در ماژول re).
یک نسخه از رشته را برمیگرداند که در آن نویسه نخست به حرف بزرگ و بقیه نویسهها به حروف کوچک تبدیل شدهاند.
>>> 'PYTHON IS AMAZING'.capitalize() 'Python is amazing' >>> 'Njemačka starts With a non-ASCII digraph'.capitalize() 'Njemačka starts with a non-ascii digraph'
همچنین ببینید title().
تغییر یافته در نسخهی 3.8: اکنون نویسهی نخست بهجای حالت بزرگ (uppercase)، در حالت نگارش عنواننویسی (titlecase) قرار میگیرد. این بدان معناست که نویسههایی مانند دیگرافها (digraphs) تنها حرف نخست آنها بزرگنویسی میشود، نه تمام نویسه.
یک نسخهی کیسفولدشده (casefolded) از رشته را برمیگرداند. میتوان از رشتههای کیسفولدشده برای تطبیق بدون در نظر گرفتن بزرگی و کوچکی حروف (caseless matching) استفاده کرد.
یکدستسازی حروف (casefolding) مشابه کوچکسازی حروف است اما تهاجمیتر است، زیرا هدف آن حذف تمام تمایزهای میان حروف بزرگ و کوچک در یک رشته است. برای مثال، نویسه کوچک آلمانی 'ß' معادل "ss" است. از آنجا که این نویسه از قبل کوچک است، lower() هیچ کاری با 'ß' انجام نمیدهد؛ casefold() آن را به "ss" تبدیل میکند. برای مثال:
>>> 'straße'.lower() 'straße' >>> 'straße'.casefold() 'strasse'
الگوریتم یکسانسازی حروف بزرگ و کوچک در بخش ۳.۱۳.۳ با عنوان «Default Case Folding» از استاندارد یونیکس شرح داده شده است.
اضافه شده در نسخهی 3.3.
رشتهای به طول width را برمیگرداند که رشتهی اصلی در وسط آن قرار دارد. پرکردن با استفاده از fillchar مشخصشده انجام میشود (پیشفرض یک فاصلهی ASCII است). اگر width کوچکتر یا مساوی len(s) باشد، رشتهی اصلی برگردانده میشود. برای مثال:
>>> 'Python'.center(10) ' Python ' >>> 'Python'.center(10, '-') '--Python--' >>> 'Python'.center(4) 'Python'
تعداد رخدادهای غیرهمپوشان زیررشتهی sub در بازه [start, end] را برمیگرداند. آرگومانهای اختیاری start و end مانند نماد اسلایس تفسیر میشوند.
اگر sub خالی باشد، تعداد رشتههای خالی بین نویسهها را برمیگرداند که همان طول رشته بهعلاوهی یک است. برای مثال:
>>> 'spam, spam, spam'.count('spam') 3 >>> 'spam, spam, spam'.count('spam', 5) 2 >>> 'spam, spam, spam'.count('spam', 5, 10) 1 >>> 'spam, spam, spam'.count('eggs') 0 >>> 'spam, spam, spam'.count('') 17
رشته را به صورت کدگذاریشده به bytes بازمیگرداند.
encoding بهطور پیشفرض 'utf-8' است؛ برای مقادیر ممکن به کدگذاریهای استاندارد مراجعه کنید.
errors نحوهی رسیدگی به خطاهای کدگذاری را کنترل میکند. اگر 'strict' باشد (پیشفرض)، یک استثنای UnicodeError پرتاب میشود. سایر مقادیر ممکن عبارتند از 'ignore'، 'replace'، 'xmlcharrefreplace'، 'backslashreplace' و هر نام دیگری که از طریق codecs.register_error() ثبت شده باشد. برای جزئیات بیشتر به هندلرهای خطا مراجعه کنید.
به دلایل کارایی، مقدار errors از نظر اعتبار بررسی نمیشود، مگر آنکه خطای کدگذاری واقعاً رخ دهد، حالت توسعه پایتون فعال شده باشد یا از ساخت اشکالزدایی استفاده شود. برای مثال:
>>> encoded_str_to_bytes = 'Python'.encode() >>> type(encoded_str_to_bytes) <class 'bytes'> >>> encoded_str_to_bytes b'Python'
تغییر یافته در نسخهی 3.1: پشتیبانی از آرگومانهای کلیدواژهای اضافه شد.
تغییر یافته در نسخهی 3.9: مقدار آرگومان errors اکنون در حالت توسعه و در حالت اشکالزدایی بررسی میشود.
اگر رشته با suffix مشخصشده پایان یابد، True بازگردانده میشود؛ در غیر این صورت False بازگردانده میشود. suffix همچنین میتواند تاپلی از پسوندها برای جستجو باشد. با start اختیاری، آزمایش از آن موقعیت آغاز میشود. با end اختیاری، مقایسه در آن موقعیت متوقف میشود. استفاده از start و end معادل str[start:end].endswith(suffix) است. برای مثال:
>>> 'Python'.endswith('on') True >>> 'a tuple of suffixes'.endswith(('at', 'in')) False >>> 'a tuple of suffixes'.endswith(('at', 'es')) True >>> 'Python is amazing'.endswith('is', 0, 9) True
همچنین startswith() و removesuffix() را ببینید.
رونوشتی از رشته را برمیگرداند که در آن همه نویسههای تب با یک یا چند فاصله جایگزین شدهاند؛ بسته به ستون جاری و اندازه تب دادهشده. موقعیتهای تب هر tabsize نویسه یک بار رخ میدهند (پیشفرض ۸ است که موقعیتهای تب را در ستونهای ۰، ۸، ۱۶ و به همین ترتیب ایجاد میکند). برای گسترش رشته، ستون جاری صفر قرار داده میشود و رشته نویسه به نویسه بررسی میشود. اگر نویسه یک تب (\t) باشد، یک یا چند نویسه فاصله در نتیجه درج میشوند تا زمانی که ستون جاری با موقعیت تب بعدی برابر شود. (خود نویسه تب کپی نمیشود.) اگر نویسه یک خط جدید (\n) یا بازگشت (\r) باشد، کپی میشود و ستون جاری به صفر بازنشانی میشود. هر نویسه دیگری بدون تغییر کپی میشود و ستون جاری صرفنظر از اینکه آن نویسه هنگام چاپ چگونه نمایش داده میشود، یکی افزایش مییابد. برای مثال:
>>> '01\t012\t0123\t01234'.expandtabs() '01 012 0123 01234' >>> '01\t012\t0123\t01234'.expandtabs(4) '01 012 0123 01234' >>> print('01\t012\n0123\t01234'.expandtabs(4)) 01 012 0123 01234
کمترین اندیسی از رشته را بازمیگرداند که زیررشته sub درون اسلایس s[start:end] در آن یافت میشود. آرگومانهای اختیاری start و end مانند نمادگذاری اسلایس تفسیر میشوند. اگر sub یافت نشود، -1 بازگردانده میشود. برای مثال:
>>> 'spam, spam, spam'.find('sp') 0 >>> 'spam, spam, spam'.find('sp', 5) 6
عملیات قالببندی رشته را انجام میدهد. رشتهای که این متد روی آن فراخوانی میشود میتواند شامل متن لفظی یا فیلدهای جایگزینی باشد که با آکولادها {} محصور شدهاند. هر فیلد جایگزینی یا شامل اندیس عددی یک آرگومان جایگاهی است، یا نام یک آرگومان کلیدواژهای. نسخهای از رشته را بازمیگرداند که در آن هر فیلد جایگزینی با مقدار رشتهای آرگومان متناظر جایگزین شده است. برای مثال:
>>> "The sum of 1 + 2 is {0}".format(1+2) 'The sum of 1 + 2 is 3' >>> "The sum of {a} + {b} is {answer}".format(answer=1+2, a=1, b=2) 'The sum of 1 + 2 is 3' >>> "{1} expects the {0} Inquisition!".format("Spanish", "Nobody") 'Nobody expects the Spanish Inquisition!'
برای توضیح گزینههای گوناگون قالببندی که میتوانید در رشتههای قالببندی مشخص کنید، به سینتکس رشته قالب مراجعه کنید.
نکته
هنگام قالببندی یک عدد (int، float، complex، decimal.Decimal و زیرکلاسها) با نوع n (مثال: '{:n}'.format(1234))، تابع بهطور موقت locale LC_CTYPE را به locale LC_NUMERIC تنظیم میکند تا فیلدهای decimal_point و thousands_sep در localeconv() را کدگشایی کند اگر آنها غیر ASCII یا طولانیتر از ۱ بایت باشند، و locale LC_NUMERIC با locale LC_CTYPE متفاوت باشد. این تغییر موقت بر نخهای دیگر تأثیر میگذارد.
تغییر یافته در نسخهی 3.7: هنگام قالببندی یک عدد با نوع n، تابع در برخی موارد localeی LC_CTYPE را بهطور موقت به localeی LC_NUMERIC تنظیم میکند.
مشابه str.format(**mapping)، با این تفاوت که mapping مستقیماً استفاده میشود و در یک dict کپی نمیشود. این کار اگر برای مثال mapping یک زیرکلاس دیکشنری باشد، مفید است:
>>> class Default(dict): ... def __missing__(self, key): ... return key ... >>> '{name} was born in {country}'.format_map(Default(name='Guido')) 'Guido was born in country'
اضافه شده در نسخهی 3.2.
مانند find()، اما هنگامی که زیررشته یافت نشود، ValueError را پرتاب میکند. برای مثال:
>>> 'spam, spam, spam'.index('spam') 0 >>> 'spam, spam, spam'.index('eggs') Traceback (most recent call last): File "<python-input-0>", line 1, in <module> 'spam, spam, spam'.index('eggs') ~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^ ValueError: substring not found
همچنین ببینید rindex().
اگر همهی نویسههای رشته الفباییعددی باشند و دستکم یک نویسه در آن وجود داشته باشد، True بازگردانده میشود؛ در غیر این صورت False. یک نویسهی c الفباییعددی است اگر یکی از موارد زیر True برگرداند: c.isalpha()، c.isdecimal()، c.isdigit() یا c.isnumeric(). برای مثال:
>>> 'abc123'.isalnum() True >>> 'abc123!@#'.isalnum() False >>> ''.isalnum() False >>> ' '.isalnum() False
اگر همهی نویسههای درون رشته الفبایی باشند و حداقل یک نویسه وجود داشته باشد، مقدار True و در غیر این صورت False را برمیگرداند. نویسههای الفبایی آن دسته از نویسههایی هستند که در پایگاه دادهی نویسههای یونیکس به عنوان «Letter» تعریف شدهاند؛ یعنی آنهایی که ویژگی دستهی عمومیشان یکی از موارد «Lm»، «Lt»، «Lu»، «Ll» یا «Lo» است. توجه داشته باشید که این با ویژگی الفبایی تعریفشده در بخش ۴.۱۰ با عنوان «Letters, Alphabetic, and Ideographic» از استاندارد یونیکس متفاوت است. برای مثال:
>>> 'Letters and spaces'.isalpha() False >>> 'LettersOnly'.isalpha() True >>> 'µ'.isalpha() # non-ASCII characters can be considered alphabetical too True
ویژگیهای یونیکد را ببینید.
اگر رشته خالی باشد یا تمام نویسههای آن ASCII باشند، True و در غیر این صورت False را برمیگرداند. نویسههای ASCII دارای نقطههای کد در بازهی U+0000-U+007F هستند. برای مثال:
>>> 'ASCII characters'.isascii() True >>> 'µ'.isascii() False
اضافه شده در نسخهی 3.7.
اگر همهی نویسههای رشته نویسههای دهدهی باشند و دستکم یک نویسه وجود داشته باشد، True برمیگرداند؛ در غیر این صورت False. نویسههای دهدهی نویسههایی هستند که میتوان از آنها برای تشکیل اعداد در مبنای ۱۰ استفاده کرد، مانند U+0660، ARABIC-INDIC DIGIT ZERO. به طور رسمی، یک نویسهی دهدهی نویسهای است که در دستهبندی عمومی «Nd» یونیکد قرار دارد. برای مثال:
>>> '0123456789'.isdecimal() True >>> '٠١٢٣٤٥٦٧٨٩'.isdecimal() # Arabic-Indic digits zero to nine True >>> 'alphabetic'.isdecimal() False
اگر همهی نویسههای رشته رقم باشند و دستکم یک نویسه وجود داشته باشد، True برمیگرداند؛ در غیر این صورت False. ارقام شامل نویسههای دهدهی و ارقامی هستند که نیازمند رسیدگی ویژهاند، مانند ارقام بالانویس سازگاری. این موضوع ارقامی را نیز پوشش میدهد که نمیتوان از آنها برای تشکیل اعداد در مبنای ۱۰ استفاده کرد، مانند اعداد خروشتی. بهطور رسمی، رقم نویسهای است که دارای مقدار ویژگی Numeric_Type=Digit یا Numeric_Type=Decimal باشد.
برای مثال:
>>> '0123456789'.isdigit() True >>> '٠١٢٣٤٥٦٧٨٩'.isdigit() # Arabic-Indic digits zero to nine True >>> '⅕'.isdigit() # Vulgar fraction one fifth False >>> '²'.isdecimal(), '²'.isdigit(), '²'.isnumeric() (False, True, True)
همچنین isdecimal() و isnumeric() را ببینید.
اگر رشته یک شناسهی معتبر مطابق با تعریف زبان در بخش نامها (شناسهها و کلیدواژهها) باشد، True را بازمیگرداند.
میتوان از keyword.iskeyword() برای آزمودن اینکه آیا رشتهی s یک شناسهی رزروشده است، مانند def و class، استفاده کرد.
مثال:
>>> from keyword import iskeyword >>> 'hello'.isidentifier(), iskeyword('hello') (True, False) >>> 'def'.isidentifier(), iskeyword('def') (True, True)
اگر همهی نویسههای دارای حالت [4] درون رشته کوچک باشند و دستکم یک نویسهی دارای حالت وجود داشته باشد، True بازگردانده میشود؛ در غیر این صورت False.
اگر همهی نویسههای رشته نویسههای عددی باشند و حداقل یک نویسه وجود داشته باشد، True و در غیر این صورت False بازگردانده میشود. نویسههای عددی شامل نویسههای رقم و همهی نویسههایی هستند که ویژگی مقدار عددی یونیکد را دارند، مانند U+2155، VULGAR FRACTION ONE FIFTH. بهطور رسمی، نویسههای عددی نویسههایی هستند که مقدار ویژگی آنها Numeric_Type=Digit، Numeric_Type=Decimal یا Numeric_Type=Numeric باشد. برای مثال:
>>> '0123456789'.isnumeric() True >>> '٠١٢٣٤٥٦٧٨٩'.isnumeric() # Arabic-Indic digits zero to nine True >>> '⅕'.isnumeric() # Vulgar fraction one fifth True >>> '²'.isdecimal(), '²'.isdigit(), '²'.isnumeric() (False, True, True)
همچنین ببینید isdecimal() و isdigit().
اگر همهی نویسههای رشته قابل چاپ باشند، True را برمیگرداند؛ اگر حداقل یک نویسهی غیرقابل چاپ داشته باشد، False را برمیگرداند.
در اینجا «قابل چاپ» به این معناست که نویسه برای آنکه repr() در خروجی خود از آن استفاده کند مناسب است؛ «غیرقابل چاپ» یعنی repr() روی انواع توکار، نویسه را با مبنای شانزده خنثی میکند (hex-escape). این موضوع تأثیری بر نحوه مدیریت رشتههایی که به sys.stdout یا sys.stderr نوشته میشوند ندارد.
نویسههای چاپپذیر آنهایی هستند که در پایگاه داده نویسه یونیکد (به unicodedata مراجعه کنید) دارای دسته عمومی در گروه حرف، نشانه، عدد، علائم نگارشی یا نماد (L, M, N, P, or S) هستند؛ به علاوه فاصله ASCII 0x20. نویسههای غیرچاپپذیر آنهایی هستند که در گروه جداکننده یا سایر (Z or C) قرار دارند، به جز فاصله ASCII.
برای مثال:
>>> ''.isprintable(), ' '.isprintable() (True, True) >>> '\t'.isprintable(), '\n'.isprintable() (False, False)
همچنین ببینید isspace().
اگر رشته فقط شامل نویسههای فضای خالی باشد و حداقل یک نویسه داشته باشد، True و در غیر این صورت False را برمیگرداند.
برای مثال:
>>> ''.isspace() False >>> ' '.isspace() True >>> '\t\n'.isspace() # TAB and BREAK LINE True >>> '\u3000'.isspace() # IDEOGRAPHIC SPACE True
یک نویسه در صورتی فاصله سفید است که در پایگاه داده نویسههای یونیکد (به unicodedata مراجعه کنید)، یا دسته عمومی آن Zs («جداکننده، فاصله») باشد، یا کلاس دوجهته آن یکی از WS، B یا S باشد.
همچنین ببینید isprintable().
اگر رشته، رشتهای با حالت نگارش عنواننویسی (titlecased) باشد و دستکم یک نویسه داشته باشد، True بازگردانده میشود؛ برای مثال، نویسههای بزرگ تنها میتوانند پس از نویسههای بدون حالت (uncased) بیایند و نویسههای کوچک تنها پس از نویسههای دارای حالت (cased). در غیر این صورت، False بازگردانده میشود.
برای مثال:
>>> 'Spam, Spam, Spam'.istitle() True >>> 'spam, spam, spam'.istitle() False >>> 'SPAM, SPAM, SPAM'.istitle() False
همچنین ببینید title().
اگر همهی نویسههای دارای حالت (cased) [4] درون رشته به شکل حروف بزرگ باشند و دستکم یک نویسهی دارای حالت وجود داشته باشد، True و در غیر این صورت False برمیگرداند.
>>> 'BANANA'.isupper() True >>> 'banana'.isupper() False >>> 'baNana'.isupper() False >>> ' '.isupper() False
رشتهای را بازمیگرداند که حاصل الحاق رشتههای موجود در iterable است. اگر در iterable مقدارهای غیر رشتهای وجود داشته باشد، از جمله شیءهای bytes، استثنای TypeError پرتاب میشود. جداکنندهی میان المانها، رشتهای است که این متد را فراهم میکند. برای مثال:
>>> ', '.join(['spam', 'spam', 'spam']) 'spam, spam, spam' >>> '-'.join('Python') 'P-y-t-h-o-n'
همچنین ببینید split().
رشته را در رشتهای به طول width بهصورت چپچین بازمیگرداند. پرکردن با استفاده از fillchar مشخصشده انجام میشود (پیشفرض یک فاصلهی ASCII است). اگر width کوچکتر یا مساوی len(s) باشد، رشتهی اصلی برگردانده میشود.
برای مثال:
>>> 'Python'.ljust(10) 'Python ' >>> 'Python'.ljust(10, '.') 'Python....' >>> 'Monty Python'.ljust(10, '.') 'Monty Python'
همچنین ببینید rjust().
یک نسخه از رشته را برمیگرداند که تمام نویسههای دارای حالت (cased) [4] آن به حروف کوچک تبدیل شدهاند. برای مثال:
>>> 'Lower Method Example'.lower() 'lower method example'
الگوریتم کوچکسازی حروف استفادهشده در بخش 3.13.2 'Default Case Conversion' از استاندارد یونیکد شرح داده شده است.
کپیای از رشته را با حذف نویسههای ابتدایی برمیگرداند. آرگومان chars رشتهای است که مجموعه نویسههایی را که باید حذف شوند مشخص میکند. اگر ذکر نشود یا None باشد، آرگومان chars بهطور پیشفرض فاصلههای خالی را حذف میکند. آرگومان chars یک پیشوند نیست؛ بلکه تمام ترکیبهای مقادیر آن حذف میشوند:
>>> ' spacious '.lstrip() 'spacious ' >>> 'www.example.com'.lstrip('cmowz.') 'example.com'
برای متدی که یک رشتهی پیشوند منفرد را حذف میکند، نه همهی نویسههای یک مجموعه را، به str.removeprefix() مراجعه کنید. برای مثال:
>>> 'Arthur: three!'.lstrip('Arthur: ') 'ee!' >>> 'Arthur: three!'.removeprefix('Arthur: ') 'three!'
این متد ایستا جدول ترجمهای را برمیگرداند که برای str.translate() قابل استفاده است.
اگر تنها یک آرگومان وجود داشته باشد، باید یک دیکشنری باشد که اعداد ترتیبی یونیکد (عددهای صحیح) یا نویسهها (رشتههایی با طول ۱) را به اعداد ترتیبی یونیکد، رشتهها (با طولهای دلخواه) یا None نگاشت میکند. سپس کلیدهای نویسهای به اعداد ترتیبی تبدیل میشوند.
اگر دو آرگومان وجود داشته باشند، باید رشتههایی با طول برابر باشند و در دیکشنری حاصل، هر نویسه در from به نویسهای در همان جایگاه در to نگاشت میشود. اگر آرگومان سومی وجود داشته باشد، باید یک رشته باشد که نویسههای آن در نتیجه به None نگاشت میشوند.
تغییر یافته در نسخهی 3.15: اکنون dict میتواند یک frozendict باشد.
رشته را در نخستین رخداد sep تفکیک میکند و یک تاپل سهعضوی شامل بخش پیش از جداکننده، خودِ جداکننده و بخش پس از جداکننده را برمیگرداند. اگر جداکننده یافت نشود، تاپلی سهعضوی شامل خودِ رشته و سپس دو رشتهی خالی را برمیگرداند.
برای مثال:
>>> 'Monty Python'.partition(' ') ('Monty', ' ', 'Python') >>> "Monty Python's Flying Circus".partition(' ') ('Monty', ' ', "Python's Flying Circus") >>> 'Monty Python'.partition('-') ('Monty Python', '', '')
همچنین ببینید rpartition().
اگر رشته با رشتهی prefix شروع شود، string[len(prefix):] را برمیگرداند. در غیر این صورت، نسخهای از رشته اصلی را برمیگرداند:
>>> 'TestHook'.removeprefix('Test') 'Hook' >>> 'BaseTestCase'.removeprefix('Test') 'BaseTestCase'
اضافه شده در نسخهی 3.9.
همچنین ببینید removesuffix() و startswith().
اگر رشته با رشتهی پسوند پایان یابد و آن پسوند خالی نباشد، string[:-len(suffix)] را بازگردانید. در غیر این صورت، نسخهای از رشته اصلی را بازگردانید:
>>> 'MiscTests'.removesuffix('Tests') 'Misc' >>> 'TmpDirMixin'.removesuffix('Tests') 'TmpDirMixin'
اضافه شده در نسخهی 3.9.
همچنین ببینید removeprefix() و endswith().
یک نسخه از رشته را برمیگرداند که در آن تمام موارد زیررشتهی old با new جایگزین شدهاند. اگر count داده شود، تنها count مورد نخست جایگزین میشوند. اگر count مشخص نشده باشد یا -1 باشد، تمام موارد جایگزین میشوند. برای مثال:
>>> 'spam, spam, spam'.replace('spam', 'eggs') 'eggs, eggs, eggs' >>> 'spam, spam, spam'.replace('spam', 'eggs', 1) 'eggs, spam, spam'
تغییر یافته در نسخهی 3.13: count اکنون بهعنوان یک آرگومان کلیدواژهای پشتیبانی میشود.
بالاترین اندیسی از رشته را که زیررشتهی sub در آن یافت میشود بازمیگرداند، بهطوری که sub درون s[start:end] قرار داشته باشد. آرگومانهای اختیاری start و end مانند نماد اسلایس تفسیر میشوند. در صورت شکست، -1 بازگردانده میشود. برای مثال:
>>> 'spam, spam, spam'.rfind('sp') 12 >>> 'spam, spam, spam'.rfind('sp', 0, 10) 6
مانند rfind() است، اما هرگاه زیررشتهی sub پیدا نشود، ValueError را پرتاب میکند. برای مثال:
>>> 'spam, spam, spam'.rindex('spam') 12 >>> 'spam, spam, spam'.rindex('eggs') Traceback (most recent call last): File "<stdin-0>", line 1, in <module> 'spam, spam, spam'.rindex('eggs') ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^ ValueError: substring not found
رشته را در رشتهای به طول width راستچین بازمیگرداند. پرکردن با استفاده از fillchar مشخصشده انجام میشود (پیشفرض یک فاصله ASCII است). اگر width کمتر یا مساوی len(s) باشد، رشته اصلی برگردانده میشود.
برای مثال:
>>> 'Python'.rjust(10) ' Python' >>> 'Python'.rjust(10, '.') '....Python' >>> 'Monty Python'.rjust(10, '.') 'Monty Python'
رشته را در آخرین وقوع sep جدا میکند و یک تاپل سهعضوی شامل بخش قبل از جداکننده، خودِ جداکننده و بخش بعد از جداکننده را بازمیگرداند. اگر جداکننده یافت نشود، یک تاپل سهعضوی شامل دو رشتهی خالی و سپس خودِ رشته را بازمیگرداند.
برای مثال:
>>> 'Monty Python'.rpartition(' ') ('Monty', ' ', 'Python') >>> "Monty Python's Flying Circus".rpartition(' ') ("Monty Python's Flying", ' ', 'Circus') >>> 'Monty Python'.rpartition('-') ('', '', 'Monty Python')
همچنین ببینید partition().
یک فهرست از کلمات موجود در رشته را با استفاده از sep بهعنوان رشته جداکننده برگردانید. اگر maxsplit داده شده باشد، حداکثر maxsplit تجزیه انجام میشود، آنهایی که در rightmost هستند. اگر sep مشخص نشده باشد یا None باشد، هر رشته whitespace یک جداکننده است. بهجز تجزیه از راست، rsplit() شبیه به split() رفتار میکند که بهصورت مفصل در ادامه توصیف شده است.
یک نسخه از رشته را با حذف نویسههای پایانی برمیگرداند. آرگومان chars رشتهای است که مجموعهای از نویسهها را برای حذف مشخص میکند. اگر حذف شود یا None باشد، آرگومان chars بهطور پیشفرض فضای سفید را حذف میکند. آرگومان chars یک پسوند نیست؛ بلکه همهی ترکیبهای مقادیر آن حذف میشوند. برای مثال:
>>> ' spacious '.rstrip() ' spacious' >>> 'mississippi'.rstrip('ipz') 'mississ'
برای متدی که بهجای همهی نویسههای یک مجموعه، یک رشته پسوند واحد را حذف میکند، removesuffix() را ببینید. برای مثال:
>>> 'Monty Python'.rstrip(' Python') 'M' >>> 'Monty Python'.removesuffix(' Python') 'Monty'
همچنین ببینید strip().
فهرستی از واژههای موجود در رشته را با استفاده از sep بهعنوان رشتهی جداکننده بازمیگرداند. اگر maxsplit داده شود، حداکثر maxsplit جداسازی انجام میشود (بدین ترتیب، فهرست حداکثر maxsplit+1 المان خواهد داشت). اگر maxsplit مشخص نشده باشد یا -1 باشد، هیچ محدودیتی بر تعداد جداسازیها وجود ندارد (تمام جداسازیهای ممکن انجام میشوند).
اگر sep داده شود، جداکنندههای متوالی با هم گروهبندی نمیشوند و به عنوان محدودکنندهی رشتههای خالی در نظر گرفته میشوند (برای مثال، '1,,2'.split(',') مقدار ['1', '', '2'] را برمیگرداند). آرگومان sep میتواند شامل چندین نویسه به عنوان یک جداکنندهی واحد باشد (برای جداسازی با چندین جداکننده، از re.split() استفاده کنید). جداسازی یک رشتهی خالی با یک جداکنندهی مشخص، [''] را برمیگرداند.
برای مثال:
>>> '1,2,3'.split(',') ['1', '2', '3'] >>> '1,2,3'.split(',', maxsplit=1) ['1', '2,3'] >>> '1,2,,3,'.split(',') ['1', '2', '', '3', ''] >>> '1<>2<>3<4'.split('<>') ['1', '2', '3<4']
اگر sep مشخص نشده باشد یا None باشد، یک الگوریتم تجزیه متفاوت اعمال میشود: دنبالههای متوالی whitespace بهعنوان یک جداکننده واحد در نظر گرفته میشوند، و نتیجه در ابتدا یا انتها رشتههای خالی نخواهد داشت اگر رشته فضای پیشرو یا پسرو داشته باشد. در نتیجه، تجزیه یک رشته خالی یا رشتهای که فقط از فضای خالی تشکیل شده با جداکننده None، [] را برمیگرداند.
برای مثال:
>>> '1 2 3'.split() ['1', '2', '3'] >>> '1 2 3'.split(maxsplit=1) ['1', '2 3'] >>> ' 1 2 3 '.split() ['1', '2', '3']
اگر sep مشخص نشده باشد یا None باشد و maxsplit برابر با 0 باشد، فقط دنبالههای متوالی فاصلههای خالی ابتدایی در نظر گرفته میشوند.
برای مثال:
>>> "".split(None, 0) [] >>> " ".split(None, 0) [] >>> " foo ".split(maxsplit=0) ['foo ']
فهرستی از سطرهای رشته را با شکستن در مرزهای سطر برمیگرداند. شکستگیهای خط در فهرست حاصل گنجانده نمیشوند، مگر اینکه keepends داده شده و true باشد.
این متد بر اساس مرزهای سطری زیر تفکیک میشود. بهویژه، این مرزها ابرمجموعهای از سطرهای جدید همگانی (universal newlines) هستند.
بازنمایی |
توضیح |
|---|---|
|
تغذیهی سطر (Line Feed) |
|
بازگشت به ابتدای سطر |
|
بازگشت به ابتدای سطر + تغذیهی سطر |
|
جدولبندی خطی (Line Tabulation) |
|
تغذیهی صفحه |
|
جداکننده پرونده |
|
جداکننده گروه |
|
جداکنندهی رکورد |
|
خط بعدی (کد کنترلی C1) |
|
جداکنندهی خط |
|
جداکنندهی پاراگراف |
تغییر یافته در نسخهی 3.2: \v و \f به فهرست مرزهای سطر اضافه شدند.
برای مثال:
>>> 'ab c\n\nde fg\rkl\r\n'.splitlines() ['ab c', '', 'de fg', 'kl'] >>> 'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) ['ab c\n', '\n', 'de fg\r', 'kl\r\n']
برخلاف split() وقتی که رشته جداکننده sep داده شده باشد، این متد برای رشته خالی یک فهرست خالی برمیگرداند و شکست خط انتهایی به یک خط اضافی منجر نمیشود:
>>> "".splitlines() [] >>> "One line\n".splitlines() ['One line']
برای مقایسه، split('\n') نتیجهی زیر را میدهد:
>>> ''.split('\n') [''] >>> 'Two lines\n'.split('\n') ['Two lines', '']
اگر رشته با prefix آغاز شود، True را برمیگرداند، در غیر این صورت False را برمیگرداند. prefix همچنین میتواند تاپلی از پیشوندها برای جستوجو باشد. با start اختیاری، رشته از آن موقعیت آزمایش میشود. با end اختیاری، مقایسه رشته در آن موقعیت متوقف میشود.
برای مثال:
>>> 'Python'.startswith('Py') True >>> 'a tuple of prefixes'.startswith(('at', 'a')) True >>> 'Python is amazing'.startswith('is', 7) True
همچنین endswith() و removeprefix() را نیز ببینید.
یک نسخه از رشته را با حذف نویسههای ابتدایی و انتهایی برمیگرداند. آرگومان chars رشتهای است که مجموعهای از نویسهها را برای حذف مشخص میکند. اگر حذف شود یا None باشد، آرگومان chars بهطور پیشفرض نویسههای فضای خالی را حذف میکند. آرگومان chars یک پیشوند یا پسوند نیست؛ بلکه تمام ترکیبهای مقادیر آن حذف میشوند.
نویسههای فضای خالی توسط str.isspace() تعریف میشوند.
برای مثال:
>>> ' spacious '.strip() 'spacious' >>> 'www.example.com'.strip('cmowz.') 'example'
بیرونیترین مقادیر آرگومان chars در ابتدا و انتهای رشته حذف میشوند. نویسهها از سمت ابتدا حذف میشوند تا به نویسهای از رشته برسند که در مجموعه نویسههای chars وجود ندارد. عمل مشابهی در سمت انتها انجام میشود.
برای مثال:
>>> comment_string = '#....... Section 3.2.1 Issue #32 .......' >>> comment_string.strip('.#! ') 'Section 3.2.1 Issue #32'
همچنین rstrip() را ببینید.
نسخهای از رشته را برمیگرداند که در آن نویسههای بزرگ به کوچک و نویسههای کوچک به بزرگ تبدیل شدهاند. برای مثال:
>>> 'Hello World'.swapcase() 'hELLO wORLD'
توجه داشته باشید که لزوماً درست نیست که s.swapcase().swapcase() == s. برای مثال:
>>> 'straße'.swapcase().swapcase() 'strasse'
همچنین str.lower() و str.upper() را ببینید.
نسخهای عنواننویسیشده (titlecased) از رشته را برمیگرداند که در آن واژهها با یک نویسه بزرگ آغاز میشوند و نویسههای باقیمانده کوچک هستند.
برای مثال:
>>> 'Hello world'.title() 'Hello World'
الگوریتم از تعریفی ساده و مستقل از زبان برای واژه استفاده میکند که بر اساس آن، واژه به صورت گروههایی از حروف پیاپی است. این تعریف در بسیاری از زمینهها کار میکند، اما به این معناست که آپاستروفها در انقباضها و صیغههای ملکی، مرز واژه تشکیل میدهند که ممکن است نتیجه مطلوب نباشد:
>>> "they're bill's friends from the UK".title() "They'Re Bill'S Friends From The Uk"
تابع string.capwords() این مشکل را ندارد، زیرا واژهها را تنها بر اساس فاصلهها جدا میکند.
بهعنوان جایگزین، میتوان راهحلی برای آپوستروفها با استفاده از عبارات باقاعده ساخت:
>>> import re >>> def titlecase(s): ... return re.sub(r"[A-Za-z]+('[A-Za-z]+)?", ... lambda mo: mo.group(0).capitalize(), ... s) ... >>> titlecase("they're bill's friends.") "They're Bill's Friends."
همچنین ببینید ljust() و zfill().
نسخهای از رشته را برمیگرداند که در آن هر نویسه از طریق جدول ترجمهی دادهشده نگاشت شده است. جدول باید یک شیء باشد که اندیسدهی از طریق __getitem__() را پیادهسازی میکند، معمولاً یک نگاشت یا دنباله. هنگامی که شیء جدول با یک عدد ترتیبی یونیکد (یک عدد صحیح) اندیسدهی شود، میتواند هر یک از کارهای زیر را انجام دهد: برگرداندن یک عدد ترتیبی یونیکد یا یک رشته، برای نگاشت نویسه به یک یا چند نویسه دیگر؛ برگرداندن None، برای حذف نویسه از رشته برگشتی؛ یا پرتاب استثنای LookupError، برای نگاشت نویسه به خودش.
میتوانید از str.maketrans() برای ایجاد یک نگاشت ترجمه از نگاشتهای نویسهبهنویسه در قالبهای مختلف استفاده کنید.
مثال زیر از یک نگاشت برای جایگزینی 'a' با 'X'، 'b' با 'Y' و حذف 'c' استفاده میکند:
>>> 'abc123'.translate({ord('a'): 'X', ord('b'): 'Y', ord('c'): None}) 'XY123'
برای رویکردی انعطافپذیرتر به نگاشتهای سفارشی نویسهها، ماژول codecs را نیز ببینید.
یک کپی از رشته را برمیگرداند که در آن تمام نویسههای دارای حالت [4] به حروف بزرگ تبدیل شدهاند. توجه داشته باشید که s.upper().isupper() ممکن است False باشد اگر s حاوی نویسههای بدون حالت باشد یا اگر دسته یونیکد نویسههای حاصل "Lu" (حرف، بزرگ) نباشد، بلکه برای مثال "Lt" (حرف، حالت عنوان) باشد.
الگوریتم بزرگسازی حروف استفادهشده در بخش 3.13.2 'Default Case Conversion' از استاندارد یونیکد شرح داده شده است.
یک کپی از رشته را برمیگرداند که از سمت چپ با ارقام '0' ASCII پر شده است تا رشتهای به طول width بسازد. پیشوند علامت ابتدایی ('+'/'-') بهگونهای مدیریت میشود که پرکننده بعد از نویسه علامت درج میشود، نه قبل از آن. اگر width کمتر یا مساوی با len(s) باشد، رشته اصلی برگردانده میشود.
برای مثال:
>>> "42".zfill(5) '00042' >>> "-42".zfill(5) '-0042'
همچنین ببینید rjust().
اضافه شده در نسخهی 3.6.
تغییر یافته در نسخهی 3.7: میتوان از await و async for در عبارتهای درون افاسترینگها استفاده کرد.
تغییر یافته در نسخهی 3.8: افزودن مشخصکننده اشکالزدایی (=)
تغییر یافته در نسخهی 3.12: بسیاری از محدودیتهای مربوط به عبارتهای درون افاسترینگها برداشته شدهاند. بهویژه، رشتههای تودرتو، کامنتها و بکاسلشها اکنون مجاز هستند.
یک افاسترینگ (f-string) (بهطور رسمی یک رشتهی لفظی قالببندیشده (formatted string literal)) یک رشتهی لفظی است که پیشوند f یا F دارد. این نوع از رشتهی لفظی امکان تعبیه نتایج عبارتهای دلخواه پایتون را درون فیلدهای جایگزینی فراهم میکند، که با آکولادها ({}) محدود شدهاند. هر فیلد جایگزینی باید شامل یک عبارت باشد، و بهصورت اختیاری به دنبال آن:
یک مشخصکننده اشکالزدایی — یک علامت مساوی (=)؛
یک مشخصکننده تبدیل -- !s، !r یا !a؛ و/یا
یک مشخصکننده قالب با پیشوند دونقطه (:).
برای جزئیات سینتکس این فیلدها، به بخش تحلیل واژگانی مربوط به افاسترینگها مراجعه کنید.
اضافه شده در نسخهی 3.8.
اگر یک مشخصکننده اشکالزدایی (debug specifier) — یعنی یک علامت مساوی (=) — پس از عبارت فیلد جایگزینی ظاهر شود، افاسترینگ حاصل شامل متن منبع عبارت، علامت مساوی و مقدار عبارت خواهد بود. این موضوع اغلب برای اشکالزدایی مفید است:
>>> number = 14.3 >>> f'{number=}' 'number=14.3'
فضای خالی پیش از عبارت، درون آن و پس از آن، و همچنین فضای خالی پس از علامت مساوی، معنادار است --- در نتیجه حفظ میشود:
>>> f'{ number - 4 = }' ' number - 4 = 10.3'
بهطور پیشفرض، مقدار عبارت فیلد جایگزینی با استفاده از str() به رشته تبدیل میشود:
>>> from fractions import Fraction >>> one_third = Fraction(1, 3) >>> f'{one_third}' '1/3'
هنگامی که از مشخصکننده اشکالزدایی استفاده شود ولی از مشخصکننده قالب استفاده نشود، تبدیل پیشفرض در عوض از repr() استفاده میکند:
>>> f'{one_third = }' 'one_third = Fraction(1, 3)'
تبدیل را میتوان بهصراحت با استفاده از یکی از این مشخصکنندهها مشخص کرد:
برای مثال:
>>> str(one_third) '1/3' >>> repr(one_third) 'Fraction(1, 3)' >>> f'{one_third!s} is {one_third!r}' '1/3 is Fraction(1, 3)' >>> string = "¡kočka 😸!" >>> ascii(string) "'\\xa1ko\\u010dka \\U0001f638!'" >>> f'{string = !a}' "string = '\\xa1ko\\u010dka \\U0001f638!'"
پس از اینکه عبارت ارزیابی شد و احتمالاً با استفاده از یک مشخصکننده تبدیل صریح تبدیل گردید، با استفاده از تابع format() قالببندی میشود. اگر فیلد جایگزینی شامل یک مشخصکننده قالب باشد که با علامت دونقطه (:) معرفی شده باشد، آن مشخصکننده بهعنوان آرگومان دوم به format() ارسال میشود. سپس نتیجه format() بهعنوان مقدار نهایی فیلد جایگزینی استفاده میشود. برای مثال:
>>> from fractions import Fraction >>> one_third = Fraction(1, 3) >>> f'{one_third:.6f}' '0.333333' >>> f'{one_third:_^+10}' '___+1/3___' >>> f'{one_third!r:_^20}' '___Fraction(1, 3)___' >>> f'{one_third = :~>10}~' 'one_third = ~~~~~~~1/3~'
یک t-string (بهصورت رسمی یک template string literal) یک لفظی رشته است که با t یا T پیشوندگذاری شده است.
این رشتهها همان سینتکس و قواعد ارزیابی را دارند که formatted string literals دارند، با تفاوتهای زیر:
به جای ارزیابی شدن به یک شیء str، مقادیر لفظی رشتهای قالب به یک شیء string.templatelib.Template ارزیابی میشوند.
از پروتکل format() استفاده نمیشود. در عوض، مشخصکنندهی قالب و تبدیلها (در صورت وجود) به یک شیء جدید Interpolation منتقل میشوند که برای هر عبارت ارزیابیشده ایجاد میشود. تصمیم دربارهی نحوهی مدیریت مشخصکنندههای قالب و تبدیلها بر عهدهی کدی است که شیء Template حاصل را پردازش میکند.
مشخصکنندههای قالب حاوی فیلدهای جایگزینی تودرتو، پیش از آنکه به شیء Interpolation منتقل شوند، بهصورت فوری ارزیابی میشوند. برای مثال، یک درونیابی به شکل {amount:.{precision}f}، عبارت درونی {precision} را ارزیابی میکند تا مقدار ویژگی format_spec تعیین شود. اگر precision برابر با 2 باشد، مشخصکننده قالب حاصل '.2f' خواهد بود.
وقتی علامت تساوی '=' در یک عبارت درونیابی ارائه شده باشد، متن عبارت به رشته لفظی که قبل از درونیابی مربوطه میآید الحاق میشود. این شامل علامت تساوی و هر فضای خالی محیطی است. نمونه Interpolation برای عبارت بهصورت معمول ایجاد خواهد شد، بهجز اینکه conversion بهصورت پیشفرض روی 'r' (repr()) تنظیم خواهد شد. اگر یک تبدیل یا مشخصه قالب صریح ارائه شده باشد، این رفتار پیشفرض را نادیده میگیرد.
printf¶نکته
عملیات قالببندی توصیفشده در اینجا دارای رفتارهای عجیب گوناگونی است که به تعدادی از خطاهای رایج منجر میشوند (مانند عدم نمایش صحیح تاپلها و دیکشنریها).
استفاده از مقادیر لفظی رشتهای قالببندیشده، رابط str.format()، یا string.Template میتواند به جلوگیری از این خطاها کمک کند. هر یک از این جایگزینها، مصالحهها و مزایای خاص خود را از نظر سادگی، انعطافپذیری و/یا توسعهپذیری دارند.
اشیای رشته یک عملیات توکار منحصربهفرد دارند: عملگر % (پیمانه). این عملگر بهعنوان عملگر قالببندی یا درونیابی رشته نیز شناخته میشود. با فرض format % values (که در آن format یک رشته است)، مشخصات تبدیل % در format با صفر یا چند عنصر از values جایگزین میشوند. اثر آن مشابه استفاده از تابع sprintf() در زبان C است. برای مثال:
>>> print('%s has %d quote types.' % ('Python', 2)) Python has 2 quote types.
اگر format به یک آرگومان واحد نیاز داشته باشد، values میتواند یک شیء واحد باشد که تاپل نیست. [5] در غیر این صورت، values باید یک تاپل با دقیقاً همان تعداد آیتمی باشد که رشته قالب مشخص میکند، یا یک شیء نگاشت واحد (برای مثال، یک دیکشنری).
یک مشخصکننده تبدیل شامل دو یا چند نویسه است و دارای اجزای زیر است، که باید به همین ترتیب ظاهر شوند:
نویسهی '%'، که آغاز مشخصکننده را علامتگذاری میکند.
کلید نگاشت (اختیاری)، شامل دنبالهای از نویسههای داخل پرانتز (برای مثال، (somename)).
پرچمهای تبدیل (اختیاری)، که بر نتیجهی برخی از انواع تبدیل تأثیر میگذارند.
حداقل عرض فیلد (اختیاری). اگر بهصورت '*' (ستاره) مشخص شده باشد، عرض واقعی از المان بعدی تاپل در values خوانده میشود و شیء موردنظر برای تبدیل، پس از حداقل عرض فیلد و دقت اختیاری میآید.
دقت (اختیاری)، به صورت یک '.' (نقطه) و سپس مقدار دقت داده میشود. اگر به صورت '*' (ستاره) مشخص شده باشد، دقت واقعی از آیتم بعدی تاپل در values خوانده میشود و مقداری که باید تبدیل شود، پس از دقت میآید.
اصلاحکننده طول (اختیاری).
نوع تبدیل.
وقتی آرگومان سمت راست یک دیکشنری (یا نوع نگاشتی دیگری) باشد، قالبهای درون رشته باید شامل یک کلید نگاشت داخل پرانتز برای آن دیکشنری باشند که بلافاصله پس از نویسه '%' قرار میگیرد. کلید نگاشت، مقداری را که باید قالببندی شود از نگاشت انتخاب میکند. برای مثال:
>>> print('%(language)s has %(number)03d quote types.' % ... {'language': "Python", "number": 2}) Python has 002 quote types.
در این حالت، هیچ مشخصکنندهی * نمیتواند در قالب ظاهر شود (زیرا این مشخصکنندهها به یک فهرست پارامتر ترتیبی نیاز دارند).
نویسههای پرچم تبدیل عبارتند از:
پرچم |
معنی |
|---|---|
|
تبدیل مقدار از «قالب جایگزین» استفاده خواهد کرد (که در زیر تعریف شده است). |
|
برای مقادیر عددی، تبدیل با صفر پر میشود. |
|
مقدار تبدیلشده چپچین میشود (اگر هر دو داده شوند، تبدیل |
|
(یک فاصله) باید پیش از یک عدد مثبت (یا رشتهی خالی) که از یک تبدیل علامتدار حاصل میشود، یک فاصله گذاشته شود. |
|
یک نویسهی علامت ( |
یک تغییردهنده طول (h، l یا L) ممکن است وجود داشته باشد، اما نادیده گرفته میشود زیرا برای پایتون ضروری نیست — بنابراین مثلاً %ld معادل %d است.
انواع تبدیل عبارتند از:
تبدیل |
معنی |
یادداشتها |
|---|---|---|
|
عدد صحیح دهدهی علامتدار. |
|
|
عدد صحیح دهدهی علامتدار. |
|
|
مقدار مبنای هشت علامتدار. |
(1) |
|
نوع منسوخ — این نوع با |
(6) |
|
مبنای شانزده علامتدار (حروف کوچک). |
(2) |
|
مبنای شانزده علامتدار (حروف بزرگ). |
(2) |
|
قالب نمایی ممیز شناور (حروف کوچک). |
(3) |
|
قالب نمایی عدد ممیز شناور (حروف بزرگ). |
(3) |
|
قالب دهدهی ممیز شناور. |
(3) |
|
قالب دهدهی ممیز شناور. |
(3) |
|
قالب ممیز شناور. اگر توان کمتر از منفی ۴ باشد یا از دقت کمتر نباشد، از قالب نمایی با حروف کوچک استفاده میشود؛ در غیر این صورت قالب اعشاری استفاده میشود. |
(4) |
|
قالب ممیز شناور. اگر توان کمتر از -۴ باشد یا از دقت کمتر نباشد، از قالب نمایی با حروف بزرگ استفاده میشود؛ در غیر این صورت قالب دهدهی به کار میرود. |
(4) |
|
نویسهی منفرد (عدد صحیح یا رشتهی تکنویسهای را میپذیرد). |
|
|
رشته (هر شیء پایتون را با استفاده از |
(5) |
|
رشته (هر شیء پایتون را با استفاده از |
(5) |
|
رشته (هر شیء پایتون را با استفاده از |
(5) |
|
هیچ آرگومانی تبدیل نمیشود و یک نویسه |
برای قالبهای ممیز شناور، نتیجه باید بهدرستی تا دقت p رقم پس از نقطه اعشار گرد شود. حالت گرد کردن مطابق با تابع توکار round() است.
یادداشتها:
حالت جایگزین باعث میشود یک مشخصکنندهی مبنای هشت ('0o') پیش از نخستین رقم درج شود.
حالت جایگزین باعث میشود یک پیشوند '0x' یا '0X' (بسته به اینکه قالب 'x' یا 'X' استفاده شده باشد) پیش از نخستین رقم درج شود.
حالت جایگزین باعث میشود نتیجه همیشه حاوی یک نقطه اعشار باشد، حتی اگر هیچ رقمی پس از آن نیاید.
دقت، تعداد ارقام پس از نقطه اعشار را تعیین میکند و مقدار پیشفرض آن ۶ است.
حالت جایگزین موجب میشود که نتیجه همیشه حاوی یک نقطه اعشار باشد و صفرهای پایانی حذف نشوند، در حالی که در غیر این صورت حذف میشدند.
دقت، تعداد ارقام معنادار پیش از نقطه اعشار و پس از آن را تعیین میکند و پیشفرض آن ۶ است.
اگر دقت N باشد، خروجی به N نویسه بریده میشود.
PEP 237 را ببینید.
از آنجا که رشتههای پایتون طول صریحی دارند، تبدیلات %s فرض نمیکنند که '\0' پایان رشته باشد.
تغییر یافته در نسخهی 3.1: تبدیلهای %f برای اعدادی که قدر مطلق آنها بیش از 1e50 است، دیگر با تبدیلهای %g جایگزین نمیشوند.
bytes، bytearray، memoryview¶انواع توکار اصلی برای دستکاری دادههای دودویی، bytes و bytearray هستند. memoryview از این انواع پشتیبانی میکند و از buffer protocol برای دسترسی به حافظهی سایر اشیای دودویی بدون نیاز به ایجاد کپی استفاده میکند.
ماژول array از ذخیرهسازی کارآمد انواع داده پایه مانند اعداد صحیح ۳۲ بیتی و مقادیر شناور با دقت مضاعف IEEE754 پشتیبانی میکند.
اشیای bytes، دنبالههای تغییرناپذیری از بایتهای تکی هستند. از آنجا که بسیاری از پروتکلهای دودویی اصلی بر پایهی کدگذاری متن ASCII هستند، اشیای bytes چندین متد ارائه میدهند که فقط هنگام کار با دادههای سازگار با ASCII معتبر هستند؛ همچنین این اشیاء به روشهای گوناگون دیگری نیز ارتباط نزدیکی با اشیای رشته دارند.
نخست، سینتکس مقادیر لفظی bytes تا حد زیادی همانند سینتکس مقادیر لفظی رشته است، بهجز اینکه یک پیشوند b افزوده میشود:
نقلقولهای تکی: b'still allows embedded "double" quotes'
علامتهای نقلقول دوتایی: b"still allows embedded 'single' quotes"
سهنقلقولی: b'''3 single quotes''', b"""3 double quotes"""
تنها نویسههای ASCII در مقادیر لفظی bytes مجاز هستند (صرفنظر از کدگذاری اعلامشدهی کد منبع). هر مقدار دودویی بیش از ۱۲۷ باید با استفاده از دنبالهی خنثیسازی مناسب در مقادیر لفظی bytes وارد شود.
همانند مقادیر لفظی رشته، مقادیر لفظی بایت نیز میتوانند از پیشوند r برای غیرفعال کردن پردازش دنبالههای خنثیسازی استفاده کنند. برای اطلاعات بیشتر دربارهی صورتهای مختلف لفظی بایت، از جمله دنبالههای خنثیسازی پشتیبانیشده، مقادیر لفظی رشته و بایت را ببینید.
در حالی که مقادیر لفظی و بازنماییهای bytes بر پایهی متن ASCII هستند، اشیای bytes در واقع مانند دنبالههای تغییرناپذیر از اعداد صحیح رفتار میکنند، بهطوری که هر مقدار در دنباله باید 0 <= x < 256 باشد (تلاش برای نقض این محدودیت باعث پرتاب ValueError میشود). این کار عمداً انجام شده است تا تأکید شود که اگرچه بسیاری از قالبهای دودویی شامل عناصر مبتنی بر ASCII هستند و میتوانند با برخی الگوریتمهای متنمحور بهطور مفید پردازش شوند، این موضوع بهطور کلی برای دادههای دودویی دلخواه صادق نیست (اعمال کورکورانهی الگوریتمهای پردازش متن بر قالبهای داده دودویی که با ASCII سازگار نیستند، معمولاً منجر به خرابی دادهها میشود).
علاوه بر قالبهای لفظی، میتوان اشیای bytes را به روشهای دیگری نیز ایجاد کرد:
یک شیء بایت با طول مشخص که با صفر پر شده است: bytes(10)
از یک پیمایشپذیر از اعداد صحیح: bytes(range(20))
کپی دادههای دودویی موجود از طریق پروتکل بافر : bytes(obj)
همچنین bytes توکار را ببینید.
از آنجا که ۲ رقم مبنای شانزده دقیقاً متناظر با یک بایت هستند، اعداد مبنای شانزده قالبی رایج برای توصیف دادههای دودویی هستند. بر همین اساس، نوع bytes یک متد کلاسی اضافی برای خواندن دادهها در آن قالب دارد:
این متد کلاس bytes، با کدگشایی شیء رشتهی دادهشده، یک شیء bytes برمیگرداند. این رشته باید به ازای هر بایت دو رقم مبنای شانزده داشته باشد؛ نویسههای فضای خالی ASCII نادیده گرفته میشوند.
>>> bytes.fromhex('2Ef0 F1f2 ') b'.\xf0\xf1\xf2'
تغییر یافته در نسخهی 3.7: bytes.fromhex() اکنون تمام نویسههای فضای سفید ASCII در رشته را نادیده میگیرد، نه فقط فاصلهها.
تغییر یافته در نسخهی 3.14: bytes.fromhex() اکنون bytes ASCII و اشیاء شبهبایت را بهعنوان ورودی میپذیرد.
یک تابع تبدیل معکوس وجود دارد که شیء bytes را به نمایش مبنای شانزدهی آن تبدیل میکند.
یک شیء رشته برمیگرداند که حاوی دو رقم مبنای شانزده برای هر بایت در نمونه است.
>>> b'\xf0\xf1\xf2'.hex() 'f0f1f2'
اگر میخواهید رشتهی مبنای شانزده را خوانا کنید، میتوانید با استفاده از پارامتر sep یک جداکنندهی تکنویسهای را مشخص کنید تا در خروجی گنجانده شود. بهطور پیشفرض، این جداکننده بین هر بایت قرار میگیرد. پارامتر اختیاری دوم bytes_per_sep فاصلهگذاری را کنترل میکند. مقادیر مثبت موقعیت جداکننده را از راست محاسبه میکنند و مقادیر منفی آن را از چپ محاسبه میکنند.
>>> value = b'\xf0\xf1\xf2' >>> value.hex('-') 'f0-f1-f2' >>> value.hex('_', 2) 'f0_f1f2' >>> b'UUDDLRLRAB'.hex(' ', -4) '55554444 4c524c52 4142'
اضافه شده در نسخهی 3.5.
تغییر یافته در نسخهی 3.8: bytes.hex() اکنون از پارامترهای اختیاری sep و bytes_per_sep برای درج جداکنندهها بین بایتها در خروجی مبنای شانزده پشتیبانی میکند.
از آنجا که اشیای بایتی دنبالههایی از اعداد صحیح هستند (شبیه به یک تاپل)، برای یک شیء بایتی با نام b، عبارت b[0] یک عدد صحیح خواهد بود، در حالی که b[0:1] یک شیء بایتی به طول ۱ خواهد بود. (این موضوع با رشتههای متنی در تضاد است، که در آنها هم اندیسدهی و هم اسلایس، یک رشته به طول ۱ تولید میکنند)
نمایش اشیای bytes از قالب لفظی (b'...') استفاده میکند، زیرا اغلب از مثلاً bytes([46, 46, 46]) مفیدتر است. شما همیشه میتوانید یک شیء bytes را با استفاده از list(b) به فهرستی از اعداد صحیح تبدیل کنید.
اشیای bytearray همتای تغییرپذیر اشیای bytes هستند.
هیچ سینتکس لفظی اختصاصی برای اشیاء bytearray وجود ندارد، بلکه آنها همیشه با فراخوانی سازنده ایجاد میشوند:
ایجاد یک نمونه خالی: bytearray()
ایجاد یک نمونهی پرشده با صفر با طول مشخص: bytearray(10)
از یک پیمایشپذیر از اعداد صحیح: bytearray(range(20))
کپی دادههای دودویی موجود از طریق پروتکل بافر : bytearray(b'Hi!')
از آنجا که اشیای bytearray تغییرپذیر هستند، علاوه بر عملیات رایج bytes و bytearray که در عملیات bytes و bytearray توصیف شدهاند، از عملیات دنبالههای تغییرپذیر نیز پشتیبانی میکنند.
همچنین bytearray توکار را ببینید.
از آنجا که ۲ رقم مبنای شانزده دقیقاً متناظر با یک بایت است، اعداد مبنای شانزده قالبی رایج برای توصیف دادههای دودویی هستند. بر همین اساس، نوع bytearray یک متد کلاسی اضافی برای خواندن دادهها در آن قالب دارد:
این متد کلاس bytearray یک شیء bytearray برمیگرداند، با کدگشاییِ شیءِ رشتهی داده شده. رشته باید شامل دو رقم مبنای شانزده برای هر بایت باشد، با نادیده گرفتنِ فضای خالی اسکی.
>>> bytearray.fromhex('2Ef0 F1f2 ') bytearray(b'.\xf0\xf1\xf2')
تغییر یافته در نسخهی 3.7: bytearray.fromhex() اکنون تمام فضای سفید ASCII در رشته را نادیده میگیرد، نه فقط فاصلهها را.
تغییر یافته در نسخهی 3.14: bytearray.fromhex() اکنون bytes ASCII و اشیاء شبهبایت (bytes-like objects) را بهعنوان ورودی میپذیرد.
تابع تبدیل معکوسی برای تبدیل یک شیء bytearray به بازنمایی مبنای شانزده آن وجود دارد.
یک شیء رشته برمیگرداند که حاوی دو رقم مبنای شانزده برای هر بایت در نمونه است.
>>> bytearray(b'\xf0\xf1\xf2').hex() 'f0f1f2'
اضافه شده در نسخهی 3.5.
تغییر یافته در نسخهی 3.8: مشابه bytes.hex()، bytearray.hex() اکنون از پارامترهای اختیاری sep و bytes_per_sep برای درج جداکنندهها بین بایتها در خروجی مبنای شانزده پشتیبانی میکند.
اندازهی bytearray را تغییر دهید تا حاوی size بایت باشد. size باید بزرگتر یا مساوی ۰ باشد.
اگر bytearray نیاز به کوچکشدن داشته باشد، بایتهای فراتر از size بریده میشوند.
اگر نیاز باشد bytearray بزرگتر شود، تمام بایتهای جدید، یعنی آنهایی که فراتر از size هستند، به بایتهای null تنظیم خواهند شد.
این معادل است با:
>>> def resize(ba, size): ... if len(ba) > size: ... del ba[size:] ... else: ... ba += b'\0' * (size - len(ba))
مثالها:
>>> shrink = bytearray(b'abc') >>> shrink.resize(1) >>> (shrink, len(shrink)) (bytearray(b'a'), 1) >>> grow = bytearray(b'abc') >>> grow.resize(5) >>> (grow, len(grow)) (bytearray(b'abc\x00\x00'), 5)
اضافه شده در نسخهی 3.14.
اولین n بایت را از bytearray حذف کرده و آنها را به عنوان یک bytes تغییرناپذیر برگردانید. به طور پیشفرض (اگر n برابر با None باشد)، تمام بایتها را برگردانده و bytearray را پاک کنید.
اگر n منفی باشد، اندیس را از انتها حساب کنید و مجموع طول len() به اضافهی n بایت را بگیرید. اگر n خارج از کران باشد، IndexError را ایجاد کنید.
گرفتن مقداری کمتر از کل طول، بایتهای باقیمانده را در bytearray باقی میگذارد که این امر نیازمند یک کپی است. اگر بایتهای باقیمانده باید کنار گذاشته شوند، از resize() یا del برای برش زدن استفاده کنید و سپس take_bytes() را بدون اندازه فراخوانی کنید.
گرفتن تمام بایتها یک عملیات بدون کپی است.
اضافه شده در نسخهی 3.15: برای الگوهای کد رایجی که میتوانند با bytearray.take_bytes() بهینهسازی شوند، ورودی What's New را ببینید.
از آنجا که اشیای bytearray دنبالههایی از اعداد صحیح هستند (شبیه به یک فهرست)، برای یک شیء bytearray با نام b، b[0] یک عدد صحیح خواهد بود، در حالی که b[0:1] یک شیء bytearray به طول ۱ خواهد بود. (این موضوع با رشتههای متنی تفاوت دارد، که در آنها هم اندیسدهی و هم اسلایس، یک رشته به طول ۱ تولید میکنند)
نمایش اشیای bytearray از قالب لفظی bytes استفاده میکند (bytearray(b'...'))، زیرا اغلب مفیدتر از مثلاً bytearray([46, 46, 46]) است. شما همیشه میتوانید یک شیء bytearray را با استفاده از list(b) به فهرستی از اعداد صحیح تبدیل کنید.
همچنین ببینید
برای اطلاعات دقیق در مورد تضمینهای ایمنی نخ برای اشیاء bytearray، به ایمنی نخی برای اشیاء bytearray مراجعه کنید.
اشیاء bytes و bytearray هر دو از عملیات دنبالهای common پشتیبانی میکنند. آنها نهتنها با عملوندهایی از همان نوع، بلکه با هر bytes-like object تعامل دارند. به دلیل همین انعطافپذیری، میتوان آنها را آزادانه در عملیات ترکیب کرد، بدون اینکه خطایی رخ دهد. با این حال، نوع بازگشتی نتیجه ممکن است به ترتیب عملوندها بستگی داشته باشد.
نکته
متدهای اشیای bytes و bytearray، رشتهها را بهعنوان آرگومانهای خود نمیپذیرند، همانطور که متدهای رشتهها نیز bytes را بهعنوان آرگومانهای خود نمیپذیرند. برای مثال، باید اینگونه بنویسید:
a = "abc" b = a.replace("a", "f")
و:
a = b"abc" b = a.replace(b"a", b"f")
برخی از عملیات bytes و bytearray استفاده از قالبهای دودویی سازگار با ASCII را فرض میکنند، و بنابراین باید هنگام کار با دادههای دودویی دلخواه از آنها اجتناب شود. این محدودیتها در زیر توضیح داده شدهاند.
نکته
استفاده از این عملیات مبتنی بر ASCII برای دستکاری دادههای دودویی که در قالب مبتنی بر ASCII ذخیرهنشدهاند، ممکن است منجر به خرابی دادهها شود.
متدهای زیر بر روی اشیاء bytes و bytearray برای دادههای دودویی دلخواه قابل استفادهاند.
تعداد رخدادهای غیرهمپوشان زیردنبالهی sub در بازهی [start، end] را برمیگرداند. آرگومانهای اختیاری start و end مانند نمادگذاری اسلایس تفسیر میشوند.
زیردنبالهی مورد جستجو میتواند هر bytes-like object یا عدد صحیحی در بازهی ۰ تا ۲۵۵ باشد.
اگر sub خالی باشد، تعداد اسلایسهای خالی بین نویسهها را برمیگرداند که برابر با طول شیء بایتها بهعلاوهی ۱ است.
تغییر یافته در نسخهی 3.3: همچنین یک عدد صحیح در بازهی ۰ تا ۲۵۵ بهعنوان زیردنباله پذیرفته میشود.
اگر دادههای دودویی با رشتهی prefix شروع شوند، bytes[len(prefix):] را برگردانید. در غیر این صورت، یک کپی از دادههای دودویی اصلی را برگردانید:
>>> b'TestHook'.removeprefix(b'Test') b'Hook' >>> b'BaseTestCase'.removeprefix(b'Test') b'BaseTestCase'
prefix میتواند هر bytes-like object باشد.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
اضافه شده در نسخهی 3.9.
اگر دادههای دودویی به رشتهی suffix ختم شود و آن suffix خالی نباشد، bytes[:-len(suffix)] را برمیگرداند. در غیر این صورت، یک کپی از دادههای دودویی اصلی را برمیگرداند:
>>> b'MiscTests'.removesuffix(b'Tests') b'Misc' >>> b'TmpDirMixin'.removesuffix(b'Tests') b'TmpDirMixin'
suffix میتواند هر شیء شبهبایت باشد.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
اضافه شده در نسخهی 3.9.
بایتهای کدگشاییشده به یک str را برمیگرداند.
encoding بهطور پیشفرض 'utf-8' است؛ برای مقادیر ممکن به کدگذاریهای استاندارد مراجعه کنید.
errors نحوه مدیریت خطاهای کدگشایی را کنترل میکند. اگر 'strict' (پیشفرض) باشد، استثنای UnicodeError پرتاب میشود. سایر مقدارهای ممکن عبارتند از 'ignore'، 'replace' و هر نام دیگری که از طریق codecs.register_error() ثبتشده باشد. برای جزئیات، هندلرهای خطا را ببینید.
به دلایل کارایی، مقدار errors از نظر اعتبار بررسی نمیشود، مگر اینکه واقعاً یک خطای کدگشایی رخ دهد، حالت توسعه پایتون فعال باشد یا از یک ساخت اشکالزدایی استفاده شود.
نکته
با ارسال آرگومان encoding به str، میتوان هر bytes-like object را بهطور مستقیم کدگشایی کرد، بدون اینکه نیازی به ایجاد یک شیء موقت bytes یا bytearray باشد.
تغییر یافته در نسخهی 3.1: پشتیبانی از آرگومانهای کلیدواژهای اضافه شد.
تغییر یافته در نسخهی 3.9: مقدار آرگومان errors اکنون در حالت توسعه و در حالت اشکالزدایی بررسی میشود.
اگر دادهی دودویی به suffix مشخصشده ختم شود، True را برمیگرداند، در غیر این صورت False را برمیگرداند. suffix همچنین میتواند تاپلی از پسوندها برای جستوجو باشد. با start اختیاری، آزمون از آن موقعیت آغاز میشود. با end اختیاری، مقایسه در آن موقعیت متوقف میشود.
پسوند(ها)ی مورد جستوجو میتوانند هر شیء شبهبایت باشند.
کمترین اندیس در داده را برمیگرداند که زیردنباله sub در آن یافت میشود، بهطوری که sub در اسلایس s[start:end] قرار داشته باشد. آرگومانهای اختیاری start و end مانند نماد اسلایس تفسیر میشوند. اگر sub یافت نشود، -1 برگردانده میشود.
زیردنبالهی مورد جستجو میتواند هر bytes-like object یا عدد صحیحی در بازهی ۰ تا ۲۵۵ باشد.
نکته
از متد find() فقط زمانی باید استفاده کنید که نیاز دارید جایگاه sub را بدانید. برای بررسی اینکه آیا sub یک زیررشته است یا خیر، از عملگر in استفاده کنید:
>>> b'Py' in b'Python' True
تغییر یافته در نسخهی 3.3: همچنین یک عدد صحیح در بازهی ۰ تا ۲۵۵ بهعنوان زیردنباله پذیرفته میشود.
مانند find()، اما اگر زیردنباله یافت نشد، ValueError را پرتاب میکند.
زیردنبالهی مورد جستجو میتواند هر bytes-like object یا عدد صحیحی در بازهی ۰ تا ۲۵۵ باشد.
تغییر یافته در نسخهی 3.3: همچنین یک عدد صحیح در بازهی ۰ تا ۲۵۵ بهعنوان زیردنباله پذیرفته میشود.
یک شیء bytes یا bytearray برمیگرداند که حاصل الحاق دنبالههای داده دودویی در iterable است. اگر در iterable مقادیری، از جمله اشیاء str، وجود داشته باشند که اشیاء شبهبایت نباشند، یک TypeError پرتاب خواهد شد. جداکننده میان عناصر، محتوای شیء bytes یا bytearray ای است که این متد را ارائه میدهد.
این متد ایستا یک جدول ترجمه قابلاستفاده برای bytes.translate() برمیگرداند که هر نویسه در from را به نویسهای در همان جایگاه در to نگاشت میکند؛ from و to هر دو باید bytes-like objects باشند و طول یکسانی داشته باشند.
اضافه شده در نسخهی 3.1.
دنباله را در نخستین رخداد sep جدا میکند و یک ۳-تایی حاوی بخش پیش از جداکننده، خود جداکننده یا کپی bytearray آن، و بخش پس از جداکننده برمیگرداند. اگر جداکننده پیدا نشود، یک ۳-تایی حاوی یک کپی از دنباله اصلی و سپس دو شیء خالی bytes یا bytearray برمیگرداند.
جداکنندهی مورد جستجو میتواند هر شیء شبهبایت باشد.
یک کپی از دنباله را برمیگرداند که در آن تمام موارد زیردنبالهی old با new جایگزین شدهاند. اگر count داده شود، فقط count مورد اول جایگزین میشوند. اگر count مشخص نشده باشد یا -1 باشد، تمام موارد جایگزین میشوند.
زیردنبالهای که باید جستجو شود و جایگزین آن میتوانند هر bytes-like object باشند.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
تغییر یافته در نسخهی 3.15: count اکنون بهعنوان یک آرگومان کلیدواژهای پشتیبانی میشود.
بزرگترین اندیسی در دنباله را برمیگرداند که زیردنبالهی sub در آن یافت میشود، بهطوریکه sub در s[start:end] قرار داشته باشد. آرگومانهای اختیاری start و end مانند نماد اسلایس تفسیر میشوند. در صورت شکست، -1 برمیگرداند.
زیردنبالهی مورد جستجو میتواند هر bytes-like object یا عدد صحیحی در بازهی ۰ تا ۲۵۵ باشد.
تغییر یافته در نسخهی 3.3: همچنین یک عدد صحیح در بازهی ۰ تا ۲۵۵ بهعنوان زیردنباله پذیرفته میشود.
مانند rfind() است، اما اگر زیردنبالهی sub یافت نشد، استثنای ValueError را پرتاب میکند.
زیردنبالهی مورد جستجو میتواند هر bytes-like object یا عدد صحیحی در بازهی ۰ تا ۲۵۵ باشد.
تغییر یافته در نسخهی 3.3: همچنین یک عدد صحیح در بازهی ۰ تا ۲۵۵ بهعنوان زیردنباله پذیرفته میشود.
دنباله را در آخرین رخداد sep میشکند و یک تاپل سهتایی برمیگرداند که شامل بخش پیش از جداکننده، خود جداکننده یا نسخهی bytearray آن، و بخش پس از جداکننده است. اگر جداکننده پیدا نشود، یک تاپل سهتایی شامل دو شیء خالی از نوع bytes یا bytearray، و به دنبال آن یک نسخه از دنبالهی اصلی برمیگرداند.
جداکنندهی مورد جستجو میتواند هر شیء شبهبایت باشد.
اگر دادهی دودویی با prefix مشخصشده آغاز شود، True و در غیر این صورت False برمیگرداند. prefix همچنین میتواند یک تاپل از پیشوندها برای جستجو باشد. با start اختیاری، بررسی از آن موقعیت آغاز میشود. با end اختیاری، مقایسه در آن موقعیت متوقف میشود.
پیشوند(ها)ی مورد جستجو میتوانند هر bytes-like object باشند.
نسخهای از شیء bytes یا bytearray برمیگرداند که در آن تمام بایتهای موجود در آرگومان اختیاری delete حذف شدهاند و بایتهای باقیمانده از طریق جدول ترجمهی دادهشده، که باید یک شیء bytes به طول ۲۵۶ باشد، نگاشت شدهاند.
شما میتوانید از متد bytes.maketrans() برای ایجاد یک جدول ترجمه استفاده کنید.
برای ترجمههایی که فقط نویسهها را حذف میکنند، آرگومان table را روی None تنظیم کنید:
>>> b'read this short text'.translate(None, b'aeiou') b'rd ths shrt txt'
تغییر یافته در نسخهی 3.6: اکنون از delete بهعنوان آرگومان کلیدواژهای پشتیبانی میشود.
متدهای زیر برای اشیای bytes و bytearray، رفتارهای پیشفرضی دارند که استفاده از قالبهای دودویی سازگار با ASCII را فرض میکنند، اما همچنان میتوان با پاس دادن آرگومانهای مناسب، از آنها برای دادههای دودویی دلخواه استفاده کرد. توجه داشته باشید که تمام متدهای bytearray در این بخش بهصورت درجا عمل نمیکنند، بلکه اشیای جدیدی تولید میکنند.
نسخهای از شیء را برمیگرداند که در وسط دنبالهای به طول width قرار گرفته است. پر کردن با استفاده از fillbyte مشخصشده انجام میشود (پیشفرض، یک نویسه فاصله ASCII است). برای اشیای bytes، اگر width کوچکتر یا مساوی len(s) باشد، دنباله اصلی برگردانده میشود.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
یک کپی از شیء برمیگرداند که در دنبالهای به طول width چپتراز شده است. پر کردن با استفاده از fillbyte مشخصشده انجام میشود (پیشفرض یک فاصله ASCII است). برای اشیای bytes، اگر width کوچکتر یا مساوی len(s) باشد، دنباله اصلی برگردانده میشود.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
یک کپی از دنباله با بایتهای پیشینِ مشخصشده حذف شده برمیگرداند. آرگومان bytes یک دنباله دودویی است که مجموعه مقادیر بایت برای حذف را مشخص میکند. اگر حذف شود یا None باشد، آرگومان bytes به طور پیشفرض برای حذف فضای خالی اسکی است. آرگومان bytes یک پیشوند نیست؛ بلکه تمام ترکیبات مقادیر آن حذف میشوند:
>>> b' spacious '.lstrip() b'spacious ' >>> b'www.example.com'.lstrip(b'cmowz.') b'example.com'
دنبالهی دودویی مقادیر بایت برای حذف، میتواند هر bytes-like object باشد. برای متدی که یک رشتهی پیشوند واحد را به جای همهی نویسههای یک مجموعه حذف میکند، removeprefix() را ببینید. برای مثال:
>>> b'Arthur: three!'.lstrip(b'Arthur: ') b'ee!' >>> b'Arthur: three!'.removeprefix(b'Arthur: ') b'three!'
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
نسخهای از شیء را برمیگرداند که در دنبالهای به طول width راستتراز شده است. پر کردن با استفاده از fillbyte مشخصشده انجام میشود (پیشفرض یک نویسه فاصله ASCII است). برای اشیای bytes، اگر width کوچکتر یا مساوی len(s) باشد، دنباله اصلی برگردانده میشود.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
دنباله دودویی را به زیردنبالههای همنوع تقسیم میکند، با استفاده از sep به عنوان رشته جداکننده. اگر maxsplit داده شود، حداکثر maxsplit تقسیم انجام میشود، از سمت راست. اگر sep مشخص نشده یا None باشد، هر زیردنبالهای که تنها از فضای خالی اسکی تشکیل شده باشد، یک جداکننده است. به جز تقسیم از سمت راست، rsplit() مانند split() رفتار میکند که به تفصیل در ادامه توصیف شده است.
یک کپی از دنباله با بایتهای پایانیِ مشخصشده حذف شده برمیگرداند. آرگومان bytes یک دنباله دودویی است که مجموعه مقادیر بایت برای حذف را مشخص میکند. اگر حذف شود یا None باشد، آرگومان bytes به طور پیشفرض برای حذف فضای خالی اسکی است. آرگومان bytes یک پسوند نیست؛ بلکه تمام ترکیبات مقادیر آن حذف میشوند:
>>> b' spacious '.rstrip() b' spacious' >>> b'mississippi'.rstrip(b'ipz') b'mississ'
دنبالهی دودویی از مقادیر بایتی که باید حذف شوند، میتواند هر bytes-like object باشد. برای دیدن متدی که یک رشتهی پسوند واحد را حذف میکند، نه همهی یک مجموعه از نویسهها، removesuffix() را ببینید. برای مثال:
>>> b'Monty Python'.rstrip(b' Python') b'M' >>> b'Monty Python'.removesuffix(b' Python') b'Monty'
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
دنباله دودویی را با استفاده از sep بهعنوان رشته جداکننده، به زیردنبالههایی از همان نوع تقسیم میکند. اگر maxsplit داده شده باشد و نامنفی باشد، حداکثر maxsplit جداسازی انجام میشود (بنابراین، فهرست حداکثر maxsplit+1 المان خواهد داشت). اگر maxsplit مشخص نشده باشد یا -1 باشد، محدودیتی برای تعداد جداسازیها وجود ندارد (تمام جداسازیهای ممکن انجام میشوند).
اگر sep داده شود، جداکنندههای متوالی با هم گروهبندی نمیشوند و بهعنوان جداکنندهی زیردنبالههای خالی در نظر گرفته میشوند (برای مثال، b'1,,2'.split(b',') مقدار [b'1', b'', b'2'] را برمیگرداند). آرگومان sep میتواند از یک دنبالهی چندبایتی بهعنوان یک جداکننده تشکیل شود. تقسیم یک دنبالهی خالی با یک جداکنندهی مشخص، بسته به نوع شیء مورد تقسیم، [b''] یا [bytearray(b'')] را برمیگرداند. آرگومان sep میتواند هر شیء شبهبایت (bytes-like object) باشد.
برای مثال:
>>> b'1,2,3'.split(b',') [b'1', b'2', b'3'] >>> b'1,2,3'.split(b',', maxsplit=1) [b'1', b'2,3'] >>> b'1,2,,3,'.split(b',') [b'1', b'2', b'', b'3', b''] >>> b'1<>2<>3<4'.split(b'<>') [b'1', b'2', b'3<4']
اگر sep مشخص نشده یا None باشد، یک الگوریتم تقسیم متفاوت اعمال میشود: دنبالههای متوالی فضای خالی اسکی به عنوان یک جداکننده واحد در نظر گرفته میشوند، و نتیجه در ابتدا یا انتها رشته خالی نخواهد داشت اگر دنباله فضای خالی پیشین یا پایانی داشته باشد. در نتیجه، تقسیم یک دنباله خالی یا یک دنباله که تنها از فضای خالی اسکی تشکیل شده باشد بدون جداکننده مشخص شده [] برمیگرداند.
برای مثال:
>>> b'1 2 3'.split() [b'1', b'2', b'3'] >>> b'1 2 3'.split(maxsplit=1) [b'1', b'2 3'] >>> b' 1 2 3 '.split() [b'1', b'2', b'3']
یک کپی از دنباله با بایتهای پیشین و پایانیِ مشخصشده حذف شده برمیگرداند. آرگومان bytes یک دنباله دودویی است که مجموعه مقادیر بایت برای حذف را مشخص میکند. اگر حذف شود یا None باشد، آرگومان bytes به طور پیشفرض برای حذف فضای خالی اسکی است. آرگومان bytes نه یک پیشوند و نه یک پسوند است؛ بلکه تمام ترکیبات مقادیر آن حذف میشوند:
>>> b' spacious '.strip() b'spacious' >>> b'www.example.com'.strip(b'cmowz.') b'example'
دنبالهی دودویی از مقادیر بایت برای حذف میتواند هر bytes-like object باشد.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
متدهای زیر روی اشیای bytes و bytearray فرض میکنند که از قالبهای دودویی سازگار با ASCII استفاده میشود و نباید روی دادههای دودویی دلخواه اعمال شوند. توجه داشته باشید که همه متدهای bytearray در این بخش بهصورت درجا عمل نمیکنند و در عوض اشیای جدید تولید میکنند.
نسخهای از دنباله را برمیگرداند که در آن هر بایت بهعنوان یک نویسه ASCII تفسیر میشود و بایت اول به حرف بزرگ و بقیه به حروف کوچک تبدیل میشوند. مقادیر بایت غیر ASCII بدون تغییر باقی میمانند.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
یک کپی از دنباله برمیگرداند که در آن همهی نویسههای Tab ASCII با یک یا چند فاصلهی ASCII جایگزین میشوند؛ این جایگزینی به ستون جاری و اندازهی Tab دادهشده بستگی دارد. جایگاههای Tab هر tabsize بایت یکبار رخ میدهند (پیشفرض ۸ است و جایگاههای Tab در ستونهای ۰، ۸، ۱۶ و به همین ترتیب قرار میگیرند). برای بسط دنباله، ستون جاری روی صفر تنظیم میشود و دنباله بایت به بایت بررسی میشود. اگر بایت یک نویسهی Tab ASCII (b'\t') باشد، یک یا چند نویسهی فاصله در نتیجه درج میشوند تا ستون جاری برابر با جایگاه Tab بعدی شود. (خود نویسهی Tab کپی نمیشود.) اگر بایت جاری یک خط جدید ASCII (b'\n') یا بازگشت به ابتدای سطر (b'\r') باشد، کپی میشود و ستون جاری به صفر بازنشانی میشود. هر مقدار بایت دیگری بدون تغییر کپی میشود و ستون جاری یک واحد افزایش مییابد، صرفنظر از اینکه مقدار بایت هنگام چاپ چگونه نمایش داده میشود:
>>> b'01\t012\t0123\t01234'.expandtabs() b'01 012 0123 01234' >>> b'01\t012\t0123\t01234'.expandtabs(4) b'01 012 0123 01234'
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
اگر همهی بایتهای موجود در دنباله، نویسههای الفبایی ASCII یا ارقام دهدهی ASCII باشند و دنباله خالی نباشد، True را برمیگرداند؛ در غیر این صورت False را برمیگرداند. نویسههای الفبایی ASCII آن مقادیر بایتی هستند که در دنباله b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' قرار دارند. ارقام اعشاری ASCII آن مقادیر بایتی هستند که در دنباله b'0123456789' قرار دارند.
برای مثال:
>>> b'ABCabc1'.isalnum() True >>> b'ABC abc1'.isalnum() False
اگر همه بایتهای موجود در دنباله، نویسههای الفبایی ASCII باشند و دنباله خالی نباشد، True برگردانده میشود؛ در غیر این صورت False برگردانده میشود. نویسههای الفبایی ASCII، مقدارهای بایت موجود در دنباله b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' هستند.
برای مثال:
>>> b'ABCabc'.isalpha() True >>> b'ABCabc1'.isalpha() False
اگر دنباله خالی باشد یا همهی بایتهای دنباله ASCII باشند، True و در غیر این صورت False برمیگرداند. بایتهای ASCII در بازهی 0-0x7F قرار دارند.
اضافه شده در نسخهی 3.7.
اگر همهی بایتهای دنباله ارقام دهدهی ASCII باشند و دنباله خالی نباشد، True برمیگرداند؛ در غیر این صورت False برمیگرداند. ارقام دهدهی ASCII همان مقادیر بایتی موجود در دنباله b'0123456789' هستند.
برای مثال:
>>> b'1234'.isdigit() True >>> b'1.23'.isdigit() False
اگر حداقل یک نویسهی ASCII کوچک در دنباله وجود داشته باشد و هیچ نویسهی ASCII بزرگی وجود نداشته باشد، True را برمیگرداند؛ در غیر این صورت False را برمیگرداند.
برای مثال:
>>> b'hello world'.islower() True >>> b'Hello world'.islower() False
نویسههای ASCII کوچک آن مقادیر بایتی هستند که در دنباله b'abcdefghijklmnopqrstuvwxyz' قرار دارند. نویسههای ASCII بزرگ آن مقادیر بایتی هستند که در دنباله b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' قرار دارند.
اگر تمام بایتهای موجود در دنباله، نویسههای فضای سفید ASCII باشند و دنباله خالی نباشد، True را برمیگرداند؛ در غیر این صورت False را برمیگرداند. نویسههای فضای سفید ASCII، همان مقادیر بایتی موجود در دنباله b' \t\n\r\x0b\f' هستند (فاصله، تب، خط جدید، بازگشت به ابتدای سطر، تب عمودی، تغذیه فرم).
اگر دنباله ASCII و به حالت عنوانی (titlecase) باشد و خالی نباشد، True و در غیر این صورت False برمیگرداند. برای جزئیات بیشتر دربارهی تعریف «titlecase»، bytes.title() را ببینید.
برای مثال:
>>> b'Hello World'.istitle() True >>> b'Hello world'.istitle() False
اگر حداقل یک نویسهی الفبایی ASCII بزرگ در دنباله وجود داشته باشد و هیچ نویسهی ASCII کوچکی وجود نداشته باشد، True برمیگرداند، در غیر این صورت False.
برای مثال:
>>> b'HELLO WORLD'.isupper() True >>> b'Hello world'.isupper() False
نویسههای ASCII کوچک آن مقادیر بایتی هستند که در دنباله b'abcdefghijklmnopqrstuvwxyz' قرار دارند. نویسههای ASCII بزرگ آن مقادیر بایتی هستند که در دنباله b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' قرار دارند.
نسخهای از دنباله را برمیگرداند که در آن همهی نویسههای ASCII بزرگ به معادل کوچک متناظر خود تبدیل شدهاند.
برای مثال:
>>> b'Hello World'.lower() b'hello world'
نویسههای ASCII کوچک آن مقادیر بایتی هستند که در دنباله b'abcdefghijklmnopqrstuvwxyz' قرار دارند. نویسههای ASCII بزرگ آن مقادیر بایتی هستند که در دنباله b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' قرار دارند.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
فهرستی از سطرهای موجود در دنبالهی دودویی را برمیگرداند و سطرها را در مرزهای سطر ASCII میشکند. این متد از رویکرد سطرهای جدید همگانی (universal newlines) برای تقسیم سطرها استفاده میکند. نویسههای خط جدید در فهرست حاصل گنجانده نمیشوند، مگر اینکه keepends داده شود و true باشد.
برای مثال:
>>> b'ab c\n\nde fg\rkl\r\n'.splitlines() [b'ab c', b'', b'de fg', b'kl'] >>> b'ab c\n\nde fg\rkl\r\n'.splitlines(keepends=True) [b'ab c\n', b'\n', b'de fg\r', b'kl\r\n']
برخلاف split()، وقتی یک رشتهی جداکننده sep داده شود، این متد برای رشتهی خالی یک فهرست خالی برمیگرداند و یک شکست خط پایانی باعث ایجاد خط اضافی نمیشود:
>>> b"".split(b'\n'), b"Two lines\n".split(b'\n') ([b''], [b'Two lines', b'']) >>> b"".splitlines(), b"One line\n".splitlines() ([], [b'One line'])
نسخهای از دنباله را برمیگرداند که در آن تمام نویسههای ASCII کوچک به نویسهی بزرگ متناظرشان و برعکس تبدیل شدهاند.
برای مثال:
>>> b'Hello World'.swapcase() b'hELLO wORLD'
نویسههای ASCII کوچک آن مقادیر بایتی هستند که در دنباله b'abcdefghijklmnopqrstuvwxyz' قرار دارند. نویسههای ASCII بزرگ آن مقادیر بایتی هستند که در دنباله b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' قرار دارند.
برخلاف str.swapcase()، در نسخههای دودویی همیشه bin.swapcase().swapcase() == bin برقرار است. تبدیلهای حالت در ASCII متقارن هستند، اگرچه این موضوع بهطور کلی برای نقاط کد یونیکد دلخواه صادق نیست.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
یک نسخهی عنوانیشده از دنبالهی دودویی برمیگرداند که در آن کلمات با یک نویسهی ASCII بزرگ آغاز میشوند و باقی نویسهها کوچک هستند. مقادیر بایت بدون حالت حروف، بدون تغییر باقی میمانند.
برای مثال:
>>> b'Hello world'.title() b'Hello World'
نویسههای ASCII کوچک، آن مقادیر بایتی هستند که در دنباله b'abcdefghijklmnopqrstuvwxyz' قرار دارند. نویسههای ASCII بزرگ، آن مقادیر بایتی هستند که در دنباله b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' قرار دارند. تمام مقادیر بایت دیگر، بدون حالت هستند.
الگوریتم از تعریفی ساده و مستقل از زبان برای واژه استفاده میکند که بر اساس آن، واژه به صورت گروههایی از حروف پیاپی است. این تعریف در بسیاری از زمینهها کار میکند، اما به این معناست که آپاستروفها در انقباضها و صیغههای ملکی، مرز واژه تشکیل میدهند که ممکن است نتیجه مطلوب نباشد:
>>> b"they're bill's friends from the UK".title() b"They'Re Bill'S Friends From The Uk"
میتوان راهحلی موقت برای آپوستروفها با استفاده از عبارتهای باقاعده ساخت:
>>> import re >>> def titlecase(s): ... return re.sub(rb"[A-Za-z]+('[A-Za-z]+)?", ... lambda mo: mo.group(0)[0:1].upper() + ... mo.group(0)[1:].lower(), ... s) ... >>> titlecase(b"they're bill's friends.") b"They're Bill's Friends."
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
نسخهای از دنباله برمیگرداند که همه نویسههای ASCII کوچک به همتای بزرگ متناظرشان تبدیل شدهاند.
برای مثال:
>>> b'Hello World'.upper() b'HELLO WORLD'
نویسههای ASCII کوچک آن مقادیر بایتی هستند که در دنباله b'abcdefghijklmnopqrstuvwxyz' قرار دارند. نویسههای ASCII بزرگ آن مقادیر بایتی هستند که در دنباله b'ABCDEFGHIJKLMNOPQRSTUVWXYZ' قرار دارند.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
یک کپی از دنباله برمیگرداند که از سمت چپ با ارقام ASCII b'0' پر شده است تا دنبالهای به طول width بسازد. پیشوند علامت در ابتدا (b'+'/ b'-') به این صورت مدیریت میشود که نویسههای پرکننده بعد از نویسه علامت درج میشوند، نه قبل از آن. برای اشیاء bytes، اگر width کوچکتر یا مساوی len(seq) باشد، دنباله اصلی برگردانده میشود.
برای مثال:
>>> b"42".zfill(5) b'00042' >>> b"-42".zfill(5) b'-0042'
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
printf¶نکته
عملیات قالببندی توصیفشده در اینجا، دارای انواعی از رفتارهای عجیب هستند که به تعدادی از خطاهای رایج منجر میشوند (مانند عدم نمایش صحیح تاپلها و دیکشنریها). اگر مقداری که چاپ میشود ممکن است یک تاپل یا دیکشنری باشد، آن را در یک تاپل قرار دهید.
اشیاء بایت (bytes/bytearray) یک عملگر توکار منحصر به فرد دارند: عملگر % (پیمانه). این عملگر همچنین به عنوان عملگر فرمتدهی یا درونیابی بایت شناخته میشود. با داده format % values (که در آن format یک شیء بایت است)، مشخصههای تبدیل % در format با صفر یا چند المان از values جایگزین میشوند. اثر این کار مشابه استفاده از تابع sprintf() در زبان C است.
اگر format به یک آرگومان واحد نیاز داشته باشد، values ممکن است یک شیء واحد باشد که تاپل نیست. [5] در غیر این صورت، values باید یک تاپل با دقیقاً تعداد آیتمهای مشخصشده توسط شیء بایتی قالب باشد، یا یک شیء نگاشت واحد (برای مثال، یک دیکشنری).
یک مشخصکننده تبدیل شامل دو یا چند نویسه است و دارای اجزای زیر است، که باید به همین ترتیب ظاهر شوند:
نویسهی '%'، که آغاز مشخصکننده را علامتگذاری میکند.
کلید نگاشت (اختیاری)، شامل دنبالهای از نویسههای داخل پرانتز (برای مثال، (somename)).
پرچمهای تبدیل (اختیاری)، که بر نتیجهی برخی از انواع تبدیل تأثیر میگذارند.
حداقل عرض فیلد (اختیاری). اگر بهصورت '*' (ستاره) مشخص شده باشد، عرض واقعی از المان بعدی تاپل در values خوانده میشود و شیء موردنظر برای تبدیل، پس از حداقل عرض فیلد و دقت اختیاری میآید.
دقت (اختیاری)، به صورت یک '.' (نقطه) و سپس مقدار دقت داده میشود. اگر به صورت '*' (ستاره) مشخص شده باشد، دقت واقعی از آیتم بعدی تاپل در values خوانده میشود و مقداری که باید تبدیل شود، پس از دقت میآید.
اصلاحکننده طول (اختیاری).
نوع تبدیل.
هنگامی که آرگومان سمت راست یک دیکشنری (یا نوع نگاشت دیگری) باشد، قالبهای درون شیء bytes باید شامل یک کلید نگاشت داخل پرانتز برای آن دیکشنری باشند که بلافاصله پس از نویسه '%' درج شده باشد. کلید نگاشت، مقداری از نگاشت را که باید قالببندی شود انتخاب میکند. برای مثال:
>>> print(b'%(language)s has %(number)03d quote types.' % ... {b'language': b"Python", b"number": 2}) b'Python has 002 quote types.'
در این حالت، هیچ مشخصکنندهی * نمیتواند در قالب ظاهر شود (زیرا این مشخصکنندهها به یک فهرست پارامتر ترتیبی نیاز دارند).
نویسههای پرچم تبدیل عبارتند از:
پرچم |
معنی |
|---|---|
|
تبدیل مقدار از «قالب جایگزین» استفاده خواهد کرد (که در زیر تعریف شده است). |
|
برای مقادیر عددی، تبدیل با صفر پر میشود. |
|
مقدار تبدیلشده چپچین میشود (اگر هر دو داده شوند، تبدیل |
|
(یک فاصله) باید پیش از یک عدد مثبت (یا رشتهی خالی) که از یک تبدیل علامتدار حاصل میشود، یک فاصله گذاشته شود. |
|
یک نویسهی علامت ( |
یک تغییردهنده طول (h، l یا L) ممکن است وجود داشته باشد، اما نادیده گرفته میشود زیرا برای پایتون ضروری نیست — بنابراین مثلاً %ld معادل %d است.
انواع تبدیل عبارتند از:
تبدیل |
معنی |
یادداشتها |
|---|---|---|
|
عدد صحیح دهدهی علامتدار. |
|
|
عدد صحیح دهدهی علامتدار. |
|
|
مقدار مبنای هشت علامتدار. |
(1) |
|
نوع منسوخ — این نوع با |
(8) |
|
مبنای شانزده علامتدار (حروف کوچک). |
(2) |
|
مبنای شانزده علامتدار (حروف بزرگ). |
(2) |
|
قالب نمایی ممیز شناور (حروف کوچک). |
(3) |
|
قالب نمایی عدد ممیز شناور (حروف بزرگ). |
(3) |
|
قالب دهدهی ممیز شناور. |
(3) |
|
قالب دهدهی ممیز شناور. |
(3) |
|
قالب ممیز شناور. اگر توان کمتر از منفی ۴ باشد یا از دقت کمتر نباشد، از قالب نمایی با حروف کوچک استفاده میشود؛ در غیر این صورت قالب اعشاری استفاده میشود. |
(4) |
|
قالب ممیز شناور. اگر توان کمتر از -۴ باشد یا از دقت کمتر نباشد، از قالب نمایی با حروف بزرگ استفاده میشود؛ در غیر این صورت قالب دهدهی به کار میرود. |
(4) |
|
تکبایت (عدد صحیح یا اشیای تکبایتی را میپذیرد). |
|
|
بایتها (هر شیءای که از buffer protocol پیروی کند یا دارای |
(5) |
|
|
(6) |
|
بایتها (هر شیء پایتون را با استفاده از |
(5) |
|
|
(7) |
|
هیچ آرگومانی تبدیل نمیشود و یک نویسه |
یادداشتها:
حالت جایگزین باعث میشود یک مشخصکنندهی مبنای هشت ('0o') پیش از نخستین رقم درج شود.
حالت جایگزین باعث میشود یک پیشوند '0x' یا '0X' (بسته به اینکه قالب 'x' یا 'X' استفاده شده باشد) پیش از نخستین رقم درج شود.
حالت جایگزین باعث میشود نتیجه همیشه حاوی یک نقطه اعشار باشد، حتی اگر هیچ رقمی پس از آن نیاید.
دقت، تعداد ارقام پس از نقطه اعشار را تعیین میکند و مقدار پیشفرض آن ۶ است.
حالت جایگزین موجب میشود که نتیجه همیشه حاوی یک نقطه اعشار باشد و صفرهای پایانی حذف نشوند، در حالی که در غیر این صورت حذف میشدند.
دقت، تعداد ارقام معنادار پیش از نقطه اعشار و پس از آن را تعیین میکند و پیشفرض آن ۶ است.
اگر دقت N باشد، خروجی به N نویسه بریده میشود.
b'%s' منسوخ شده است، اما در طول سری 3.x حذف نخواهد شد.
b'%r' منسوخ شده است، اما در طول سری 3.x حذف نخواهد شد.
PEP 237 را ببینید.
نکته
نسخهی bytearray این متد بهصورت درجا عمل نمیکند؛ همیشه یک شیء جدید تولید میکند، حتی اگر هیچ تغییری اعمال نشده باشد.
همچنین ببینید
PEP 461 - افزودن قالببندی % به bytes و bytearray
اضافه شده در نسخهی 3.5.
اشیای memoryview به کد پایتون اجازه میدهند تا بدون کپی کردن، به دادههای داخلی شیءای که از buffer protocol پشتیبانی میکند، دسترسی داشته باشد.
یک memoryview ایجاد کنید که به object ارجاع دارد. object باید از پروتکل بافر پشتیبانی کند. اشیاء توکاری که از پروتکل بافر پشتیبانی میکنند، شامل bytes و bytearray هستند.
یک memoryview دارای مفهوم المان است، که واحد اتمی حافظهای است که توسط شیء مبدأ مدیریت میشود. برای بسیاری از انواع ساده مانند bytes و bytearray، یک المان یک بایت واحد است، اما انواع دیگر مانند array.array ممکن است المانهای بزرگتری داشته باشند.
نمونههای memoryview نسبت به نوع دادهی زیربنایی خود عام هستند.
len(view) برابر با طول tolist() است، که نمایش فهرست تو در توِ نما میباشد. اگر view.ndim == 1 باشد، این برابر با تعداد المانها در نما است.
تغییر یافته در نسخهی 3.12: اگر view.ndim == 0 باشد، len(view) اکنون به جای برگرداندن ۱، TypeError پرتاب میکند.
ویژگی itemsize تعداد بایتهای یک عنصر را به شما میدهد.
یک memoryview از اسلایس کردن و اندیسدهی برای آشکار کردن دادههای خود پشتیبانی میکند. اسلایس یکبعدی منجر به یک زیرنما میشود:
>>> v = memoryview(b'abcefg') >>> v[1] 98 >>> v[-1] 103 >>> v[1:4] <memory at 0x7f3ddc9f4350> >>> bytes(v[1:4]) b'bce'
اگر format یکی از مشخصکنندههای قالب بومی ماژول struct باشد، اندیسدهی با یک عدد صحیح یا تاپلی از اعداد صحیح نیز پشتیبانی میشود و یک المان واحد با نوع صحیح را برمیگرداند. memoryviewهای یکبعدی را میتوان با یک عدد صحیح یا تاپلی شامل یک عدد صحیح اندیسدهی کرد. memoryviewهای چندبُعدی را میتوان با تاپلهایی شامل دقیقاً ndim عدد صحیح اندیسدهی کرد، که ndim تعداد ابعاد است. memoryviewهای صفربعدی را میتوان با تاپل خالی اندیسدهی کرد.
در اینجا مثالی با یک قالب غیربایتی آمده است:
>>> import array >>> a = array.array('l', [-11111111, 22222222, -33333333, 44444444]) >>> m = memoryview(a) >>> m[0] -11111111 >>> m[-1] 44444444 >>> m[::2].tolist() [-11111111, -33333333]
اگر شیء زیرین قابل نوشتن باشد، memoryview از انتساب اسلایس یکبعدی پشتیبانی میکند. تغییر اندازه مجاز نیست:
>>> data = bytearray(b'abcefg') >>> v = memoryview(data) >>> v.readonly False >>> v[0] = ord(b'z') >>> data bytearray(b'zbcefg') >>> v[1:4] = b'123' >>> data bytearray(b'z123fg') >>> v[2:3] = b'spam' Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: memoryview assignment: lvalue and rvalue have different structures >>> v[2:6] = b'spam' >>> data bytearray(b'z1spam')
memoryview های یکبعدی از انواع hashable (فقطخواندنی) با قالبهای 'B'، 'b' یا 'c' نیز هشپذیر هستند. هش بهصورت hash(m) == hash(m.tobytes()) تعریف شده است:
>>> v = memoryview(b'abcefg') >>> hash(v) == hash(b'abcefg') True >>> hash(v[2:4]) == hash(b'ce') True >>> hash(v[::-2]) == hash(b'abcefg'[::-2]) True
تغییر یافته در نسخهی 3.3: اکنون میتوان memoryviewهای یکبعدی را اسلایس داد. memoryviewهای یکبعدی با قالبهای 'B'، 'b' یا 'c' اکنون hashable هستند.
تغییر یافته در نسخهی 3.4: memoryview اکنون بهطور خودکار در collections.abc.Sequence ثبت شده است
تغییر یافته در نسخهی 3.5: اکنون memoryviewها میتوانند با یک تاپل از اعداد صحیح اندیسگذاری شوند.
تغییر یافته در نسخهی 3.14: memoryview اکنون یک نوع عام است.
memoryview چندین متد دارد:
یک memoryview و یک اکسپورتکننده (exporter) PEP 3118 برابر هستند اگر شکلهای آنها معادل باشد و اگر تمام مقادیر متناظر، هنگامی که کدهای قالب مربوط به هر یک از عملوندها با استفاده از سینتکس struct تفسیر شوند، برابر باشند.
برای زیرمجموعهای از رشتههای قالب struct که در حال حاضر توسط tolist() پشتیبانی میشوند، v و w زمانی برابرند که v.tolist() == w.tolist():
>>> import array >>> a = array.array('I', [1, 2, 3, 4, 5]) >>> b = array.array('d', [1.0, 2.0, 3.0, 4.0, 5.0]) >>> c = array.array('b', [5, 3, 1]) >>> x = memoryview(a) >>> y = memoryview(b) >>> x == a == y == b True >>> x.tolist() == a.tolist() == y.tolist() == b.tolist() True >>> z = y[::-2] >>> z == c True >>> z.tolist() == c.tolist() True
اگر ماژول struct از هر یک از رشتههای قالب پشتیبانی نکند، آنگاه اشیاء همیشه در مقایسه نابرابر خواهند بود (حتی اگر رشتههای قالب و محتوای بافر یکسان باشند):
>>> from ctypes import BigEndianStructure, c_long >>> class BEPoint(BigEndianStructure): ... _fields_ = [("x", c_long), ("y", c_long)] ... >>> point = BEPoint(100, 200) >>> a = memoryview(point) >>> b = memoryview(point) >>> a == point False >>> a == b False
توجه داشته باشید که همانند اعداد ممیز شناور، v is w برای اشیای memoryview به معنای v == w نیست.
تغییر یافته در نسخهی 3.3: نسخههای پیشین، حافظه خام را بدون توجه به قالب آیتم و ساختار منطقی آرایه مقایسه میکردند.
دادههای درون بافر را بهصورت یک رشته بایتی بازمیگرداند. این معادل فراخوانی سازندهی bytes روی memoryview است.
>>> m = memoryview(b"abc") >>> m.tobytes() b'abc' >>> bytes(m) b'abc'
برای آرایههای غیرپیوسته، نتیجه برابر با بازنمایی فهرست مسطحشده است که همهی عناصر آن به بایت تبدیلشدهاند. tobytes() از همهی رشتههای قالب پشتیبانی میکند، از جمله آنهایی که در سینتکس ماژول struct نیستند.
اضافه شده در نسخهی 3.8: order میتواند {'C', 'F', 'A'} باشد. وقتی order برابر 'C' یا 'F' باشد، دادههای آرایه اصلی به ترتیب C یا Fortran تبدیل میشوند. برای نماهای پیوسته، 'A' یک کپی دقیق از حافظه فیزیکی برمیگرداند. بهطور خاص، ترتیب Fortran در حافظه حفظ میشود. برای نماهای ناپیوسته، دادهها ابتدا به C تبدیل میشوند. order=None همان order='C' است.
یک شیء رشته برمیگرداند که شامل دو رقم مبنای شانزده برای هر بایت در بافر است.
>>> m = memoryview(b"abc") >>> m.hex() '616263'
اضافه شده در نسخهی 3.5.
تغییر یافته در نسخهی 3.8: مشابه bytes.hex()، memoryview.hex() اکنون از پارامترهای اختیاری sep و bytes_per_sep برای درج جداکنندهها بین بایتها در خروجی مبنای شانزده پشتیبانی میکند.
دادههای درون بافر را بهعنوان فهرستی از المانها برمیگرداند.
>>> memoryview(b'abc').tolist() [97, 98, 99] >>> import array >>> a = array.array('d', [1.1, 2.2, 3.3]) >>> m = memoryview(a) >>> m.tolist() [1.1, 2.2, 3.3]
یک نسخه فقطخواندنی از شیء memoryview برمیگرداند. شیء memoryview اصلی بدون تغییر میماند.
>>> m = memoryview(bytearray(b'abc')) >>> mm = m.toreadonly() >>> mm.tolist() [97, 98, 99] >>> mm[0] = 42 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot modify read-only memory >>> m[0] = 43 >>> mm.tolist() [43, 98, 99]
اضافه شده در نسخهی 3.8.
بافر زیرینی را که توسط شیء memoryview در معرض قرار گرفته است، آزاد کنید. بسیاری از شیءها هنگامی که یک نما روی آنها نگهداری میشود، اقدامات ویژهای انجام میدهند (برای مثال، یک bytearray بهطور موقت تغییر اندازه را ممنوع میکند)؛ بنابراین، فراخوانی release() برای برطرف کردن این محدودیتها (و آزاد کردن هرگونه منبع معلق) در سریعترین زمان ممکن مفید است.
پس از فراخوانی این متد، هرگونه عملیات بعدی بر روی نما یک ValueError پرتاب میکند (بهجز خود release() که میتواند چندین بار فراخوانی شود):
>>> m = memoryview(b'abc') >>> m.release() >>> m[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operation forbidden on released memoryview object
میتوان از پروتکل مدیریت زمینه برای نتیجهای مشابه، با استفاده از دستور with استفاده کرد:
>>> with memoryview(b'abc') as m: ... m[0] ... 97 >>> m[0] Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: operation forbidden on released memoryview object
اضافه شده در نسخهی 3.2.
یک memoryview را به قالب یا شکل جدیدی تبدیل میکند. مقدار پیشفرض shape برابر [byte_length//new_itemsize] است، که به این معناست که نمای حاصل یکبعدی خواهد بود. مقدار بازگشتی یک memoryview جدید است، اما خود بافر کپی نمیشود. تبدیلهای نوعی پشتیبانیشده عبارتند از 1D -> C-contiguous و C-contiguous -> 1D.
قالب مقصد به یک قالب بومی تکعنصری در سینتکس struct محدود است. یکی از قالبها باید یک قالب بایت ('B'، 'b' یا 'c') باشد. طول بایتی نتیجه باید با طول اصلی یکسان باشد. توجه داشته باشید که همهی طولهای بایتی ممکن است به سیستمعامل وابسته باشند.
تبدیل 1D/long به 1D/unsigned bytes:
>>> import array >>> a = array.array('l', [1,2,3]) >>> x = memoryview(a) >>> x.format 'l' >>> x.itemsize 8 >>> len(x) 3 >>> x.nbytes 24 >>> y = x.cast('B') >>> y.format 'B' >>> y.itemsize 1 >>> len(y) 24 >>> y.nbytes 24
تبدیل بایتهای یکبعدی/بدون علامت به یکبعدی/char:
>>> b = bytearray(b'zyz') >>> x = memoryview(b) >>> x[0] = b'a' Traceback (most recent call last): ... TypeError: memoryview: invalid type for format 'B' >>> y = x.cast('c') >>> y[0] = b'a' >>> b bytearray(b'ayz')
تبدیل 1D/bytes به 3D/ints و سپس به 1D/signed char:
>>> import struct >>> buf = struct.pack("i"*12, *list(range(12))) >>> x = memoryview(buf) >>> y = x.cast('i', shape=[2,2,3]) >>> y.tolist() [[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]] >>> y.format 'i' >>> y.itemsize 4 >>> len(y) 2 >>> y.nbytes 48 >>> z = y.cast('b') >>> z.format 'b' >>> z.itemsize 1 >>> len(z) 48 >>> z.nbytes 48
تبدیل 1D/unsigned long به 2D/unsigned long:
>>> buf = struct.pack("L"*6, *list(range(6))) >>> x = memoryview(buf) >>> y = x.cast('L', shape=[2,3]) >>> len(y) 2 >>> y.nbytes 48 >>> y.tolist() [[0, 1, 2], [3, 4, 5]]
اضافه شده در نسخهی 3.3.
تغییر یافته در نسخهی 3.5: قالب منبع دیگر هنگام تبدیل (casting) به یک نمای بایتی (byte view) محدود نیست.
تعداد رخدادهای value را میشمارد.
اضافه شده در نسخهی 3.14.
اندیس نخستین رخداد value را برمیگرداند (در اندیس start یا پس از آن و پیش از اندیس stop).
اگر value یافت نشود، یک ValueError پرتاب میشود.
اضافه شده در نسخهی 3.14.
همچنین چند ویژگی فقطخواندنی در دسترس است:
شیء زیرین memoryview:
>>> b = bytearray(b'xyz') >>> m = memoryview(b) >>> m.obj is b True
اضافه شده در نسخهی 3.3.
nbytes == product(shape) * itemsize == len(m.tobytes()). این مقدار، میزان فضایی بر حسب بایت است که آرایه در یک نمایش پیوسته اشغال میکند. این مقدار لزوماً برابر با len(m) نیست:
>>> import array >>> a = array.array('i', [1,2,3,4,5]) >>> m = memoryview(a) >>> len(m) 5 >>> m.nbytes 20 >>> y = m[::2] >>> len(y) 3 >>> y.nbytes 12 >>> len(y.tobytes()) 12
آرایههای چندبُعدی:
>>> import struct >>> buf = struct.pack("d"*12, *[1.5*x for x in range(12)]) >>> x = memoryview(buf) >>> y = x.cast('d', shape=[3,4]) >>> y.tolist() [[0.0, 1.5, 3.0, 4.5], [6.0, 7.5, 9.0, 10.5], [12.0, 13.5, 15.0, 16.5]] >>> len(y) 3 >>> y.nbytes 96
اضافه شده در نسخهی 3.3.
یک بولی که نشان میدهد حافظه فقطخواندنی است.
رشتهای حاوی قالب (به سبک ماژول struct) برای هر المان در نما. میتوان یک memoryview را از اکسپورتکنندههایی با رشتههای قالب دلخواه ایجاد کرد، اما برخی متدها (مانند tolist()) به قالبهای بومی برای یک المان محدود هستند.
تغییر یافته در نسخهی 3.3: قالب 'B' اکنون مطابق سینتکس ماژول struct پردازش میشود. این بدان معناست که memoryview(b'abc')[0] == b'abc'[0] == 97.
اندازهی هر عنصر از memoryview بر حسب بایت:
>>> import array, struct >>> m = memoryview(array.array('H', [32000, 32001, 32002])) >>> m.itemsize 2 >>> m[0] 32000 >>> struct.calcsize('H') == m.itemsize True
عدد صحیحی که نشان میدهد حافظه نشاندهنده چند بُعد از یک آرایه چندبُعدی است.
تاپلی از اعداد صحیح به طول ndim که شکل حافظه را بهعنوان یک آرایه N-بعدی مشخص میکند.
تغییر یافته در نسخهی 3.3: یک تاپل خالی بهجای None هنگامی که ndim = 0 است.
یک تاپل از اعداد صحیح به طول ndim که اندازهی لازم بر حسب بایت برای دسترسی به هر عنصر در هر بُعد از آرایه را مشخص میکند.
تغییر یافته در نسخهی 3.3: یک تاپل خالی بهجای None هنگامی که ndim = 0 است.
بهصورت داخلی برای آرایههای بهسبک PIL استفاده میشود. این مقدار فقط جنبه اطلاعرسانی دارد.
یک بولی که نشان میدهد آیا حافظه C-contiguous است یا خیر.
اضافه شده در نسخهی 3.3.
یک بولی که نشان میدهد آیا حافظه بهصورت Fortran contiguous است یا خیر.
اضافه شده در نسخهی 3.3.
یک بولی که نشان میدهد حافظه contiguous است یا خیر.
اضافه شده در نسخهی 3.3.
برای اطلاعات درباره ایمنی نخی اشیای memoryview در free-threaded build، به ایمنی نخ برای اشیای memoryview مراجعه کنید.
set، frozenset¶یک شیء مجموعه (set) یک جمعآوری نامرتب از اشیاء هشپذیر متمایز است. کاربردهای رایج شامل تست عضویت، حذف تکرارها از یک دنباله، و محاسبهی عملیات ریاضی نظیر اشتراک، اجتماع، تفاضل، و تفاضل متقارن میباشد. (برای سایر ظرفها به کلاسهای توکار dict، list، و tuple، و ماژول collections مراجعه کنید.) برای هزینههای عملیاتهای مختلف مجموعه به پیچیدگی زمانی عملیاتها روی انواع توکار مراجعه کنید.
مانند سایر مجموعهها، مجموعهها از x in set، len(set) و for x in set پشتیبانی میکنند. از آنجا که مجموعهها بدون ترتیب هستند، موقعیت عنصر یا ترتیب درج را ثبت نمیکنند. بنابراین، مجموعهها از اندیسدهی، اسلایس یا سایر رفتارهای مشابه دنباله پشتیبانی نمیکنند.
در حال حاضر دو نوع مجموعهی توکار وجود دارد: set و frozenset. نوع set تغییرپذیر است --- محتوا را میتوان با متدهایی مانند add() و remove() تغییر داد. از آنجا که این نوع تغییرپذیر است، مقدار هش ندارد و نمیتوان از آن بهعنوان کلید دیکشنری یا عنصری از مجموعهای دیگر استفاده کرد. نوع frozenset تغییرناپذیر و hashable است --- محتوای آن پس از ایجاد تغییر نمیکند؛ بنابراین میتوان از آن بهعنوان کلید دیکشنری یا عنصری از مجموعهای دیگر استفاده کرد.
مجموعههای غیرخالی (نه frozensetها) را میتوان با قرار دادن فهرستی از عناصر که با کاما از هم جدا شدهاند درون آکولاد ایجاد کرد، برای مثال: {'jack', 'sjoerd'}، علاوه بر سازندهی set.
سازندههای هر دو کلاس به یک شکل کار میکنند:
یک شیء جدید از نوع set یا frozenset برمیگرداند که عناصر آن از iterable گرفته شدهاند. عناصر یک مجموعه باید hashable باشند. برای نمایش مجموعههایی از مجموعهها، مجموعههای درونی باید اشیای frozenset باشند. اگر iterable مشخص نشده باشد، یک مجموعه خالی جدید برگردانده میشود.
مجموعهها را میتوان به چند روش ایجاد کرد:
از فهرستی از عناصر جداشده با کاما درون آکولاد استفاده کنید: {'jack', 'sjoerd'}
از یک درک مجموعهای استفاده کنید: {c for c in 'abracadabra' if c not in 'abc'}
از سازندهی نوع استفاده کنید: set()، set('foobar')، set(['a', 'b', 'foo'])
نمونههای set و frozenset عملیات زیر را فراهم میکنند:
تعداد عناصر مجموعه s را برمیگرداند (کاردینالیته s).
عضویت x در s را میآزماید.
عضویت نداشتن x در s را آزمایش میکند.
اگر مجموعه هیچ عنصر مشترکی با other نداشته باشد، True برمیگرداند. مجموعهها مجزا هستند اگر و تنها اگر اشتراک آنها مجموعه تهی باشد.
آزمایش میکند که آیا همهی عناصر مجموعه در other هستند.
آزمایش میکند که آیا مجموعه زیرمجموعهی سرهی other است، یعنی set <= other and set != other.
آزمایش میکند که آیا همه عناصر other در مجموعه وجود دارند یا خیر.
بررسی میکند که آیا مجموعه ابرمجموعه سرهای از other است یا خیر، یعنی set >= other and set != other.
یک مجموعه جدید شامل عناصری از مجموعه و همهی سایر موارد برمیگرداند.
یک مجموعه جدید برمیگرداند که شامل عناصر مشترک بین مجموعه و همه سایر مجموعهها است.
یک مجموعه جدید شامل عناصری از مجموعه که در سایر موارد نیستند برمیگرداند.
یک مجموعه جدید با عناصری که در مجموعه یا other هستند، اما نه در هر دو، برمیگرداند.
توجه داشته باشید که نسخههای غیرعملگری متدهای union()، intersection()، difference()، symmetric_difference()، issubset() و issuperset() هر پیمایشپذیری را بهعنوان آرگومان میپذیرند. در مقابل، نسخههای متناظر مبتنی بر عملگر آنها نیاز دارند که آرگومانهایشان مجموعه باشند. این امر از عبارتهای مستعد خطا مانند set('abc') & 'cbs' جلوگیری میکند و شکل خواناتر set('abc').intersection('cbs') را ترجیح میدهد.
هر دو set و frozenset از مقایسههای مجموعه با مجموعه پشتیبانی میکنند. دو مجموعه برابرند اگر و فقط اگر هر عنصر هر مجموعه در مجموعه دیگر وجود داشته باشد (هر یک زیرمجموعهای از دیگری باشد). یک مجموعه کوچکتر از مجموعهای دیگر است اگر و فقط اگر مجموعه اول زیرمجموعهای سره از مجموعه دوم باشد (زیرمجموعه است، ولی برابر نیست). یک مجموعه بزرگتر از مجموعهای دیگر است اگر و فقط اگر مجموعه اول ابرمجموعهای سره از مجموعه دوم باشد (ابرمجموعه است، ولی برابر نیست).
نمونههای set با نمونههای frozenset بر اساس اعضای آنها مقایسه میشوند. برای مثال، set('abc') == frozenset('abc') مقدار True را برمیگرداند و set('abc') in set([frozenset('abc')]) نیز همین مقدار را برمیگرداند.
مقایسههای زیرمجموعه و برابری به یک تابع مرتبسازی کامل تعمیم نمییابند. برای مثال، هر دو مجموعهی ناتهی و جدا از هم، برابر نیستند و زیرمجموعهی یکدیگر نیستند، بنابراین همهی موارد زیر False برمیگردانند: a<b، a==b یا a>b.
از آنجا که مجموعهها فقط ترتیب جزئی (روابط زیرمجموعه) را تعریف میکنند، خروجی متد list.sort() برای فهرستهایی از مجموعهها تعریفنشده است.
عناصر مجموعه، مانند کلیدهای دیکشنری، باید hashable باشند.
عملیات دودویی که نمونههای set را با frozenset ترکیب میکنند، نوع اولین عملوند را برمیگردانند. برای مثال: frozenset('ab') | set('bc') یک نمونه از frozenset برمیگرداند.
جدول زیر عملیات در دسترس برای set را که بر نمونههای تغییرناپذیر frozenset اعمال نمیشوند، فهرست میکند:
مجموعه را بهروزرسانی میکند و عناصر همهی موارد دیگر را اضافه میکند.
مجموعه را بهروزرسانی کنید و فقط عناصری را نگه دارید که در آن و در همهی مجموعههای دیگر یافت میشوند.
مجموعه را بهروزرسانی کنید و عناصری را که در دیگر مجموعهها یافت میشوند، حذف کنید.
مجموعه را بهروزرسانی میکند و فقط عناصری را نگه میدارد که در یکی از دو مجموعه وجود دارند، اما نه در هر دو.
عنصر elem را به مجموعه اضافه کنید.
المان elem را از مجموعه حذف میکند. اگر elem در مجموعه وجود نداشته باشد، KeyError پرتاب میشود.
در صورت وجود، المان elem را از مجموعه حذف کنید.
یک عنصر دلخواه را از مجموعه حذف و برمیگرداند. اگر مجموعه خالی باشد، KeyError پرتاب میشود.
تمام عناصر را از مجموعه حذف میکند.
توجه داشته باشید که نسخههای غیرعملگری متدهای update()، intersection_update()، difference_update() و symmetric_difference_update() هر پیمایشپذیری را بهعنوان آرگومان میپذیرند.
توجه داشته باشید که آرگومان elem در متدهای __contains__()، remove() و discard() میتواند یک مجموعه باشد. برای پشتیبانی از جستوجوی یک frozenset معادل، یک frozenset موقت از elem ایجاد میشود.
مجموعهها و مجموعههای فریزشده (frozenset) نسبت به نوع عناصرشان عام هستند.
همچنین ببینید
برای اطلاعات دقیق درباره تضمینهای ایمنی نخی برای اشیای set، ایمنی نخی برای اشیای مجموعه را ببینید.
dict, frozendict¶یک شیء نگاشت مقادیر هشپذیر را به اشیای دلخواه نگاشت میدهد. در حال حاضر دو نوع نگاشت استاندارد وجود دارد: dictionary و frozendict. (برای سایر ظروف، کلاسهای توکار list، set و tuple و ماژول collections را ببینید.) برای هزینههای عملیات مختلف دیکشنری، پیچیدگی زمانی عملیاتها روی انواع توکار را ببینید.
کلیدهای یک دیکشنری تقریباً مقادیر دلخواه هستند. مقادیری که هشپذیر نیستند، یعنی مقادیری که شامل فهرستها، دیکشنریها یا سایر انواع تغییرپذیر هستند (که بر اساس مقدار مقایسه میشوند، نه بر اساس هویت شیء) نمیتوانند بهعنوان کلید استفاده شوند. مقادیری که برابر یکدیگر مقایسه میشوند (مانند 1، 1.0 و True) میتوانند بهجای یکدیگر برای اندیسدهی به یک آیتم دیکشنری استفاده شوند.
یک دیکشنری جدید را برمیگرداند که از یک آرگومان جایگاهی اختیاری و مجموعهای از آرگومانهای کلیدواژهای که ممکن است خالی باشد، مقداردهی اولیه شده است.
دیکشنریها را میتوان به چند روش ایجاد کرد:
از یک فهرست جداشده با کاما از جفتهای key: value درون آکولاد استفاده کنید: {'jack': 4098, 'sjoerd': 4127} یا {4098: 'jack', 4127: 'sjoerd'}
از یک درک دیکشنری استفاده کنید: {}، {x: x ** 2 for x in range(10)}
از سازندهی نوع استفاده کنید: dict()، dict([('foo', 100), ('bar', 200)])، dict(foo=100, bar=200)
اگر هیچ آرگومان جایگاهی داده نشود، یک دیکشنری خالی ایجاد میشود. اگر یک آرگومان جایگاهی داده شود و آن آرگومان یک متد keys() را تعریف کرده باشد، یک دیکشنری با فراخوانی __getitem__() روی آن آرگومان بهازای هر کلید بازگرداندهشده از آن متد ایجاد میشود. در غیر این صورت، آرگومان جایگاهی باید یک شیء پیمایشپذیر باشد. هر آیتم در آن پیمایشپذیر باید خود یک پیمایشپذیر با دقیقاً دو عنصر باشد. عنصر اول هر آیتم به یک کلید در دیکشنری جدید تبدیل میشود و عنصر دوم به مقدار متناظر آن تبدیل میشود. اگر یک کلید بیش از یک بار تکرار شود، آخرین مقدار برای آن کلید به مقدار متناظر در دیکشنری جدید تبدیل میشود.
اگر آرگومانهای کلیدواژهای داده شوند، آرگومانهای کلیدواژهای و مقدارهای آنها به دیکشنری ایجادشده از آرگومان جایگاهی اضافه میشوند. اگر کلیدی که اضافه میشود از قبل موجود باشد، مقدار آرگومان کلیدواژهای جایگزین مقدار آرگومان جایگاهی میشود.
دیکشنریها اگر و فقط اگر جفتهای (key, value) یکسانی داشته باشند (صرفنظر از ترتیب)، در مقایسه برابرند. مقایسههای ترتیبی ('<', '<=', '>=', '>') استثنای TypeError را پرتاب میکنند. برای نشان دادن ایجاد دیکشنری و برابری، همهی مثالهای زیر یک دیکشنری برابر با {"one": 1, "two": 2, "three": 3} برمیگردانند:
>>> a = dict(one=1, two=2, three=3) >>> b = {'one': 1, 'two': 2, 'three': 3} >>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3])) >>> d = dict([('two', 2), ('one', 1), ('three', 3)]) >>> e = dict({'three': 3, 'one': 1, 'two': 2}) >>> f = dict({'one': 1, 'three': 3}, two=2) >>> a == b == c == d == e == f True
ارائهی آرگومانهای کلیدواژهای مانند مثال اول، تنها برای کلیدهایی کار میکند که شناسههای معتبر پایتون باشند. در غیر این صورت، میتوان از هر کلید معتبری استفاده کرد.
دیکشنریها ترتیب درج را حفظ میکنند. توجه داشته باشید که بهروزرسانی یک کلید بر ترتیب تأثیر نمیگذارد. کلیدهایی که پس از حذف اضافه میشوند، در انتها درج میشوند.
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(d) ['one', 'two', 'three', 'four'] >>> list(d.values()) [1, 2, 3, 4] >>> d["one"] = 42 >>> d {'one': 42, 'two': 2, 'three': 3, 'four': 4} >>> del d["two"] >>> d["two"] = None >>> d {'one': 42, 'three': 3, 'four': 4, 'two': None}
تغییر یافته در نسخهی 3.7: تضمین میشود که ترتیب دیکشنری، ترتیب درج باشد. این رفتار از نسخه 3.6، جزئیاتی از پیادهسازی CPython بود.
دیکشنریها نسبت به دو نوع generic هستند، که (بهترتیب) نشاندهندهی انواع کلیدها و مقادیر دیکشنریاند.
اینها عملیاتی هستند که دیکشنریها از آنها پشتیبانی میکنند (و بنابراین، انواع نگاشت سفارشی نیز باید از آنها پشتیبانی کنند):
فهرستی از تمام کلیدهای استفادهشده در دیکشنری d. را برمیگرداند.
تعداد آیتمهای دیکشنری d را برمیگرداند.
آیتم d با کلید key را برمیگرداند. اگر key در نگاشت نباشد، KeyError را پرتاب میکند.
اگر یک زیرکلاس از dict متد __missing__() را تعریف کند و key وجود نداشته باشد، عملیات d[key] آن متد را با کلید key بهعنوان آرگومان فراخوانی میکند. سپس عملیات d[key] هر چیزی را که فراخوانی __missing__(key) بازگشت میدهد یا پرتاب میکند، بازگشت میدهد یا پرتاب میکند. هیچ عملیات یا متد دیگری __missing__() را فراخوانی نمیکند. اگر __missing__() تعریفنشده باشد، KeyError پرتاب میشود. __missing__() باید یک متد باشد؛ نمیتواند یک متغیر نمونه باشد:
>>> class Counter(dict): ... def __missing__(self, key): ... return 0 ... >>> c = Counter() >>> c['red'] 0 >>> c['red'] += 1 >>> c['red'] 1
مثال بالا بخشی از پیادهسازی collections.Counter را نشان میدهد. از یک متد __missing__() متفاوت در collections.defaultdict استفاده میشود.
d[key] را برابر مقدار قرار دهید.
d[key] را از d حذف میکند. اگر key در نگاشت نباشد، یک KeyError پرتاب میشود.
اگر d کلید key را داشته باشد، True برمیگرداند، در غیر این صورت False.
معادل not key in d است.
یک پیمایشگر روی کلیدهای دیکشنری برمیگرداند. این میانبری برای iter(d.keys()) است.
تمام آیتمها را از دیکشنری حذف میکند.
یک کپی کمعمق از دیکشنری برمیگرداند.
یک دیکشنری جدید با کلیدهایی از iterable و مقادیر برابر با value ایجاد کنید.
fromkeys() یک متد کلاس است که یک دیکشنری جدید برمیگرداند. value بهطور پیشفرض None است. همهی مقدارها فقط به یک نمونه واحد ارجاع میدهند، بنابراین معمولاً منطقی ندارد که value یک شیء تغییرپذیر مانند یک فهرست خالی باشد. برای به دست آوردن مقدارهای متمایز، بهجای آن از یک درک دیکشنری استفاده کنید.
اگر key در دیکشنری وجود داشته باشد، مقدار key را برمیگرداند؛ در غیر این صورت default را برمیگرداند. اگر default داده نشده باشد، مقدار پیشفرض آن None است، بنابراین این متد هرگز KeyError پرتاب نمیکند.
یک نمای جدید از آیتمهای دیکشنری (جفتهای (key, value)) برمیگرداند. به مستندات اشیای نما مراجعه کنید.
یک نمای جدید از کلیدهای دیکشنری برمیگرداند. مستندات اشیای نما را ببینید.
اگر key در دیکشنری باشد، آن را حذف میکند و مقدار آن را برمیگرداند، در غیر این صورت default را برمیگرداند. اگر default داده نشده باشد و key در دیکشنری نباشد، یک KeyError پرتاب میشود.
یک جفت (key, value) را از دیکشنری حذف میکند و برمیگرداند. جفتها به ترتیب LIFO برگردانده میشوند.
popitem() برای پیمایش مخرب یک دیکشنری مفید است، همانطور که اغلب در الگوریتمهای مجموعه استفاده میشود. اگر دیکشنری خالی باشد، فراخوانی popitem() موجب پرتاب KeyError میشود.
تغییر یافته در نسخهی 3.7: ترتیب LIFO اکنون تضمین میشود. در نسخههای پیشین، popitem() یک جفت کلید/مقدار دلخواه را برمیگرداند.
یک پیمایشگر معکوس روی کلیدهای دیکشنری برمیگرداند. این یک میانبر برای reversed(d.keys()) است.
اضافه شده در نسخهی 3.8.
اگر key در دیکشنری وجود داشته باشد، مقدار آن را برمیگرداند. در غیر این صورت، key را با مقدار default درج میکند و default را برمیگرداند. default بهطور پیشفرض None است.
دیکشنری را با جفتهای کلید/مقدار از نگاشت یا پیمایشپذیر و kwargs بهروزرسانی میکند و کلیدهای موجود را بازنویسی میکند. None را برمیگرداند.
update() یا شیء دیگری با متد keys() را میپذیرد (که در این صورت __getitem__() با هر کلید برگرداندهشده از آن متد فراخوانی میشود) یا یک پیمایشپذیر از جفتهای کلید/مقدار (بهصورت تاپلها یا پیمایشپذیرهای دیگر با طول ۲). اگر آرگومانهای کلیدواژهای مشخص شده باشند، سپس دیکشنری با آن جفتهای کلید/مقدار بهروزرسانی میشود: d.update(red=1, blue=2).
یک نمای جدید (view) از مقادیر دیکشنری برمیگرداند. به مستندات اشیای view مراجعه کنید.
مقایسهی برابری میان یک نمای dict.values() و نمای دیگر، همیشه False را برمیگرداند. این موضوع هنگام مقایسهی dict.values() با خودش نیز صدق میکند:
>>> d = {'a': 1} >>> d.values() == d.values() False
یک دیکشنری جدید با کلیدها و مقدارهای ادغامشدهی d و other ایجاد کنید، که هر دو باید دیکشنری باشند. در صورتی که d و other کلیدهای مشترک داشته باشند، مقدارهای other اولویت دارند.
اضافه شده در نسخهی 3.9.
دیکشنری d را با کلیدها و مقدارهای other بهروزرسانی کنید؛ other ممکن است یک نگاشت یا یک پیمایشپذیر از جفتهای کلید/مقدار باشد. هنگامی که d و other کلیدهای مشترک دارند، مقدارهای other اولویت دارند.
اضافه شده در نسخهی 3.9.
دیکشنریها و نماهای دیکشنری معکوسپذیر هستند.
>>> d = {"one": 1, "two": 2, "three": 3, "four": 4} >>> d {'one': 1, 'two': 2, 'three': 3, 'four': 4} >>> list(reversed(d)) ['four', 'three', 'two', 'one'] >>> list(reversed(d.values())) [4, 3, 2, 1] >>> list(reversed(d.items())) [('four', 4), ('three', 3), ('two', 2), ('one', 1)]
تغییر یافته در نسخهی 3.8: دیکشنریها اکنون برگشتپذیر هستند.
همچنین ببینید
از frozendict و types.MappingProxyType میتوان برای ایجاد یک نمای فقطخواندنی از یک dict استفاده کرد.
همچنین ببینید
برای اطلاعات دقیق دربارهی تضمینهای ایمنی نخ برای اشیاء dict، به ایمنی نخی برای اشیاء دیکشنری مراجعه کنید.
اشیای بازگرداندهشده توسط dict.keys()، dict.values() و dict.items()، اشیای نمایشی (view objects) هستند. این اشیاء یک نمای پویا از ورودیهای دیکشنری ارائه میدهند، به این معنا که وقتی دیکشنری تغییر میکند، نما این تغییرات را بازتاب میدهد.
نماهای دیکشنری قابل پیمایش هستند تا دادههای مربوط به خود را تولید کنند و از آزمونهای عضویت پشتیبانی میکنند:
تعداد آیتمهای دیکشنری را برمیگرداند.
پیمایشگری بر روی کلیدها، مقدارها یا آیتمهای دیکشنری (که بهصورت تاپلهایی از (key, value) نمایش داده شدهاند) برمیگرداند.
کلیدها و مقادیر به ترتیب درج پیمایش میشوند. این امکان، ساخت جفتهای (value, key) را با استفاده از zip() فراهم میکند: pairs = zip(d.values(), d.keys()). راه دیگر برای ایجاد همان فهرست، pairs = [(v, k) for (k, v) in d.items()] است.
پیمایش نماها هنگام افزودن یا حذف آیتمها در دیکشنری ممکن است RuntimeError پرتاب کند یا موفق به پیمایش همهی آیتمها نشود.
تغییر یافته در نسخهی 3.7: ترتیب دیکشنری تضمین میشود که ترتیب درج باشد.
اگر x در کلیدها، مقادیر یا آیتمهای دیکشنری زیربنایی وجود داشته باشد، True برمیگرداند (در مورد اخیر، x باید یک تاپل (key, value) باشد).
یک پیمایشگر معکوس روی کلیدها، مقدارها یا آیتمهای دیکشنری برمیگرداند. این نما به ترتیب معکوسِ درج پیمایش میشود.
تغییر یافته در نسخهی 3.8: نماهای دیکشنری اکنون معکوسپذیر هستند.
یک types.MappingProxyType برمیگرداند که دیکشنری اصلیای را که نما (view) به آن ارجاع میدهد، میپوشاند.
اضافه شده در نسخهی 3.10.
نماهای کلیدها مجموعهمانند هستند، زیرا ورودیهای آنها یکتا و hashable هستند. نماهای آیتمها نیز عملیات مجموعهمانند دارند، زیرا جفتهای (کلید، مقدار) یکتا هستند و کلیدها هشپذیر هستند. اگر همه مقادیر در یک نمای آیتمها نیز هشپذیر باشند، آنگاه نمای آیتمها میتواند با سایر مجموعهها تعامل داشته باشد. (نماهای مقادیر بهعنوان مجموعهمانند در نظر گرفته نمیشوند، زیرا ورودیها عموماً یکتا نیستند.) برای نماهای مجموعهمانند، تمام عملیات تعریفشده برای کلاس پایه انتزاعی collections.abc.Set در دسترس هستند (برای مثال، ==، < یا ^). هنگامی که از عملگرهای مجموعه استفاده میکنید، نماهای مجموعهمانند هر پیمایشپذیری را بهعنوان عملوند دیگر میپذیرند، برخلاف مجموعهها که فقط مجموعهها را بهعنوان ورودی میپذیرند.
مثالی از استفاده از نمای دیکشنری:
>>> dishes = {'eggs': 2, 'sausage': 1, 'bacon': 1, 'spam': 500} >>> keys = dishes.keys() >>> values = dishes.values() >>> # iteration >>> n = 0 >>> for val in values: ... n += val ... >>> print(n) 504 >>> # keys and values are iterated over in the same order (insertion order) >>> list(keys) ['eggs', 'sausage', 'bacon', 'spam'] >>> list(values) [2, 1, 1, 500] >>> # view objects are dynamic and reflect dict changes >>> del dishes['eggs'] >>> del dishes['sausage'] >>> list(keys) ['bacon', 'spam'] >>> # set operations >>> keys & {'eggs', 'bacon', 'salad'} {'bacon'} >>> keys ^ {'sausage', 'juice'} == {'juice', 'sausage', 'bacon', 'spam'} True >>> keys | ['juice', 'juice', 'juice'] == {'bacon', 'spam', 'juice'} True >>> # get back a read-only proxy for the original dictionary >>> values.mapping mappingproxy({'bacon': 1, 'spam': 500}) >>> values.mapping['spam'] 500
یک دیکشنری فریزشدهی جدید که از یک آرگومان جایگاهی اختیاری و یک مجموعه آرگومان کلیدواژهای احتمالاً خالی مقداردهی اولیه شده است را برمیگرداند.
یک frozendict دارای API مشابهی با API در dict است، با تفاوتهای زیر:
dict دارای متدهای بیشتری نسبت به frozendict است:
__delitem__()
__setitem__()
یک frozendict را میتوان با hash(frozendict) هش کرد، اگر تمام کلیدها و مقادیر قابل هش کردن باشند.
عبارت frozendict |= other شیء frozendict را در جا تغییر نمیدهد، بلکه یک دیکشنری فریزشدهی جدید ایجاد میکند.
frozendict زیرکلاسی از dict نیست، بلکه مستقیماً از object ارثبری میکند.
دیکشنریهای فریزشده نیز مانند دیکشنریها، generic روی دو نوع هستند و به ترتیب انواع کلیدها و مقادیر دیکشنری فریزشده را مشخص میکنند.
مشابه dict.fromkeys()، اما اگر نوع داده زیرکلاسی از frozendict باشد یا سازنده یک frozendict برگرداند، سازندهی نوع داده را دوباره با یک frozendict مقداردهیشده فراخوانی کنید.
اضافه شده در نسخهی 3.15.
دستور with پایتون از مفهوم زمینهی رانتایم که توسط یک مدیر زمینه تعریف میشود، پشتیبانی میکند. این امر با استفاده از یک جفت متد پیادهسازی شده است که به کلاسهای تعریفشده توسط کاربر اجازه میدهند زمینهی رانتایمی را تعریف کنند که پیش از اجرای بدنهی دستور وارد آن میشود و هنگام پایان دستور از آن خارج میشود:
وارد زمینه رانتایم میشود و این شیء یا شیء دیگری مرتبط با زمینه رانتایم را برمیگرداند. مقدار برگرداندهشده توسط این متد، به شناسهی موجود در بند as دستورات with که از این مدیر زمینه استفاده میکنند، اختصاص مییابد.
نمونهای از یک مدیر زمینه که خود را برمیگرداند، یک file object است. اشیای پرونده خود را از __enter__() برمیگردانند تا امکان استفاده از open() بهعنوان عبارت زمینه در یک دستور with فراهم شود.
یک نمونه از مدیر زمینه که شیء مرتبطی را برمیگرداند، مدیری است که توسط decimal.localcontext() برگردانده میشود. این مدیرهای زمینه، زمینهی decimal فعال را به یک رونوشت از زمینهی decimal اصلی تنظیم میکنند و سپس آن رونوشت را برمیگردانند. این امر امکان میدهد که تغییراتی در زمینهی decimal جاری در بدنهی دستور with اعمال شود، بدون آنکه کد خارج از دستور with تحت تأثیر قرار گیرد.
از زمینه رانتایم خارج شوید و یک پرچم بولی برگردانید که نشان دهد آیا هر استثنایی که رخ داده است باید سرکوب شود. اگر هنگام اجرای بدنه دستور with استثنایی رخ داده باشد، آرگومانها حاوی نوع استثنا، مقدار و اطلاعات ردگیری پشته هستند. در غیر این صورت، هر سه آرگومان None هستند.
بازگرداندن یک مقدار درست از این متد باعث میشود دستور with استثنا را مهار کند و اجرا را با دستورِ بلافاصله پس از دستور with ادامه دهد. در غیر این صورت، پس از پایان اجرای این متد، استثنا به انتشار خود ادامه میدهد.
اگر این متد هنگام رسیدگی به یک استثنای پیشین از بلوک with، استثنایی پرتاب کند، استثنای جدید پرتاب میشود و استثنای اصلی در ویژگی __context__ آن ذخیره میشود.
استثنای ورودی هرگز نباید بهصراحت دوباره پرتاب شود؛ در عوض، این متد باید یک مقدار نادرست برگرداند تا نشان دهد که متد با موفقیت کامل شده است و قصد مهار استثنای پرتابشده را ندارد. این امر به کد مدیریت زمینه اجازه میدهد تا بهراحتی تشخیص دهد که آیا یک متد __exit__() واقعاً شکست خورده است یا خیر.
پایتون چندین مدیر زمینه را برای پشتیبانی از همگامسازی آسان نخها، بستن بهموقع پروندهها یا اشیاء دیگر، و دستکاری سادهتر زمینهی محاسبات اعشاری فعال تعریف میکند. این نوعهای خاص، جدا از پیادهسازی پروتکل مدیریت زمینه، رفتار ویژهای ندارند. برای مشاهدهی چند نمونه، ماژول contextlib را ببینید.
تولیدگرهای پایتون (تولیدگر) و دکوراتور contextlib.contextmanager راهی مناسب برای پیادهسازی این پروتکلها فراهم میکنند. اگر یک تابع تولیدگر با دکوراتور contextlib.contextmanager آراسته شود، بهجای پیمایشگری که توسط یک تابع تولیدگر آراستهنشده تولید میشود، مدیر زمینهای برمیگرداند که متدهای ضروری __enter__() و __exit__() را پیادهسازی میکند.
توجه داشته باشید که هیچ جایگاه مشخصی برای هیچکدام از این متدها در ساختار نوع اشیاء پایتون در Python/C API وجود ندارد. انواع توسعهای که میخواهند این متدها را تعریف کنند، باید آنها را بهعنوان متدهای معمولی قابل دسترسی از پایتون فراهم کنند. در مقایسه با سربار راهاندازی زمینهی رانتایم، سربار یک جستوجوی تکی در دیکشنری کلاس ناچیز است.
انواع توکار اصلی برای حاشیهنویسیهای نوع عبارتند از Generic Alias و Union.
اشیاء GenericAlias معمولاً با زیرنویسی یک کلاس ایجاد میشوند. آنها اغلب با کلاسهای ظرفی، مانند list یا dict استفاده میشوند. برای مثال، list[int] یک شیء GenericAlias است که با زیرنویسی کلاس list با آرگومان int ایجاد میشود. اشیاء GenericAlias عمدتاً برای استفاده با حاشیهنویسیهای نوع در نظر گرفته شدهاند.
نکته
بهطور معمول، تنها در صورتی میتوان عملیات اندیسدهی (subscript) را روی یک کلاس انجام داد که آن کلاس متد ویژهی __class_getitem__() را پیادهسازی کرده باشد.
یک شیء GenericAlias بهعنوان یک پراکسی برای یک نوع عام عمل میکند و انواع عام پارامتریزهشده را پیادهسازی میکند.
برای یک کلاس ظرف، آرگومان(های) ارائهشده به زیرنویسی کلاس ممکن است نوع یا انواع عناصری را که یک شیء شامل میشود نشان دهند. برای مثال، میتوان از set[bytes] در حاشیهنویسیهای نوع (type annotations) برای نشان دادن یک set که تمام عناصر آن از نوع bytes هستند استفاده کرد.
برای کلاسی که __class_getitem__() را تعریف میکند اما یک ظرف نیست، آرگومانهای ارائهشده برای زیرنویسی آن کلاس، اغلب نوع یا انواع بازگشتی یک یا چند متد تعریفشده برای یک شیء را مشخص میکنند. برای مثال، عبارتهای باقاعده را میتوان هم برای نوع دادهی str و هم برای نوع دادهی bytes استفاده کرد:
اگر x = re.search('foo', 'foo')، x یک شیء re.Match خواهد بود که مقادیر بازگشتی x.group(0) و x[0] هر دو از نوع str خواهند بود. میتوانید این نوع شیء را در حاشیهنویسیهای نوع با GenericAlias re.Match[str] نشان دهید.
اگر y = re.search(b'bar', b'bar') (به b برای bytes توجه کنید)، y نیز نمونهای از re.Match خواهد بود، اما مقادیر بازگشتی y.group(0) و y[0] هر دو از نوع bytes خواهند بود. در حاشیهنویسیهای نوع، این تنوع از اشیای re.Match را با re.Match[bytes] نمایش میدهیم.
اشیای GenericAlias نمونههایی از کلاس types.GenericAlias هستند که میتوان از آن برای ساخت اشیای GenericAlias بهطور مستقیم نیز استفاده کرد. نسخههای تخصصیشدهی کلاسهای عام تعریفشده توسط کاربر ممکن است نمونههایی از types.GenericAlias نباشند، اما عملکرد مشابهی ارائه میدهند.
یک GenericAlias ایجاد میکند که نشاندهندهی یک نوع T پارامتریزهشده با انواع X، Y و موارد دیگر، بسته به T مورد استفاده، است. برای مثال، تابعی که انتظار یک list شامل عناصر float را دارد:
def average(values: list[float]) -> float: return sum(values) / len(values)
مثالی دیگر برای اشیاء نگاشت، با استفاده از یک dict، که یک نوع عام است و دو پارامتر نوع دارد؛ این پارامترها نوع کلید و نوع مقدار را نشان میدهند. در این مثال، تابع یک dict را با کلیدهایی از نوع str و مقادیری از نوع int انتظار دارد:
def send_post_request(url: str, body: dict[str, int]) -> None: ...
توابع توکار isinstance() و issubclass() انواع GenericAlias را برای آرگومان دوم خود نمیپذیرند:
>>> isinstance([1, 2], list[str]) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: isinstance() argument 2 cannot be a parameterized generic
رانتایم پایتون حاشیهنویسی را اعمال نمیکند. این موضوع شامل انواع عام و پارامترهای نوع آنها نیز میشود. هنگام ایجاد یک شیء ظرف از روی یک GenericAlias، عناصر درون ظرف با نوعشان تطبیق داده نمیشوند. برای مثال، کد زیر توصیه نمیشود، اما بدون خطا اجرا میشود:
>>> t = list[str] >>> t([1, 2, 3]) [1, 2, 3]
علاوه بر این، انواع عام پارامتردار، پارامترهای نوع را هنگام ایجاد شیء حذف میکنند:
>>> t = list[str] >>> type(t) <class 'types.GenericAlias'> >>> l = t() >>> type(l) <class 'list'>
نمونههای GenericAlias در رانتایم کلاس نیستند، اگرچه مانند کلاسها رفتار میکنند (میتوان آنها را نمونهسازی کرد و از آنها زیرکلاس ساخت):
>>> import inspect >>> inspect.isclass(list[int]) False
این موضوع برای عامهای تعریفشده توسط کاربر نیز صادق است.
فراخوانی repr() یا str() روی یک نوع عام، نوع پارامتریشده را نشان میدهد:
>>> repr(list[int]) 'list[int]' >>> str(list[int]) 'list[int]'
متد __getitem__() در ظروف عام، استثنایی پرتاب میکند تا از اشتباهاتی مانند dict[str][str] جلوگیری کند:
>>> dict[str][str] Traceback (most recent call last): ... TypeError: dict[str] is not a generic class
با این حال، چنین عباراتی زمانی معتبر هستند که از متغیرهای نوع استفاده شود. اندیس باید به تعداد آیتمهای متغیر نوع موجود در __args__ شیء GenericAlias، المان داشته باشد.
>>> from typing import TypeVar >>> Y = TypeVar('Y') >>> dict[str, Y][int] dict[str, int]
کلاسهای کتابخانهی استاندارد زیر از عامهای پارامتریزه پشتیبانی میکنند. این فهرست جامع نیست.