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 — 2. تحلیل واژگانی 2. تحلیل واژگانی¶یک برنامهی پایتون توسط یک پارسر خوانده میشود. ورودی پارسر جریانی از توکنها است که توسط تحلیلگر واژگانی (که با نام توکنساز نیز شناخته میشود) تولید میشود. این فصل شرح میدهد که تحلیلگر واژگانی چگونه این توکنها را تولید میکند. تحلیلگر واژگانی، کدگذاری متن برنامه را تعیین میکند (بهطور پیشفرض UTF-8)، و متن را به نویسههای منبع کدگشایی میکند. اگر متن نتواند کدگشایی شود، یک در ادامه، تحلیلگر واژگانی از نویسههای منبع برای تولید جریانی از توکنها استفاده میکند. نوع یک توکن تولیدشده عموماً به نویسه منبع بعدی که قرار است پردازش شود، بستگی دارد. بهطور مشابه، سایر رفتارهای خاص تحلیلگر به نخستین نویسه منبع که هنوز پردازشنشده است، بستگی دارد. جدول زیر خلاصهای سریع از این نویسههای منبع را بههمراه پیوندهایی به بخشهایی که اطلاعات بیشتری دارند، ارائه میدهد.
2.1. ساختار سطر¶یک برنامه پایتون به تعدادی خط منطقی تقسیم میشود. 2.1.1. سطرهای منطقی¶پایان یک خط منطقی با توکن 2.1.2. سطرهای فیزیکی¶یک خط فیزیکی، دنبالهای از نویسهها است که با یکی از دنبالههای پایان خط زیر پایان مییابد:
صرفنظر از سکو، هر یک از این دنبالهها با یک نویسهی ASCII LF (linefeed) جایگزین میشود. (این کار حتی در داخل string literals نیز انجام میشود.) هر خط میتواند از هر یک از این دنبالهها استفاده کند؛ لازم نیست که این دنبالهها در یک پرونده یکدست باشند. پایان ورودی همچنین بهعنوان پایاندهندهای ضمنی برای آخرین خط فیزیکی عمل میکند. بهصورت رسمی: newline: <ASCII LF> | <ASCII CR> <ASCII LF> | <ASCII CR> 2.1.3. کامنتها¶یک کامنت با نویسهی هش ( 2.1.4. اعلامیههای کدگذاری¶اگر یک کامنت در خط اول یا دوم اسکریپت پایتون با عبارت باقاعده # -*- coding: <encoding-name> -*-
که GNU Emacs نیز آن را شناسایی میکند، و # vim:fileencoding=<encoding-name>
که توسط VIM متعلق به Bram Moolenaar شناسایی میشود. اگر هیچ اعلان کدگذاری یافت نشود، کدگذاری پیشفرض UTF-8 است. اگر کدگذاری ضمنی یا صریح یک پرونده UTF-8 باشد، یک نشانگر ترتیب بایت (byte-order mark) اولیهی UTF-8 ( اگر کدگذاری اعلامشده باشد، نام کدگذاری باید توسط پایتون شناخته شود (به کدگذاریهای استاندارد مراجعه کنید). از این کدگذاری برای تمام تحلیل واژگانی، از جمله رشتههای لفظی، کامنتها و شناسهها استفاده میشود. تمام تحلیل واژگانی، شامل مقادیر لفظی رشته، کامنتها و شناسهها، روی متن یونیکد کدگشاییشده با کدگذاری منبع انجام میشود. هر نقطه کد یونیکد، بهجز نویسه کنترلی NUL، میتواند در منبع پایتون ظاهر شود. source_character: <any Unicode code point, except NUL> 2.1.5. پیوند صریح سطرهای¶دو یا چند خط فیزیکی را میتوان با استفاده از نویسههای بکاسلش ( if 1900 < year < 2100 and 1 <= month <= 12 \ and 1 <= day <= 31 and 0 <= hour < 24 \ and 0 <= minute < 60 and 0 <= second < 60: # Looks like a valid date return 1 سطری که با بکاسلش پایان مییابد، نمیتواند حاوی یک کامنت باشد. بکاسلش یک کامنت را ادامه نمیدهد. بکاسلش یک توکن را ادامه نمیدهد، مگر در مورد رشتههای لفظی (یعنی توکنهایی غیر از رشتههای لفظی نمیتوانند با استفاده از بکاسلش بین سطرهای فیزیکی شکسته شوند). بکاسلش در هر جای دیگری از یک خط، خارج از یک رشتهی لفظی، غیرمجاز است. 2.1.6. پیوند ضمنی سطرهای¶عبارات داخل پرانتز، کروشه یا آکولاد را میتوان بدون استفاده از بکاسلش در بیش از یک خط فیزیکی تقسیم کرد. برای مثال: month_names = ['Januari', 'Februari', 'Maart', # These are the 'April', 'Mei', 'Juni', # Dutch names 'Juli', 'Augustus', 'September', # for the months 'Oktober', 'November', 'December'] # of the year سطرهای ادامهیافته بهصورت ضمنی میتوانند حاوی کامنت باشند. تورفتگی سطرهای ادامه مهم نیست. سطرهای ادامه خالی مجاز هستند. بین سطرهای ادامه ضمنی هیچ توکن NEWLINE وجود ندارد. سطرهای ادامهیافته بهصورت ضمنی همچنین میتوانند درون رشتههای سهنقلقولی (در ادامه ببینید) رخ دهند؛ در این حالت نمیتوانند حاوی کامنت باشند. 2.1.7. سطرهای خالی¶یک خط منطقی که فقط شامل فاصلهها، تبها، تغذیههای صفحه (formfeeds) و احتمالاً یک کامنت باشد، نادیده گرفته میشود (یعنی هیچ توکن 2.1.8. تورفتگی¶فضای سفید ابتدایی (فاصلهها و تبها) در آغاز یک خط منطقی، برای محاسبهی سطح تورفتگی آن خط استفاده میشود، که به نوبهی خود برای تعیین گروهبندی دستورات به کار میرود. تبها (از چپ به راست) با ۱ تا ۸ فاصله جایگزین میشوند، بهگونهای که تعداد کل نویسهها تا پایان جایگزینی، مضربی از ۸ باشد (هدف این است که همان قاعدهای باشد که در یونیکس استفاده میشود). سپس تعداد کل فاصلههای پیش از اولین نویسهی غیرسفید، تورفتگی خط را تعیین میکند. تورفتگی را نمیتوان با استفاده از بکاسلشها به چند خط فیزیکی تقسیم کرد؛ فضای سفید تا اولین بکاسلش، تورفتگی را تعیین میکند. اگر یک پرونده منبع تبها و فاصلهها را بهگونهای با هم ترکیب کند که معنا به ارزش یک تب بر حسب فاصله وابسته باشد، تورفتگی بهعنوان ناسازگار رد میشود؛ در این صورت یک یادداشت سازگاری بینسکویی: به دلیل ماهیت ویرایشگرهای متن در سکوهای غیر UNIX، استفاده از ترکیبی از فاصلهها و تبها برای تورفتگی در یک پرونده منبع واحد، عاقلانه نیست. همچنین باید توجه داشت که سکوهای مختلف ممکن است بهصراحت حداکثر سطح تورفتگی را محدود کنند. ممکن است یک نویسهی تغذیهی صفحه (formfeed) در ابتدای خط وجود داشته باشد؛ این نویسه در محاسبات تورفتگی ذکرشده در بالا نادیده گرفته میشود. نویسههای تغذیهی صفحه (formfeed) که در جاهای دیگر فضای سفید ابتدای خط قرار دارند، اثر تعریفنشدهای دارند (برای نمونه، ممکن است تعداد فاصلهها را به صفر بازنشانی کنند). سطوح تورفتگی سطرهای متوالی، با استفاده از یک پشته، به شرح زیر برای تولید توکنهای پیش از آنکه نخستین خط پرونده خوانده شود، یک صفر روی پشته قرار میگیرد؛ این صفر هرگز دوباره از پشته برداشته نخواهد شد. اعدادی که روی پشته قرار میگیرند، همیشه از پایین به بالا بهطور اکید صعودی خواهند بود. در آغاز هر خط منطقی، سطح تورفتگی آن خط با بالای پشته مقایسه میشود. اگر برابر باشد، هیچ اتفاقی نمیافتد. اگر بزرگتر باشد، روی پشته قرار میگیرد و یک توکن در اینجا نمونهای از یک قطعه کد پایتون با تورفتگی صحیح (هرچند گیجکننده) آمده است: def perm(l): # Compute the list of all permutations of l if len(l) <= 1: return [l] r = [] for i in range(len(l)): s = l[:i] + l[i+1:] p = perm(s) for x in p: r.append(l[i:i+1] + x) return r مثال زیر خطاهای مختلف تورفتگی را نشان میدهد: def perm(l): # error: first line indented for i in range(len(l)): # error: not indented s = l[:i] + l[i+1:] p = perm(l[:i] + l[i+1:]) # error: unexpected indent for x in p: r.append(l[i:i+1] + x) return r # error: inconsistent dedent (در واقع، سه خطای اول توسط پارسر تشخیص داده میشوند؛ تنها آخرین خطا توسط تحلیلگر واژگانی (lexical analyzer) پیدا میشود --- تورفتگی 2.1.9. فضای سفید بین توکنها¶بهجز در ابتدای یک خط منطقی یا در رشتههای لفظی (string literals)، میتوان از نویسههای فضای خالی یعنی فاصله، تب و تغذیهی صفحه (formfeed) برای جدا کردن توکنها بهجای یکدیگر استفاده کرد: whitespace: ' ' | tab | formfeed
فضای سفید تنها زمانی بین دو توکن لازم است که در نبود آن، الحاق آنها بتواند بهعنوان یک توکن متفاوت تفسیر شود. برای مثال، 2.1.10. نشانگر پایان¶در پایان ورودی غیرتعاملی، تحلیلگر واژگانی یک توکن 2.2. سایر توکنها¶علاوه بر 2.3. نامها (شناسهها و کلیدواژهها)¶توکنهای نامها از نویسههای زیر تشکیل شدهاند:
نامها باید حداقل شامل یک نویسه باشند، اما محدودیت بالایی برای طول آنها وجود ندارد. بزرگی و کوچکی حروف اهمیت دارد. بهطور رسمی، نامها با تعاریف واژگانی زیر توصیف میشوند: NAME: توجه داشته باشید که همهی نامهایی که با این گرامر مطابقت دارند، معتبر نیستند؛ برای جزئیات نویسههای غیر ASCII در نامها را ببینید. 2.3.1. کلیدواژهها¶نامهای زیر بهعنوان واژههای رزروشده، یا کلیدواژههای زبان، استفاده میشوند و نمیتوان از آنها بهعنوان شناسههای عادی استفاده کرد. آنها باید دقیقاً به همان شکلی که اینجا نوشته شدهاند، نوشته شوند: False await else import pass None break except in raise True class finally is return and continue for lambda try as def from nonlocal while assert del global not with async elif if or yield 2.3.2. کلیدواژههای نرم¶اضافه شده در نسخهی 3.10. برخی نامها تنها در زمینههای خاص محفوظ هستند. این موارد بهعنوان کلیدواژههای نرم شناخته میشوند:
این موارد از نظر نحوی در زمینههای خاص خود بهعنوان کلیدواژه عمل میکنند، اما این تمایز در سطح پارسر صورت میگیرد، نه هنگام توکنبندی (tokenizing). بهعنوان کلیدواژههای نرم (soft keywords)، استفاده از آنها در دستور زبان ممکن است، در حالی که سازگاری با کد موجودی که از این نامها بهعنوان شناسه استفاده میکند همچنان حفظ میشود. تغییر یافته در نسخهی 3.12: تغییر یافته در نسخهی 3.15: 2.3.3. کلاسهای رزروشدهی شناسهها¶برخی از کلاسهای شناسهها (بهجز کلیدواژهها) معانی خاصی دارند. این کلاسها با الگوهای نویسههای زیرخط آغازین و پایانی شناسایی میشوند:
2.3.4. نویسههای غیر ASCII در نامها¶نامهایی که شامل نویسههای غیر ASCII هستند، به نرمالسازی و اعتبارسنجی بیشتری فراتر از قواعد و دستور زبان توضیحدادهشده در بالا نیاز دارند. برای مثال، این بخش قواعد دقیق را توضیح میدهد. تمام نامها هنگام تجزیه به normalization form NFKC تبدیل میشوند. این بدان معناست که، برای مثال، برخی صورتهای تایپوگرافیک نویسهها به فرم «پایه» خود تبدیل میشوند. برای مثال، >>> fiⁿₐˡᵢᶻₐᵗᵢᵒₙ = 3 >>> finalization 3 نکته نرمالسازی فقط در سطح واژگانی انجام میشود. توابع رانتایمی که نامها را بهعنوان رشته دریافت میکنند، معمولاً آرگومانهای خود را نرمالسازی نمیکنند. برای مثال، متغیر تعریفشده در بالا در رانتایم در دیکشنری همانطور که نامهای فقط ASCII باید فقط شامل حروف، ارقام و زیرخط باشند و نمیتوانند با یک رقم آغاز شوند، یک نام معتبر باید با نویسهای از مجموعه «شبیهحروف» این مجموعهها بر پایهی مجموعههای XID_Start و XID_Continue هستند، همانگونه که در پیوست UAX-31 استاندارد یونیکد تعریف شدهاند. فهرست غیرهنجاری (non-normative) از نویسههای موجود در مجموعههای XID_Start و XID_Continue، طبق تعریف یونیکد، در پرونده DerivedCoreProperties.txt در پایگاه داده نویسههای یونیکد در دسترس است. برای ارجاع، قواعد ساخت مجموعههای مجموعه
سپس مجموعهی مجموعهی
باز هم، دستهبندیهای یونیکد از همان نسخهای از پایگاه دادهی نویسههای یونیکد استفاده میکنند که در ماژول 2.4. مقادیر لفظی¶مقادیر لفظی نشانههایی برای مقادیر ثابت برخی از انواع توکار هستند. از نظر تحلیل واژگانی، پایتون دارای مقادیر لفظی رشته، بایت و عددی است. سایر «مقادیر لفظی» از نظر واژگانی با استفاده از کلیدواژهها ( 2.5. مقادیر لفظی رشته و بایت¶مقادیر لفظی رشته، متنهایی هستند که درون علامت نقلقول تکی ( "spam" 'eggs' علامت نقلقولی که برای آغاز مقدار لفظی به کار میرود، آن را نیز پایان میدهد، بنابراین یک رشتهی لفظی فقط میتواند شامل علامت نقلقول دیگر باشد (مگر با استفاده از دنبالههای خنثیسازی، در زیر ببینید). برای مثال: 'Say "Hello", please.' "Don't do that!" به جز این محدودیت، انتخاب نویسهی علامت نقلقول ( در یک لفظی رشته، نویسهی بکاسلش ( >>> print("Say \"Hello\" to everyone!") Say "Hello" to everyone! برای فهرست کاملی از چنین دنبالههایی و جزئیات بیشتر، دنبالههای خنثیسازی را در زیر ببینید. 2.5.1. رشتههای سهعلامتنقلقولی¶رشتهها همچنین میتوانند درون گروههای سهتایی همسان از علامتهای نقلقول تکی یا دوتایی محصور شوند. به این رشتهها بهطور کلی رشتههای سهنقلقولی (triple-quoted strings) گفته میشود: """این یک رشته سهنقلقولی است."""
در مقادیر لفظی سهنقلقولی، علامتهای نقلقول خنثینشده مجاز هستند (و حفظ میشوند)، به این استثنا که سه علامت نقلقول خنثینشده پشتسرهم، اگر از همان نوع ( """این رشته در خود "علامتهای نقلقول" دارد."""
سطرهای جدید خنثینشده نیز مجاز هستند و حفظ میشوند: '''This triple-quoted string continues on the next line.''' 2.5.2. پیشوندهای رشته¶رشتههای لفظی میتوانند یک prefix اختیاری داشته باشند که بر نحوهی تجزیهی محتوای آنها تأثیر میگذارد، برای مثال: b"data" f'{result=}' پیشوندهای مجاز عبارتند از:
برای جزئیات مربوط به هر نوع، بخشهای پیوندشده را ببینید. پیشوندها به بزرگی و کوچکی حروف حساس نیستند (برای مثال، ' اضافه شده در نسخهی 3.3: پیشوند پشتیبانی از لفظی قدیمی یونیکد ( 2.5.3. دستور زبان صوری¶رشتههای لفظی، بهجز «افاسترینگها» و «تیاسترینگها»، با تعاریف واژگانی زیر توصیف شدهاند. این تعریفها از پیشنگرهای منفی ( STRING: [ توجه داشته باشید که مانند همهی تعاریف واژگانی، فضای سفید معنادار است. بهویژه، پیشوند (در صورت وجود) باید بلافاصله با علامت نقلقول آغازین دنبال شود. 2.5.4. دنبالههای خنثیسازی¶مگر آنکه پیشوند '
2.5.4.1. پایان خط نادیده گرفته میشود¶برای چشمپوشی از خط جدید، میتوان یک بکاسلش در انتهای خط اضافه کرد: >>> 'This string will not include \ ... backslashes or newline characters.' 'This string will not include backslashes or newline characters.' همین نتیجه را میتوان با استفاده از رشتههای با سه علامت نقلقول، یا پرانتزها و الحاق رشتههای لفظی به دست آورد. 2.5.4.2. نویسههای خنثیشده¶برای درج یک بکاسلش در یک لفظی رشته پایتون غیر خام، باید آن را دو برابر کرد. دنباله خنثیسازی >>> print('C:\\Program Files') C:\Program Files به همین ترتیب، دنبالههای >>> print('\' and \"') ' and " 2.5.4.3. نویسهی مبنای هشت¶دنبالهی >>> '\120' 'P' تا سه رقم مبنای هشت (۰ تا ۷) پذیرفته میشود. در یک لفظی bytes، نویسه به معنای یک بایت با مقدار دادهشده است. در یک لفظی رشته، به معنای یک نویسهی یونیکد با مقدار دادهشده است. تغییر یافته در نسخهی 3.11: دنبالههای خنثیسازی مبنای هشت با مقدار بزرگتر از تغییر یافته در نسخهی 3.12: دنبالههای خنثیسازی مبنای هشت با مقداری بزرگتر از 2.5.4.4. نویسهی مبنای شانزده¶دنبالهی >>> '\x50' 'P' برخلاف C استاندارد، دقیقاً دو رقم مبنای شانزده لازم است. در یک لفظی bytes، نویسه به معنای یک بایت با مقدار دادهشده است. در یک لفظی رشته، به معنای یک نویسهی یونیکد با مقدار دادهشده است. 2.5.4.5. نویسهی یونیکد نامدار¶دنبالهی >>> '\N{LATIN CAPITAL LETTER P}' 'P' >>> '\N{SNAKE}' '🐍' این دنباله نمیتواند در مقادیر لفظی بایتی ظاهر شود. تغییر یافته در نسخهی 3.3: پشتیبانی از نام مستعارها اضافه شده است. 2.5.4.6. نویسههای یونیکد مبنای شانزده¶این دنبالهها >>> '\u1234' 'ሴ' >>> '\U0001f40d' '🐍' این دنبالهها نمیتوانند در مقادیر لفظی بایتی ظاهر شوند. 2.5.4.7. دنبالههای خنثیسازی شناسایینشده¶برخلاف C استاندارد، همهی دنبالههای خنثیسازی ناشناخته بدون تغییر در رشته باقی میمانند، یعنی بکاسلش در نتیجه باقی میماند: >>> print('\q') \q >>> list('\q') ['\\', 'q'] توجه داشته باشید که برای مقادیر لفظی bytes، دنبالههای خنثیسازیی که فقط در مقادیر لفظی رشتهای شناسایی میشوند ( تغییر یافته در نسخهی 3.6: دنبالههای خنثیسازی ناشناخته، یک تغییر یافته در نسخهی 3.12: دنبالههای خنثیسازی ناشناخته باعث ایجاد یک 2.5.5. مقادیر لفظی بایتی¶مقادیر لفظی بایت (Bytes literals) همیشه پیشوند ' >>> b'\x89PNG\r\n\x1a\n' b'\x89PNG\r\n\x1a\n' >>> list(b'\x89PNG\r\n\x1a\n') [137, 80, 78, 71, 13, 10, 26, 10] بهطور مشابه، یک بایت صفر باید با استفاده از یک دنباله خنثیسازی بیان شود (معمولاً 2.5.6. مقادیر لفظی رشته خام¶هم مقادیر لفظی رشته و هم مقادیر لفظی بایت میتوانند بهصورت اختیاری با حرف ' >>> r'\d{4}-\d{2}-\d{2}' '\\d{4}-\\d{2}-\\d{2}' حتی در یک لفظی خام، میتوان علامتهای نقلقول را با بکاسلش خنثی کرد، اما بکاسلش در نتیجه باقی میماند؛ برای مثال، 2.5.7. افاسترینگها¶اضافه شده در نسخهی 3.6. تغییر یافته در نسخهی 3.7: میتوان از تغییر یافته در نسخهی 3.8: مشخصکننده اشکالزدایی ( تغییر یافته در نسخهی 3.12: بسیاری از محدودیتهای مربوط به عبارتهای درون افاسترینگها برداشته شدهاند. بهویژه، رشتههای تودرتو، کامنتها و بکاسلشها اکنون مجاز هستند. یک لفظی رشته قالببندیشده (formatted string literal) یا افاسترینگ (f-string)، لفظی رشتهای است که با ' >>> who = 'nobody' >>> nationality = 'Spanish' >>> f'{who.title()} expects the {nationality} Inquisition!' 'Nobody expects the Spanish Inquisition!' هر کمانک دوتایی ( >>> print(f'{{...}}') {...} سایر نویسههای خارج از فیلدهای جایگزینی مانند لیترالهای رشتهای معمولی رفتار میشوند. این بدان معنا است که دنبالههای خنثیسازی کدگشایی میشوند (مگر وقتی که یک لیتِرال نیز بهعنوان رشته خام علامتگذاری شده باشد) و امکان استفاده از سطرهای جدید در افاسترینگهای با سه علامت نقلقول وجود دارد: >>> name = 'Galahad' >>> favorite_color = 'blue' >>> print(f'{name}:\t{favorite_color}') Galahad: blue >>> print(rf"C:\Users\{name}") C:\Users\Galahad >>> print(f'''Three shall be the number of the counting ... and the number of the counting shall be three.''') Three shall be the number of the counting and the number of the counting shall be three. عبارات در رشتههای قالببندیشده مانند عبارات معمولی پایتون رفتار میشوند. هر عبارت در زمینهای که رشته قالببندیشده در آن ظاهر میشود، به ترتیب از چپ به راست ارزیابی میشود. عبارت خالی مجاز نیست، و هر دو عبارت >>> f'{(half := 1/2)}, {half * 42}' '0.5, 21.0' استفادهی مجدد از نوع علامت نقلقول افاسترینگ بیرونی در داخل یک فیلد جایگزینی (replacement field) مجاز است: >>> a = dict(x=2) >>> f"abc {a["x"]} def" 'abc 2 def' بکاسلشها نیز در فیلدهای جایگزینی مجاز هستند و به همان شیوهی هر زمینهی دیگری ارزیابی میشوند: >>> a = ["a", "b", "c"] >>> print(f"List a contains:\n{"\n".join(a)}") List a contains: a b c میتوان افاسترینگها را تودرتو کرد: >>> name = 'world' >>> f'Repeated:{f' hello {name}' * 3}' 'Repeated: hello world hello world hello world' برنامههای پایتون قابلحمل نباید از بیش از ۵ سطح تودرتویی استفاده کنند. CPython تودرتوی افاسترینگها را محدود نمیکند. عبارتهای جایگزینی میتوانند در هر دو نوع افاسترینگ با یک علامت نقلقول و با سه علامت نقلقول شامل سطرهای جدید باشند و همچنین میتوانند شامل کامنت باشند. هر چیزی که پس از >>> a = 2
>>> f"abc{a # This comment }" continues until the end of the line
... + 3}"
'abc5'
پس از عبارت، فیلدهای جایگزینی میتوانند بهاختیار شامل موارد زیر باشند:
برای جزئیات درباره چگونگی ارزیابی این فیلدها، بخش کتابخانه استاندارد درباره افاسترینگها را ببینید. همانطور که آن بخش توضیح میدهد، مشخصکنندههای قالببندی بهعنوان دومین آرگومان به تابع >>> number = 14.3 >>> f'{number:20.7f}' ' 14.3000000' مشخصکنندههای قالب سطح بالا ممکن است شامل فیلدهای جایگزینی تودرتو باشند: >>> field_size = 20 >>> precision = 7 >>> f'{number:{field_size}.{precision}f}' ' 14.3000000' این فیلدهای تودرتو ممکن است شامل فیلدهای تبدیل و مشخصکنندههای قالب خود باشند: >>> number = 3 >>> f'{number:{field_size}}' ' 3' >>> f'{number:{field_size:05}}' '00000000000000000003' با این حال، این فیلدهای تودرتو نمیتوانند شامل فیلدهای جایگزینی با تودرتویی عمیقتر باشند. مقادیر لفظی رشته قالببندیشده را نمیتوان بهعنوان رشته مستند استفاده کرد، حتی اگر شامل عبارت نباشند: >>> def foo(): ... f"Not a docstring" ... >>> print(foo.__doc__) None همچنین ببینید
2.5.8. تیاسترینگها (t-strings)¶اضافه شده در نسخهی 3.14. رشتهی الگو (template string literal) یا تیاسترینگ (t-string) یک رشتهی لفظی (string literal) است که با ' 2.5.9. دستور زبان رسمی برای افاسترینگها¶افاسترینگها تا حدی توسط تحلیلگر واژگانی (lexical analyzer) پردازش میشوند که توکنهای بهطور متناظر، گرامر افاسترینگ ترکیبی از تعاریف واژگانی و نحوی است. فضای سفید در این موقعیتها اهمیت دارد:
تعریف fstring: نکته در قطعه دستور زبان بالا، قواعد ساخت یک دستور زبان صوری سنتیتر از این قالب، بهعنوان تمرینی برای خواننده باقی میماند. دستور زبان تیاسترینگها با دستور زبان افاسترینگها یکسان است، با این تفاوت که t بهجای f در ابتدای نام قواعد و توکنها و در پیشوند قرار میگیرد. tstring: TSTRING_START tstring_middle* TSTRING_END <rest of the t-string grammar is omitted; see above> 2.6. مقادیر لفظی عددی¶توکنهای NUMBER: مقدار عددی یک لفظی عددی (numeric literal) همان مقداری است که گویی آن لفظی بهصورت یک رشته به سازندهی کلاس اعداد لفظی شامل علامت نمیشوند؛ عبارتی مانند 2.6.1. مقادیر لفظی عدد صحیح¶مقادیر لفظی عدد صحیح، اعداد حسابی را نشان میدهند. برای مثال: 7 3 2147483647 هیچ محدودیتی برای طول مقادیر لفظی عدد صحیح وجود ندارد، مگر آنچه میتواند در حافظهی موجود ذخیره شود: 7922816251426433759354395033679228162514264337593543950336
میتوان از زیرسطرها برای گروهبندی ارقام جهت خوانایی بهتر استفاده کرد، و آنها هنگام تعیین مقدار عددی لفظی نادیده گرفته میشوند. برای مثال، مقادیر لفظی زیر معادل هستند: 100_000_000_000 100000000000 1_00_00_00_00_000 زیرسطرها فقط میتوانند بین ارقام قرار بگیرند. برای مثال، میتوان اعداد صحیح را بهترتیب با پیشوندهای 0b100110111 0b_1110_0101 0o177 0o377 0xdeadbeef 0xDead_Beef یک زیرخط میتواند پس از مشخصکنندهی مبنا بیاید. برای مثال، صفرهای آغازین در یک عدد دهدهی غیرصفر مجاز نیستند. برای مثال، بهطور رسمی، مقادیر لفظی عدد صحیح با تعاریف واژگانی زیر توصیف میشوند: integer: تغییر یافته در نسخهی 3.6: اکنون استفاده از زیرسطرها برای اهداف گروهبندی در مقادیر لفظی مجاز است. 2.6.2. مقادیر لفظی ممیز شناور¶مقادیر لفظی ممیز شناور (float)، مانند آنها از بخشهای صحیح و کسری تشکیل شدهاند که هر یک از ارقام دهدهی ساخته شده است. این بخشها با یک نقطهی اعشار، 2.71828 4.0 برخلاف مقادیر لفظی عدد صحیح، صفرهای پیشرو مجاز هستند. برای مثال، مانند مقادیر لفظی عدد صحیح، زیرسطرهای تکی میتوانند بین ارقام قرار بگیرند تا خوانایی را بهبود بخشند: 96_485.332_123 3.14_15_93 هر یک از این بخشها میتواند خالی باشد، اما نه هر دو. برای مثال: 10. # (equivalent to 10.0) .001 # (equivalent to 0.001) بهصورت اختیاری، ممکن است پس از بخش عدد صحیح و بخش کسری یک توان بیاید: حرف 1.0e3 # (represents 1.0×10³, or 1000.0) 1.166e-5 # (represents 1.166×10⁻⁵, or 0.00001166) 6.02214076e+23 # (represents 6.02214076×10²³, or 602214076000000000000000.) در اعداد اعشاریی که فقط بخش عدد صحیح و بخش توان دارند، میتوان نقطه اعشار را حذف کرد: 1e3 # (equivalent to 1.e3 and 1.0e3) 0e0 # (equivalent to 0.) بهطور رسمی، مقادیر لفظی ممیز شناور با تعاریف واژگانی زیر توصیف میشوند: floatnumber: | تغییر یافته در نسخهی 3.6: اکنون استفاده از زیرسطرها برای اهداف گروهبندی در مقادیر لفظی مجاز است. 2.6.3. مقادیر لفظی موهومی¶پایتون اشیای عدد مختلط دارد، اما هیچ لفظی مختلطی ندارد. در عوض، مقادیر لفظی موهومی نشاندهندهی اعداد مختلط با بخش حقیقی صفر هستند. برای مثال، در ریاضیات، عدد مختلط 3+4.2i بهصورت جمع عدد حقیقی 3 با عدد موهومی 4.2i نوشته میشود. پایتون از سینتکس مشابهی استفاده میکند، با این تفاوت که واحد موهومی بهجای i بهصورت 3+4.2j این یک عبارت تشکیلشده از لفظی عدد صحیح 3 + 4.2j هیچ فضای سفیدی در درون هر توکن مجاز نیست. بهویژه، پسوند عدد پیش از 4.2j 3.14j 10.j .001j 1e100j 3.14e-10j 3.14_15_93j برخلاف یک لفظی ممیز شناور، اگر عدد موهومی فقط بخش صحیح داشته باشد، میتوان نقطه اعشار را حذف کرد. این عدد همچنان بهعنوان یک عدد ممیز شناور ارزیابی میشود، نه یک عدد صحیح: 10j 0j 1000000000000000000000000j # equivalent to 1e+24j پسوند 3.14J # equivalent to 3.14j بهطور رسمی، مقادیر لفظی موهومی با تعریف واژگانی زیر توصیف میشوند: imagnumber: ( 2.7. عملگرها و جداکنندهها¶دستور زبان زیر توکنهای عملگر (operator) و جداکننده (delimiter) را تعریف میکند، یعنی نوع توکن عام OP: | assignment_operator | bitwise_operator | comparison_operator | enclosing_delimiter | other_delimiter | arithmetic_operator | "..." | other_op assignment_operator: "+=" | "-=" | "*=" | "**=" | "/=" | "//=" | "%=" | "&=" | "|=" | "^=" | "<<=" | ">>=" | "@=" | ":=" bitwise_operator: "&" | "|" | "^" | "~" | "<<" | ">>" comparison_operator: "<=" | ">=" | "<" | ">" | "==" | "!=" enclosing_delimiter: "(" | ")" | "[" | "]" | "{" | "}" other_delimiter: "," | ":" | "!" | ";" | "=" | "->" arithmetic_operator: "+" | "-" | "**" | "*" | "//" | "/" | "%" other_op: "." | "@" نکته بهطور کلی، عملگرها برای ترکیب عبارتها به کار میروند، در حالی که جداکنندهها کاربردهای دیگری دارند. با این حال، تمایز روشن و رسمی میان این دو دسته وجود ندارد. برخی توکنها میتوانند بسته به کاربرد، بهعنوان عملگر یا جداکننده به کار روند. برای مثال، برای برخی توکنها، این تمایز نامشخص است. برای مثال، برخی افراد برخی از عملگرهای پایتون، مانند دنبالهای از سه نقطهی متوالی (
© حق نشر 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. |