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 — 6. عبارات 6. عبارات¶این فصل معنای عناصر عبارتها در پایتون را توضیح میدهد. یادداشتهای سینتکس: در این فصل و فصلهای پس از آن، از نمادگذاری دستور زبان برای توصیف سینتکس استفاده خواهد شد، نه برای تحلیل واژگانی. هنگامی که (یکی از جایگزینهای) یک قاعدهی سینتکس به شکل زیر باشد: name: othername و هیچ معنایی ارائه نشده است، معنای این شکل از 6.1. تبدیلات حسابی¶هرگاه در توضیح یک عملگر حسابی در زیر از عبارت «آرگومانهای عددی به یک نوع حقیقی مشترک تبدیل میشوند» استفاده شده باشد، این بدان معناست که پیادهسازی عملگر برای انواع عددی توکار، همانطور که در بخش انواع عددی مستندات کتابخانه استاندارد توضیح داده شده است، کار میکند. برخی قواعد اضافی برای برخی عملگرها و عملوندهای غیرعددی اعمال میشوند (برای مثال، یک رشته بهعنوان آرگومان سمت چپ عملگر 6.2. اتمها¶اتمها اساسیترین عناصر عبارتها هستند. سادهترین اتمها ثابتهای توکار، نامها و لیترالها هستند. اتمهای پیچیدهتر در درون جفتجداکنندهها قرار میگیرند:
بهطور رسمی، سینتکس اتمها عبارت است از: atom: | 6.2.1. ثابتهای توکار¶کلیدواژههای ارزیابی این اتمها مقدار متناظر را به دست میدهد. نکته چند ثابت توکار دیگر نیز بهعنوان متغیرهای سراسری در دسترس هستند، اما تنها مواردی که در اینجا ذکر شدهاند کلیدواژهها هستند. بهویژه، این نامها را نمیتوان دوباره مقداردهی کرد یا بهعنوان ویژگی استفاده کرد: >>> False = 123 File "<input>", line 1 False = 123 ^^^^^ SyntaxError: cannot assign to False بهطور رسمی، نحوه (سینتکس) ثابتهای توکار به این صورت است: builtin_constant: 'True' | 'False' | 'None' | '...' 6.2.2. شناسهها (نامها)¶یک شناسه که بهعنوان یک اتم (atom) ظاهر میشود، یک نام است. بخش نامها (شناسهها و کلیدواژهها) را برای تعریف واژگانی و بخش نامگذاری و مقیدسازی را برای مستندات نامگذاری و پیوند ببینید. هنگامی که نام به یک شیء مقید شده باشد، ارزیابی اتم، آن شیء را حاصل میکند. هنگامی که نامی مقید نشده باشد، تلاش برای ارزیابی آن، استثنای 6.2.2.1. تغییر نام خصوصی (private name mangling)¶هرگاه شناسهای که در متن تعریف یک کلاس آمده باشد با ۲ یا چند نویسه زیرخط آغاز شود و به ۲ یا چند زیرخط ختم نشود، یک نام خصوصی (private name) برای آن کلاس محسوب میشود. همچنین ببینید دقیقتر اینکه، نامهای خصوصی پیش از تولید کد برای آنها به شکل طولانیتری تبدیل میشوند. اگر نام تبدیلشده طولانیتر از ۲۵۵ نویسه باشد، ممکن است کوتاهسازی (truncation) تعریفشده توسط پیادهسازی رخ دهد. این تبدیل مستقل از زمینهی نحویای است که شناسه در آن استفاده میشود، اما تنها شناسههای خصوصی زیر تغییر نام داده میشوند:
قاعده تبدیل بهصورت زیر تعریف شده است:
6.2.3. مقادیر لفظی¶لفظی (literal) نمایشی متنی از یک مقدار است. پایتون از مقادیر لفظی عددی، رشتهای و بایتی پشتیبانی میکند. افاسترینگها و رشتههای قالبی بهعنوان مقادیر لفظی رشتهای در نظر گرفته میشوند. مقادیر لفظی عددی از یک توکن مقادیر لفظی رشته و بایت ممکن است از چندین توکن تشکیل شده باشند. برای جزئیات، بخش الحاق رشتههای لفظی را ببینید. توجه داشته باشید که اعداد منفی و مختلط، مانند ارزیابی یک لفظی، شیءای از نوع دادهشده ( دستور زبان صوری برای مقادیر لفظی چنین است: literal: 6.2.3.1. مقادیر لفظی و هویت شیء¶همهی مقادیر لفظی با انواع دادهی تغییرناپذیر متناظر هستند، و از این رو، هویت شیء کماهمیتتر از مقدار آن است. ارزیابیهای متعدد مقادیر لفظیی با مقدار یکسان (چه همان محل در متن برنامه و چه محلی دیگر) ممکن است همان شیء یا شیء متفاوتی با همان مقدار را به دست آورند. جزئیات پیادهسازی CPython برای مثال، در CPython، اعداد صحیح کوچک با مقدار یکسان، به یک شیء یکسان ارزیابی میشوند: >>> x = 7 >>> y = 7 >>> x is y True با این حال، اعداد صحیح بزرگ به اشیاء متفاوتی ارزیابی میشوند: >>> x = 123456789 >>> y = 123456789 >>> x is y False این رفتار ممکن است در نسخههای آینده CPython تغییر کند. بهویژه، مرز بین اعداد صحیح «کوچک» و «بزرگ» پیشتر تغییر کرده است. CPython هنگامی که مقادیر لفظی را با استفاده از >>> x = 7 >>> x is 7 <input>:1: SyntaxWarning: "is" with 'int' literal. Did you mean "=="? True برای اطلاعات بیشتر، چه زمانی میتوانم به آزمونهای هویت با عملگر is اتکا کنم؟ را ببینید. رشتههای الگو تغییرناپذیر هستند، اما ممکن است به اشیای تغییرپذیر بهعنوان مقادیر در حال حاضر، هر ارزیابی از یک رشتهی قالب به یک شیء متفاوت منجر میشود. 6.2.3.2. الحاق رشتههای لفظی¶مقادیر لفظی مجاور رشته یا بایت، که ممکن است از قواعد متفاوتی برای علامت نقلقول استفاده کنند، مجاز هستند و معنای آنها همان معنای الحاق آنها است: >>> "hello" 'world' "helloworld" این قابلیت در سطح سینتکس تعریف شده است، بنابراین فقط با مقادیر لفظی کار میکند. برای الحاق عبارات رشتهای در رانتایم، میتوان از عملگر '+' استفاده کرد: >>> greeting = "Hello" >>> space = " " >>> name = "Blaise" >>> print(greeting + space + name) # not: print(greeting space name) Hello Blaise در الحاق لفظی میتوان آزادانه رشتههای خام، رشتههای سهنقلقولی و مقادیر لفظی رشتهای قالببندیشده را با هم ترکیب کرد. برای مثال: >>> "Hello" r', ' f"{name}!" "Hello, Blaise!" میتوان از این قابلیت برای کاهش تعداد بکاسلشهای مورد نیاز، تقسیم راحت رشتههای طولانی در سطرهای طولانی، یا حتی افزودن کامنت به بخشهایی از رشتهها استفاده کرد. برای مثال: re.compile("[A-Za-z_]" # letter or underscore "[A-Za-z0-9_]*" # letter, digit or underscore ) با این حال، مقادیر لفظی بایت فقط میتوانند با دیگر مقادیر لفظی بایت ترکیب شوند؛ نه با مقادیر لفظی رشته از هیچ نوعی. همچنین، مقادیر لفظی رشته قالب فقط میتوانند با دیگر مقادیر لفظی رشته قالب ترکیب شوند: >>> t"Hello" t"{name}!" Template(strings=('Hello', '!'), interpolations=(...)) بهطور رسمی: strings: ( 6.2.4. گروههای پرانتزگذاریشده¶یک گروه پرانتزدار عبارتی است که در پرانتز محصور شده است. این گروه به همان مقداری ارزیابی میشود که عبارت درون آن ارزیابی میشود. گروهها برای لغو یا شفافسازی تقدم عملگر، به همان روش نمادگذاری ریاضی استفاده میشوند. برای مثال: >>> 3 << 2 | 4 12 >>> 3 << (2 | 4) # Override precedence of the | (bitwise OR) 192 >>> (3 << 2) | 4 # Same as without parentheses (but more clear) 12 توجه داشته باشید که هر چیزی که در پرانتز قرار دارد یک گروه نیست. بهطور مشخص، یک گروه پرانتزدار باید دقیقا شامل یک عبارت باشد و نمیتواند با کاما پایان یابد. برای سایر اشکال پرانتزدار به نمایشهای تاپل و عبارتهای مولد مراجعه کنید. بهطور رسمی، نحوه (سینتکس) گروهها به این صورت است: group: '('
6.2.5. نمایشهای ظروف¶پایتون برای ساخت ظروف توکار (فهرستها، مجموعهها، تاپلها یا دیکشنریها)، نحو ویژهای به نام نمایشها (displays) فراهم میکند. تفاوتهای ظریفی بین این چهار نوع نمایش وجود دارد که در بخشهای زیر به تفصیل شرح داده شده است. با این حال، همه نمایشها از آیتمهای جدا شده با کاما تشکیل شدهاند که در جداکنندههای جفتشده محصور شدهاند. برای نمونه، یک نمایش فهرست (list display) مجموعهای از عبارتها است که در داخل کروشهها قرار گرفتهاند: >>> ["one", "two", "three"] ['one', 'two', 'three'] >>> [1 + 2, 2 + 3] [3, 5] در نمایشهای فهرست، تاپل و دیکشنری (اما نه مجموعه)، دنباله میتواند خالی باشد: >>> [] # empty list [] >>> () # empty tuple () >>> {} # empty dictionary {} اگر سری خالی نباشد، پس از آیتمها میتوان از یک ویرگول اضافی استفاده کرد که هیچ تأثیری ندارد: >>> ["one", "two", "three",] # note comma after "three" ['one', 'two', 'three'] نکته ویرگول پایانی اغلب برای نمایشهایی استفاده میشود که چندین سطر را در بر میگیرند (با استفاده از implicit line joining)؛ بنابراین وقتی برنامهنویس آیندهای در انتهای آن ورودی جدیدی اضافه میکند، نیازی به تغییر سطر موجود ندارد: >>> [ ... 'one', ... 'two', ... 'three', ... ] ['one', 'two', 'three'] در زمان رانتایم، هنگامی که یک نمایش ارزیابی میشود، آیتمهای فهرستشده از چپ به راست ارزیابی شده و در ظرف جدیدی از نوع مناسب قرار میگیرند. برای نمایشهای تاپل، فهرست و مجموعه (اما نه دیکشنری)، هر آیتمی در نمایش میتواند پیشوندی با یک ستاره ( >>> numbers = (1, 2) >>> [*numbers, 'word', *numbers] [1, 2, 'word', 1, 2] نمایشهای دیکشنری از مکانیسم مشابهای به نام بازکردن بستهی دیکشنری استفاده میکنند که با دو ستاره ( نوع پیشرفتهتری از نمایشها، درکها هستند که در آنها آیتمها از طریق مجموعهای از دستورات حلقهای و فیلترینگ محاسبه میشوند. برای جزئیات، بخش درکها را ببینید. اضافه شده در نسخهی 3.5: پیمایشپذیر و بازکردن بستهی دیکشنری در نمایشها که ابتدا توسط PEP 448 پیشنهاد شد. 6.2.5.1. نمایشهای فهرست¶یک نمایش فهرست (list display) دنبالهای احتمالاً خالی از عبارتها است که در داخل کروشهها قرار دارد. برای نمونه: >>> ["one", "two", "three"] ['one', 'two', 'three'] >>> ["one"] # One-element list ['one'] >>> [] # empty list [] برای اطلاعات عمومی دربارهی نمایشها، نمایشهای ظروف را ببینید. گرامر رسمی نمایشهای فهرست عبارت است از: list: '[' [
6.2.5.2. نمایشهای مجموعه¶یک نمایش مجموعه (set display) دنبالهای غیرخالی از عبارتها است که در داخل آکولادها قرار دارد. برای نمونه: >>> {"one", "two", "three"} {'one', 'three', 'two'} >>> {"one"} # One-element set {'one'} برای اطلاعات عمومی دربارهی نمایشها، نمایشهای ظروف را ببینید. هیچ نحو خاصی برای مجموعهی خالی وجود ندارد. لفظی گرامر رسمی نمایشهای مجموعه عبارت است از: set: '{'
6.2.5.3. نمایشهای تاپل¶یک نمایش تاپل (tuple display) دنبالهای از عبارتها است که در داخل پرانتزها قرار دارد. برای نمونه: >>> (1, 2) (1, 2) >>> () # an empty tuple () برای اطلاعات عمومی دربارهی نمایشها، نمایشهای ظروف را ببینید. برای جلوگیری از ابهام، اگر یک نمایش تاپل دقیقاً یک عنصر داشته باشد، به یک ویرگول پایانی نیاز دارد. بدون آن، یک parenthesized group دریافت میکنید: >>> ('single',) # single-element tuple ('single',) >>> ('single') # no comma: single string 'single' به عبارت دیگر، نمایش تاپل فهرستی است از موارد زیر که داخل پرانتز قرار گرفتهاند:
از آنجایی که تاپلها تغییرناپذیر هستند، قوانین هویت شیء برای مقادیر ثابت نیز در مورد تاپلها اعمال میشوند: در رانتایم، دو وقوع از تاپلها با مقادیر یکسان ممکن است شیء یکسانی را تولید کنند یا نکنند. نکته نحو پایتون همچنین شامل expression lists است که در آن فهرستی از عباراتِ جداشده با ویرگول در پرانتز قرار نمیگیرند اما به یک تاپل ارزیابی میشوند. به عبارت دیگر، هنگامی که صحبت از نحو تاپل به میان میآید، ویرگول مهمتر از استفاده از پرانتز است. فقط تاپل خالی بدون ویرگول نوشته میشود. گرامر رسمی برای نمایشهای تاپل عبارت است از: tuple: | '(' 6.2.5.4. نمایشهای دیکشنری¶یک dictionary display سری احتمالاً خالی از dict items است که درون آکولاد قرار گرفتهاند. هر آیتم دیکشنری یک جفت عبارتِ جداشده با دونقطه است: key و value مرتبط با آن. برای مثال: >>> {1: 'one', 2: 'two'} {1: 'one', 2: 'two'} در رانتایم، هنگام ارزیابی یک درک دیکشنری، عبارتها از چپ به راست ارزیابی میشوند. هر شیء کلید به عنوان کلیدی در دیکشنری برای ذخیرهی مقدار متناظر استفاده میشود. این بدان معناست که شما میتوانید یک کلید را چندین بار در درک مشخص کنید و مقدار دیکشنری نهایی برای یک کلید مشخص، آخرین مقداری خواهد بود که داده شده است. برای مثال: >>> { ... 1: 'this will be overridden', ... 2: 'two', ... 1: 'also overridden', ... 1: 'one', ... } {1: 'one', 2: 'two'} بهجای جفت کلید-مقدار، یک آیتم دیکشنری ممکن است عبارتی باشد که با دو ستاره >>> defaults = {'color': 'blue', 'count': 8} >>> overrides = {'color': 'yellow'} >>> {**defaults, **overrides} {'color': 'yellow', 'count': 8} اضافه شده در نسخهی 3.5: واگشایی در نمایشهای دیکشنری، که در ابتدا در PEP 448 پیشنهاد شده بود. گرامر رسمی برای نمایشهای دیکشنری عبارت است از: dict: '{' [ 6.2.6. درکها¶درککنندههای فهرست، مجموعه و دیکشنری فرمی از نمایشهای ظرف هستند که در آنها آیتمها به جای فهرستشدن صریح، از طریق مجموعهای از دستورالعملهای حلقهزنی و فیلترینگ محاسبه میشوند. در سادهترین شکل، یک درککننده شامل یک عبارت واحد است که پس از آن یک بند برای مثال، فهرستی از ده مربع اول بهصورت زیر است: >>> [x**2 for x in range(10)] [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] در زمان اجرا، یک درک فهرستی یک فهرست جدید ایجاد میکند. عبارت پس از def make_list_of_squares(iterable): result = [] for x in iterable: result.append(x**2) return result make_list_of_squares(range(10)) درکهای مجموعه نیز به همین صورت کار میکنند. برای مثال، این هم مجموعهای از حروف کوچک است: >>> {x.lower() for x in ['a', 'A', 'b', 'C']} {'c', 'a', 'b'} در زمان اجرا، این کار تقریباً معادل فراخوانی این تابع است: def make_lowercase_set(iterable): result = set(iterable) for x in iterable: result.append(x.lower()) return result make_lowercase_set(['a', 'A', 'b', 'C']) درکهای دیکشنری به جای یک عبارت، با یک جفت کلید-مقدار جدا شده با دونقطه شروع میشوند. برای مثال: >>> {func.__name__: func for func in [print, hex, any]} {'print': <built-in function print>, 'hex': <built-in function hex>, 'any': <built-in function any>} در زمان اجرا، این تقریباً معادل موارد زیر است: def make_dict_mapping_names_to_functions(iterable): result = {} for func in iterable: result[func.__name__] = func return result iterable([print, hex, any]) مانند سایر انواع نمایشهای دیکشنری، ممکن است یک کلید چندین بار مشخص شود. مقادیر قبلی توسط مقادیری که بعدها ارزیابی میشوند، بازنویسی میشوند. چیزی به نام درک تاپل وجود ندارد. در عوض، نحو مشابهی برای عبارتهای مولد استفاده میشود که از طریق آنها میتوانید یک تاپل را به این شکل بسازید: >>> tuple(x**2 for x in range(10)) (0, 1, 4, 9, 16, 25, 36, 49, 64, 81) تغییر یافته در نسخهی 3.8: پیش از پایتون 3.8، در درک دیکشنری، ترتیب ارزیابی کلید و مقدار بهخوبی تعریفنشده بود. در CPython، مقدار پیش از کلید ارزیابی میشد. از 3.8 به بعد، کلید پیش از مقدار ارزیابی میشود، همانطور که در PEP 572 پیشنهاد شده است. 6.2.6.1. فیلتر کردن در درکها¶ممکن است پس از بند برای مثال، فهرستی از نامهای ماژول >>> [name for name in vars(math) if name.startswith('f')] ['fabs', 'factorial', 'floor', 'fma', 'fmod', 'frexp', 'fsum'] در زمان اجرا، عبارت موجود پس از def get_math_f_names(iterable): result = [] for name in iterable: if name.startswith('f'): result.append(name) return result get_math_f_names(vars(math)) فیلترکردن حالت خاصی از درکهای پیچیدهتر است. برای توضیحات رسمیتر، بخش بعدی را ببینید. 6.2.6.2. درکهای پیچیده¶بهطور کلی، بند اول >>> import array >>> import math >>> [ ... name ... for module in [array, math] ... for name in vars(module) ... if name.startswith('a') ... ] ['array', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh'] در زمان اجرا، این مورد تقریباً با تعریف و فراخوانی زیر مطابقت دارد: def get_a_names(iterable): result = [] for module in iterable: for name in vars(module): if name.startswith('a'): result.append(name) return result get_a_names([array, math]) عناصر ظرف جدید آنهایی هستند که با در نظر گرفتن هر یک از بندهای بهجز عبارت پیمایشپذیر در سمت چپترین بند >>> x = 'old value' >>> [x**2 for x in range(10)] # این `x` نسبت به درک محلی است >>> x 'old value' عبارت پیمایشپذیر در سمت چپترین بند بندهای بعدی برای اطمینان از اینکه درک همیشه به ظرفی از نوع مناسب منجر میشود، عبارتهای عبارتهای انتساب در عبارتهای پیمایشپذیر درک (یعنی عبارتهای بعد از کلیدواژهین تغییر یافته در نسخهی 3.8: 6.2.6.3. بازکردن بسته در درکها¶اگر عبارت یک فهرست یا درک مجموعه ستارهدار باشد، نتیجه بازنشود تا صفر یا چند عنصر تولید کند. این کار اغلب برای «تختسازی» فهرستها استفاده میشود، برای مثال: >>> students = ['Petr', 'Blaise', 'Jarka'] >>> teachers = ['Salim', 'Bartosz'] >>> lists_of_people = [students, teachers] >>> [*people for people in lists_of_people] ['Petr', 'Blaise', 'Jarka', 'Salim', 'Bartosz'] در زمان اجرا، این درک تقریباً با موارد زیر مطابقت دارد: def flatten_names(lists_of_people): result = [] for people in lists_of_people: result.extend(people) return result در درکهای دیکشنری، یک عبارت دو ستارهدار ارزیابی شده و سپس با استفاده از بازکردن دیکشنری باز میشود و صفر یا چند جفت کلید/مقدار را در دیکشنری جدید درج میکند. مانند سایر انواع نمایشهای دیکشنری، اگر یک کلید چندین بار مشخص شود، مقدار مرتبط در دیکشنری حاصل آخرین مقدار مشخصشده خواهد بود. برای مثال: >>> system_defaults = {'color': 'blue', 'count': 8} >>> user_defaults = {'color': 'yellow'} >>> overrides = {'count': 5} >>> configuration_sets = [system_defaults, user_defaults, overrides] >>> {**d for d in configuration_sets} {'color': 'yellow', 'count': 5} اضافه شده در نسخهی 3.15: بازکردن بسته در درکها با استفاده از عملگرهای 6.2.6.4. درکهای ناهمگام¶در یک تابع اگر یک درک حاوی بندهای اضافه شده در نسخهی 3.6: درکهای ناهمگام در PEP 530 معرفی شدند. تغییر یافته در نسخهی 3.11: درکهای ناهمگام اکنون در داخل درکها در توابع ناهمگام مجاز هستند. درکهای بیرونی بهطور ضمنی ناهمگام میشوند. 6.2.6.5. گرامر رسمی برای درکها¶گرامر رسمی برای درکها عبارت است از: listcomp: '[' 6.2.7. عبارتهای تولیدگر¶سینتکس عبارتهای تولیدگر (generator expressions) همانند درکهای فهرستی است، با این تفاوت که آنها به جای کروشه در پرانتز قرار میگیرند. برای مثال: >>> iterator = (x ** 2 for x in range(10)) >>> iterator <generator object <genexpr> at ...> در رانتایم، یک عبارت تولیدگر به یک generator iterator ارزیابی میشود که همان مقادیرِ درک فهرستی متناظر را تولید میکند: >>> list(iterator) [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] بنابراین، مثال بالا تقریباً معادل تعریف و فراخوانی تابع تولیدگر زیر است: def make_generator_of_squares(iterator): for x in iterator: yield x ** 2 make_generator_of_squares(iter(range(10))) هنگامی که عبارت تولیدگر تنها آرگومان جایگاهی باشد و هیچ آرگومان کلیدواژهای وجود نداشته باشد، میتوان پرانتزهای دربرگیرنده را در فراخوانیها حذف کرد. برای جزئیات، بخش فراخوانیها را ببینید. برای مثال: # The parentheses after `sum` are part of the call syntax: >>> sum(x ** 2 for x in range(10)) 285 # The generator needs its own parentheses if it's not the only argument: >>> sum((x ** 2 for x in range(10)), start=1000) 1285 عبارت پیمایشپذیر در چپترین بند >>> (x ** 2 for x in nonexistent_iterable) Traceback (most recent call last): ... NameError: name 'nonexistent_iterable' is not defined پس از ارزیابی عبارت، یک پیمایشگر از نتیجه ایجاد میشود، گویی که >>> (x ** 2 for x in None) Traceback (most recent call last): ... TypeError: 'NoneType' object is not iterable تمام عبارتهای دیگر بهصورت تنبل ارزیابی میشوند، به همان شیوهی تولیدگرهای معمولی (یعنی زمانی که از پیمایشگر خواسته شود مقداری را yield کند): >>> iterator = (nonexistent_value for x in range(10)) >>> iterator <generator object <genexpr> at ...> >>> list(iterator) Traceback (most recent call last): ... NameError: name 'nonexistent_value' is not defined >>> iterator = (x * y for x in range(10) for y in nonexistent_iterable) >>> iterator <generator object <genexpr> at ...> >>> list(iterator) Traceback (most recent call last): ... NameError: name 'nonexistent_iterable' is not defined برای جلوگیری از اخلال در عملکرد مورد انتظار خود عبارت تولیدگر، عبارتهای اگر یک عبارت تولیدگر شامل بندهای دستور زبان صوری عبارتهای تولیدگر: generator_expression: "("
اضافه شده در نسخهی 3.6: عبارات تولیدگر ناهمگام معرفی شدند. تغییر یافته در نسخهی 3.7: پیش از پایتون 3.7، عبارات تولیدگر ناهمگام فقط میتوانستند در همروالهای تغییر یافته در نسخهی 3.8: 6.2.8. عبارتهای yield¶yield_atom: "(" عبارت yield هنگام تعریف یک تابع تولیدگر یا یک تابع تولیدگر ناهمگام استفاده میشود و بنابراین فقط میتواند در بدنهی تعریف یک تابع استفاده شود. استفاده از عبارت yield در بدنهی یک تابع، آن تابع را به یک تابع تولیدگر تبدیل میکند، و استفاده از آن در بدنهی یک تابع def gen(): # defines a generator function yield 123 async def agen(): # defines an asynchronous generator function yield 123 به دلیل عوارض جانبی عبارات تغییر یافته در نسخهی 3.8: عبارات yield در محدودههای تودرتوی ضمنی که برای پیادهسازی درکها و عبارات تولیدگر به کار میروند، ممنوع است. توابع تولیدگر در ادامه توضیح داده شدهاند، در حالی که توابع تولیدگر ناهمگام بهطور جداگانه در بخش توابع تولیدگر ناهمگام توضیح داده شدهاند. هنگامی که یک تابع تولیدگر فراخوانی میشود، یک پیمایشگر برمیگرداند که بهعنوان تولیدگر شناخته میشود. سپس آن تولیدگر اجرای تابع تولیدگر را کنترل میکند. اجرا زمانی آغاز میشود که یکی از متدهای تولیدگر فراخوانی شود. در آن هنگام، اجرا به نخستین عبارت yield میرسد، جایی که دوباره معلق میشود و مقدار همهی این موارد باعث میشود توابع تولیدگر بسیار شبیه به همروالها باشند؛ آنها چندین بار yield میکنند، بیش از یک نقطهی ورود دارند و اجرای آنها میتواند معلق شود. تنها تفاوت این است که تابع تولیدگر نمیتواند کنترل کند که پس از yield، اجرا باید از کجا ادامه یابد؛ کنترل همیشه به فراخوانندهی تولیدگر منتقل میشود. عبارتهای yield در هر جای یک ساختار هنگامی که از هنگامی که پیمایشگر زیربنایی به پایان میرسد، ویژگی تغییر یافته در نسخهی 3.3: هنگامی که عبارت yield تنها عبارت در سمت راست یک دستور انتساب باشد، میتوان پرانتزها را حذف کرد. همچنین ببینید
6.2.8.1. مثالها¶در اینجا یک مثال ساده آمده است که رفتار تولیدگرها و توابع تولیدگر را نشان میدهد: >>> def echo(value=None): ... print("Execution starts when 'next()' is called for the first time.") ... try: ... while True: ... try: ... value = (yield value) ... except Exception as e: ... value = e ... finally: ... print("Don't forget to clean up when 'close()' is called.") ... >>> generator = echo(1) >>> print(next(generator)) Execution starts when 'next()' is called for the first time. 1 >>> print(next(generator)) None >>> print(generator.send(2)) 2 >>> generator.throw(TypeError, "spam") TypeError('spam',) >>> generator.close() Don't forget to clean up when 'close()' is called. برای مثالهایی که از 6.2.8.2. توابع تولیدگر ناهمگام¶وجود عبارت yield در تابع یا متدی که با هنگامی که یک تابع تولیدگر ناهمگام فراخوانی میشود، یک پیمایشگر ناهمگام را بازمیگرداند که بهعنوان یک شیء تولیدگر ناهمگام شناخته میشود. سپس آن شیء اجرای تابع تولیدگر را کنترل میکند. یک شیء تولیدگر ناهمگام بهطور معمول در یک دستور فراخوانی یکی از متدهای تولیدگر ناهمگام یک شیء awaitable بازمیگرداند و اجرا هنگامی آغاز میشود که این شیء await شود. در آن هنگام، اجرا به نخستین عبارت yield میرسد، جایی که دوباره معلق میشود و مقدار اگر یک تولیدگر ناهمگام با در یک تابع تولیدگر ناهمگام، عبارتهای yield در هر جایی از ساختار برای رسیدگی به نهاییسازی هنگام پایان حلقه رویداد، یک حلقه رویداد باید یک تابع نهاییساز (finalizer) تعریف کند که یک پیمایشگرٔ تولیدگر ناهمگام را میگیرد و احتمالاً عبارت 6.3. اولیهها¶اولیهها نشاندهندهی محکمترین عملیات زبان هستند. سینتکس آنها به این صورت است: primary: 6.3.1. ارجاعهای ویژگی¶ارجاع به ویژگی یک عبارت اصلی است که پس از آن یک نقطه و یک نام میآید: attributeref: عبارت اصلی باید به شیءای از نوعی ارزیابی شود که از ارجاعهای ویژگی پشتیبانی میکند؛ بیشتر اشیاء نیز چنین هستند. سپس از این شیء خواسته میشود ویژگیای با نام آن شناسه تولید کند. نوع و مقدار تولیدشده توسط شیء تعیین میشود. ارزیابیهای متعدد یک ارجاع ویژگی یکسان ممکن است اشیاء متفاوتی تولید کنند. این تولید را میتوان با بازنویسی متد اگر یک 6.3.2. زیرنویسیها و اسلایس کردنها¶سینتکس زیرنویسی (subscription) معمولاً برای انتخاب یک عنصر از یک ظرف استفاده میشود -- برای مثال، برای دریافت یک مقدار از یک >>> digits_by_name = {'one': 1, 'two': 2} >>> digits_by_name['two'] # Subscripting a dictionary using the key 'two' 2 در سینتکس زیرنویسی (subscription)، پس از شیء مورد زیرنویسی — یک اولیه — یک زیرنویس (subscript) در کروشههای مربع قرار میگیرد. در سادهترین حالت، زیرنویس یک عبارت واحد است. بسته به نوع شیءای که زیرنویس بر آن اعمال میشود، زیرنویس گاهی کلید (برای نگاشتها)، اندیس (برای دنبالهها)، یا آرگومان نوع (برای انواع عام) نامیده میشود. از نظر سینتکسی، همه اینها معادل هستند: >>> colors = ['red', 'blue', 'green', 'black'] >>> colors[3] # Subscripting a list using the index 3 'black' >>> list[str] # Parameterizing the list type using the type argument str list[str] در رانتایم، مفسر عبارت اصلی و زیرنویس را ارزیابی میکند و برای نشان دادن چگونگی کار زیرنویسی، میتوانیم یک شیء سفارشی تعریف کنیم که >>> class SubscriptionDemo: ... def __getitem__(self, key): ... print(f'subscripted with: {key!r}') ... >>> demo = SubscriptionDemo() >>> demo[1] subscripted with: 1 >>> demo['a' * 3] subscripted with: 'aaa' برای جزئیات مربوط به نحوهی مدیریت زیرنویسی توسط انواع توکار، مستندات از زیرنویسیها نیز میتوان بهعنوان هدف در دستورهای انتساب یا حذف استفاده کرد. در این موارد، مفسر بهترتیب بهجای >>> colors = ['red', 'blue', 'green', 'black'] >>> colors[3] = 'white' # Setting item at index >>> colors ['red', 'blue', 'green', 'white'] >>> del colors[3] # Deleting item at index 3 >>> colors ['red', 'blue', 'green'] همهی شکلهای پیشرفتهی زیرنویس که در بخشهای بعدی مستند شدهاند، برای انتساب و حذف نیز قابل استفادهاند. 6.3.2.1. اسلایسها¶شکل پیشرفتهتری از زیرنویسی، یعنی اسلایس کردن (slicing)، معمولاً برای استخراج بخشی از یک دنباله استفاده میشود. در این حالت، زیرنویس یک اسلایس است: حداکثر سه عبارت که با دونقطه از یکدیگر جدا شدهاند. هر یک از عبارتها ممکن است حذف شود، اما یک اسلایس باید دستکم شامل یک دونقطه باشد: >>> number_names = ['zero', 'one', 'two', 'three', 'four', 'five'] >>> number_names[1:3] ['one', 'two'] >>> number_names[1:] ['one', 'two', 'three', 'four', 'five'] >>> number_names[:3] ['zero', 'one', 'two'] >>> number_names[:] ['zero', 'one', 'two', 'three', 'four', 'five'] >>> number_names[::2] ['zero', 'two', 'four'] >>> number_names[:-3] ['zero', 'one', 'two'] >>> del number_names[4:] >>> number_names ['zero', 'one', 'two', 'three'] هنگامی که یک اسلایس ارزیابی میشود، مفسر یک شیء # continuing with the SubscriptionDemo instance defined above: >>> demo[2:3] subscripted with: slice(2, 3, None) >>> demo[::'spam'] subscripted with: slice(None, None, 'spam') 6.3.2.2. زیرنویسهای جداشده با ویرگول¶همچنین میتوان زیرنویس را بهصورت دو یا چند عبارت یا اسلایس جداشده با کاما نیز مشخص کرد: # continuing with the SubscriptionDemo instance defined above: >>> demo[1, 2, 3] subscripted with: (1, 2, 3) >>> demo[1:2, 3] subscripted with: (slice(1, 2, None), 3) این شکل معمولاً با کتابخانههای عددی برای اسلایس دادههای چندبُعدی استفاده میشود. در این حالت، مفسر یک همچنین میتوان زیرنویس را بهصورت یک عبارت یا اسلایس تنها بههمراه ویرگولی پس از آن، برای مشخص کردن یک تاپل تکعضوی به کار برد: >>> demo['spam',] subscripted with: ('spam',) 6.3.2.3. زیرنویسیهای «ستارهدار»¶اضافه شده در نسخهی 3.11: عبارتهای درون tuple_slices میتوانند ستارهدار باشند. PEP 646 را ببینید. عبارت زیرنویس میتواند شامل یک عبارت ستارهدار نیز باشد. در این حالت، مفسر نتیجه را در قالب یک تاپل واگشایی میکند و این تاپل را به # continuing with the SubscriptionDemo instance defined above: >>> demo[*range(10)] subscripted with: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) میتوان عبارتهای ستارهدار را با عبارتهای جداشده با کاما و اسلایسها ترکیب کرد: >>> demo['a', 'b', *range(3), 'c'] subscripted with: ('a', 'b', 0, 1, 2, 'c') 6.3.2.4. دستور زبان رسمی اشتراک¶subscription: به یاد داشته باشید که عملگر 6.3.3. فراخوانیها¶یک فراخوانی، یک شیء فراخوانیپذیر (برای مثال، یک تابع) را با دنبالهای از آرگومانها که ممکن است خالی باشد فراخوانی میکند: call: ممکن است یک ویرگول پایانی اختیاری پس از آرگومانهای جایگاهی و کلیدواژهای وجود داشته باشد، اما بر معناشناسی تأثیری نمیگذارد. عبارت اصلی باید به یک شیء فراخوانیپذیر ارزیابی شود (توابع تعریفشده توسط کاربر، توابع توکار، متدهای اشیاء توکار، اشیاء کلاس، متدهای نمونههای کلاس، و همه اشیایی که متد اگر آرگومانهای کلیدواژهای وجود داشته باشند، آنها ابتدا به آرگومانهای جایگاهی تبدیل میشوند، به شرح زیر. نخست، فهرستی از جایگاههای پر نشده برای پارامترهای صوری ایجاد میشود. اگر N آرگومان جایگاهی وجود داشته باشد، آنها در N جایگاه نخست قرار میگیرند. سپس، برای هر آرگومان کلیدواژهای، از شناسه برای تعیین جایگاه متناظر استفاده میشود (اگر شناسه با نام نخستین پارامتر صوری یکسان باشد، نخستین جایگاه استفاده میشود، و به همین ترتیب). اگر جایگاه از قبل پر شده باشد، استثنای یک پیادهسازی ممکن است توابع توکاری را ارائه دهد که پارامترهای جایگاهی آنها نام ندارند، حتی اگر برای اهداف مستندسازی «نامگذاریشده» باشند، و بنابراین نمیتوان آنها را با کلیدواژه ارسال کرد. در CPython، این حالت برای توابعی صدق میکند که در C پیادهسازی شدهاند و از اگر آرگومانهای جایگاهی بیشتری نسبت به جایگاههای پارامتر صوری وجود داشته باشد، استثنای اگر آرگومان کلیدواژهای وجود داشته باشد که با نام یک پارامتر صوری مطابقت نداشته باشد، یک استثنای اگر سینتکس پیامد این موضوع آن است که اگرچه سینتکس >>> def f(a, b): ... print(a, b) ... >>> f(b=1, *(2,)) 2 1 >>> f(a=1, *(2,)) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: f() got multiple values for keyword argument 'a' >>> f(1, *(2,)) 1 2 استفاده همزمان از آرگومانهای کلیدواژهای و سینتکس اگر سینتکس هنگامی که از نمیتوان از پارامترهای صوری با سینتکس تغییر یافته در نسخهی 3.5: فراخوانیهای تابع هر تعداد واگشایی یک فراخوانی همیشه مقداری را برمیگرداند، که ممکن است اگر اینطور باشد---
6.4. عبارت await¶اجرای همروال را بر روی یک شیء awaitable معلق میکند. فقط میتواند درون یک تابع همروال استفاده شود. await_expr: "await"
اضافه شده در نسخهی 3.5. 6.5. عملگر توان¶عملگر توان نسبت به عملگرهای یکعملوندی در سمت چپ خود، اولویت بیشتری دارد؛ این عملگر نسبت به عملگرهای یکعملوندی در سمت راست خود، اولویت کمتری دارد. سینتکس به این صورت است: power: ( بنابراین، در یک دنباله بدون پرانتز از عملگرهای توان و یکعملوندی، عملگرها از راست به چپ ارزیابی میشوند (این موضوع ترتیب ارزیابی عملوندها را محدود نمیکند): عملگر توان همان معنایی را دارد که تابع توکار برای عملوندهای int، نتیجه همنوع با عملوندها است، مگر اینکه آرگومان دوم منفی باشد؛ در آن صورت، تمام آرگومانها به float تبدیل میشوند و نتیجهای از نوع float برگردانده میشود. برای مثال، رساندن این عملیات را میتوان با استفاده از متدهای ویژهی 6.6. عملیات حسابی و بیتی یکعملوندی¶تمام عملیات حسابی و بیتی یکعملوندی اولویت یکسانی دارند: u_expr: عملگر یکعملوندی عملگر یکعملوندی عملگر یکعملوندی در هر سه حالت، اگر آرگومان نوع مناسب نداشته باشد، استثنای 6.7. عملیات حسابی دودویی¶عملیات حسابی دودویی دارای سطوح اولویت مرسوم هستند. توجه داشته باشید که برخی از این عملیات بر برخی انواع غیرعددی نیز اعمال میشوند. به جز عملگر توان، تنها دو سطح وجود دارد، یکی برای عملگرهای ضربی و دیگری برای عملگرهای جمعی: m_expr: عملگر این عملیات را میتوان با استفاده از متدهای ویژهی تغییر یافته در نسخهی 3.14: اگر تنها یکی از عملوندها یک عدد مختلط باشد، عملوند دیگر به یک عدد ممیز شناور تبدیل میشود. عملگر این عملیات را میتوان با استفاده از متدهای ویژه اضافه شده در نسخهی 3.5. عملگرهای عملیات تقسیم را میتوان با استفاده از متدهای ویژه عملگر عملگرهای تقسیم کف و باقیمانده با اتحاد زیر به یکدیگر مرتبط هستند: علاوه بر انجام عملیات باقیمانده روی اعداد، اشیاء رشته نیز عملگر عملیات باقیمانده را میتوان با استفاده از متدهای ویژه عملگر تقسیم کف، عملگر باقیمانده (modulo)، و تابع عملگر این عملیات را میتوان با استفاده از متدهای ویژهی تغییر یافته در نسخهی 3.14: اگر تنها یکی از عملوندها یک عدد مختلط باشد، عملوند دیگر به یک عدد ممیز شناور تبدیل میشود. عملگر این عملیات را میتوان با استفاده از متدهای ویژهی تغییر یافته در نسخهی 3.14: اگر تنها یکی از عملوندها یک عدد مختلط باشد، عملوند دیگر به یک عدد ممیز شناور تبدیل میشود. 6.8. عملیات جابهجایی¶عملیات جابهجایی اولویت پایینتری نسبت به عملیات حسابی دارند: shift_expr: این عملگرها، اعداد صحیح را بهعنوان آرگومان میپذیرند. آنها آرگومان اول را به تعداد بیتهای تعیینشده توسط آرگومان دوم، به چپ یا راست شیفت میدهند. عملیات شیفت چپ را میتوان با استفاده از متدهای ویژه شیفت راست به اندازهی n بیت بهصورت تقسیم کف بر 6.9. عملیات بیتبهبیت دودویی¶هر یک از سه عملیات بیتی، سطح اولویت متفاوتی دارد: and_expr: عملگر عملگر عملگر 6.10. مقایسهها¶برخلاف C، تمام عملیات مقایسهای در پایتون اولویت یکسانی دارند که از اولویت هر عملیات حسابی، جابهجایی یا عملیات بیتبهبیتی پایینتر است. همچنین برخلاف C، عبارتهایی مانند comparison: مقایسهها مقادیر بولی را حاصل میکنند: میتوان مقایسهها را بهصورت دلخواه زنجیرهای کرد، برای مثال بهطور رسمی، اگر a، b، c، ...، y، z عبارت باشند و op1، op2، ...، opN عملگرهای مقایسه باشند، آنگاه توجه داشته باشید که 6.10.1. مقایسههای مقدار¶عملگرهای فصل اشیاء، مقادیر و انواع بیان میکند که اشیاء دارای یک مقدار هستند (علاوه بر نوع و هویت). مقدار یک شیء در پایتون مفهومی نسبتاً انتزاعی است: برای مثال، هیچ روش دسترسی کانونیکالی برای مقدار یک شیء وجود ندارد. همچنین الزامی وجود ندارد که مقدار یک شیء به شکل خاصی ساخته شود، مثلاً از تمام ویژگیهای دادهای آن تشکیل شده باشد. عملگرهای مقایسهای مفهوم خاصی از اینکه مقدار یک شیء چیست را پیادهسازی میکنند. میتوان آنها را بهعنوان تعریفکنندهی مقدار یک شیء بهصورت غیرمستقیم، از طریق پیادهسازی مقایسهی خود در نظر گرفت. از آنجا که همه انواع (مستقیم یا غیرمستقیم) زیرنوعهایی از رفتار پیشفرض برای مقایسه برابری ( مقایسه ترتیبی پیشفرض ( رفتار مقایسهی برابری پیشفرض، یعنی اینکه نمونههایی با هویتهای متفاوت همیشه نابرابر هستند، ممکن است با آنچه انواعی که تعریفی معقول از مقدار شیء و برابری مبتنی بر مقدار دارند به آن نیاز دارند، در تضاد باشد. چنین انواعی نیاز خواهند داشت که رفتار مقایسهی خود را سفارشیسازی کنند، و در واقع، تعدادی از انواع توکار این کار را انجام دادهاند. فهرست زیر رفتار مقایسهای مهمترین انواع توکار را توضیح میدهد.
کلاسهای تعریفشده توسط کاربر که رفتار مقایسهی خود را سفارشیسازی میکنند، باید در صورت امکان برخی قواعد سازگاری را رعایت کنند:
پایتون این قوانین سازگاری را اعمال نمیکند. در واقع، مقدارهای غیرعدد (not-a-number) نمونهای از پیروی نکردن از این قوانین هستند. 6.10.2. عملیات آزمون عضویت¶عملگرهای برای انواع رشته و بایت، برای کلاسهای تعریفشده توسط کاربر که متد برای کلاسهای تعریفشده توسط کاربر که در نهایت، پروتکل پیمایش بهسبک قدیمی آزموده میشود: اگر کلاسی عملگر 6.10.3. مقایسههای هویت¶عملگرهای 6.11. عملیات بولی¶or_test: در عملیات بولی، و همچنین هنگامی که عبارات در دستورهای کنترل جریان به کار میروند، مقادیر زیر بهعنوان نادرست تفسیر میشوند: عملگر عبارت عبارت توجه داشته باشید که نه 6.12. عبارات انتساب¶assignment_expression: [ یک عبارت انتساب (که گاهی به آن «عبارت نامدار» یا «والروس» نیز گفته میشود) یک یکی از موارد استفادهی رایج، هنگام پردازش عبارات باقاعدهی تطبیقیافته است: if matching := pattern.search(data): do_something(matching) یا، هنگام پردازش جریان پرونده بهصورت تکهای : while chunk := file.read(9000): process(chunk) عبارات مقیدسازی باید هنگامی که بهعنوان دستورهای عبارتی استفاده میشوند و هنگامی که بهعنوان زیرعبارتهایی در عبارتهای اسلایس، شرطی، لامبدا، آرگومان کلیدواژهای و عبارتهای if در درک (comprehension-if) و در دستورهای اضافه شده در نسخهی 3.8: برای جزئیات بیشتر دربارهی عبارتهای انتساب، PEP 572 را ببینید. 6.13. عبارات شرطی¶conditional_expression: یک عبارت شرطی (که گاهی به آن «عملگر سهتایی» گفته میشود) جایگزینی برای دستور if-else است. از آنجا که این یک عبارت است، مقداری برمیگرداند و میتواند بهعنوان یک زیرعبارت ظاهر شود. عبارت برای جزئیات بیشتر درباره عبارات شرطی، PEP 308 را ببینید. 6.14. لامبداها¶lambda_expr: "lambda" [ عبارات لامبدا (که گاهی فرمهای لامبدا نامیده میشوند) برای ایجاد توابع ناشناس استفاده میشوند. عبارت def <lambda>(parameters):
return expression
برای سینتکس فهرستهای پارامتر، بخش تابع را ببینید. توجه داشته باشید که توابع ایجادشده با عبارتهای lambda نمیتوانند شامل دستور یا حاشیهنویسیها باشند. 6.15. فهرستهای عبارت¶starred_expression: "*" مگر وقتی که بخشی از یک نمایش فهرست یا مجموعه باشد، یک فهرست عبارت شامل حداقل یک ویرگول، یک تاپل حاصل میدهد. طول تاپل برابر تعداد عبارتهای داخل فهرست است. عبارتها از چپ به راست ارزیابی میشوند. ویرگول پایانی فقط برای ایجاد یک تاپل تکآیتمی، مانند 6.15.1. بازکردن بستهی پیمایشپذیر¶در یک فهرست عبارت یا تاپل، نمایش فهرست یا مجموعه، هر عبارتی ممکن است با یک ستاره ( در رانتایم، عبارت پیشوندگرفته با ستاره باید به یک پیمایشپذیر ارزیابی شود. پیمایشپذیر به دنبالهای از آیتمها گسترش مییابد که در تاپل، فهرست یا مجموعهی جدید، در محل بازکردن بسته گنجانده میشوند. اضافه شده در نسخهی 3.5: واگشایی پیمایشپذیرها در فهرستهای عبارت، که در ابتدا در PEP 448 پیشنهاد شد. اضافه شده در نسخهی 3.11: هر آیتم در یک فهرست عبارت میتواند ستارهدار شود. PEP 646 را ببینید. 6.16. ترتیب ارزیابی¶پایتون عبارتها را از چپ به راست ارزیابی میکند. توجه داشته باشید که هنگام ارزیابی یک انتساب، سمت راست پیش از سمت چپ ارزیابی میشود. در سطرهای زیر، عبارتها به ترتیب حسابی پسوندهایشان ارزیابی میشوند: expr1, expr2, expr3, expr4 (expr1, expr2, expr3, expr4) {expr1: expr2, expr3: expr4} expr1 + expr2 * (expr3 - expr4) expr1(expr2, expr3, *expr4, **expr5) expr3, expr4 = expr1, expr2 6.17. اولویت عملگرها¶جدول زیر اولویت عملگرها در پایتون را خلاصه میکند، از بالاترین اولویت (بیشترین اتصال) تا پایینترین اولویت (کمترین اتصال). عملگرهای موجود در یک جعبه، اولویت یکسانی دارند. مگر اینکه سینتکس بهصراحت ذکر شده باشد، عملگرها دودویی هستند. عملگرهای موجود در یک جعبه از چپ به راست گروهبندی میشوند (بهجز توانگیری و عبارتهای شرطی که از راست به چپ گروهبندی میشوند). توجه داشته باشید که مقایسهها، آزمونهای عضویت و آزمونهای هویت، همگی اولویت یکسانی دارند و از ویژگی زنجیرهسازی چپبهراست برخوردارند، همانطور که در بخش مقایسهها توضیح داده شده است.
پانویسها
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است. مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند. برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید. بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است. لطفاً کمک مالی کنید. آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC). آیا اشکالی یافتید؟ ساخته شده با Sphinx 9.1.0. | ||||||||||||||||||||||||||||||||||||||
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |