<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](datamodel.xhtml "3. 數據模型") | - [上一頁](introduction.xhtml "1. 概述") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 語言參考](index.xhtml) ? - $('.inline-search').show(0); | # 2. 詞法分析 Python 程序由一個 *解析器* 讀取。輸入到解析器的是一個由 *詞法分析器* 所生成的 *形符* 流,本章將描述詞法分析器是如何將一個文件拆分為一個個形符的。 Python 會將讀取的程序文本轉為 Unicode 碼點;源文件的文本編碼可由編碼聲明指定,默認為 UTF-8,詳情見 [**PEP 3120**](https://www.python.org/dev/peps/pep-3120) \[https://www.python.org/dev/peps/pep-3120\]。如果源文件無法被解碼,將會引發 [`SyntaxError`](../library/exceptions.xhtml#SyntaxError "SyntaxError")。 ## 2.1. 行結構 一個 Python 程序可分為許多 *邏輯行*。 ### 2.1.1. 邏輯行 邏輯行的結束是以 NEWLINE 形符表示的。語句不能跨越邏輯行的邊界,除非其語法允許包含 NEWLINE (例如復合語句可由多行子語句組成)。一個邏輯行可由一個或多個 *物理行* 按照明確或隱含的 *行拼接* 規則構成。 ### 2.1.2. 物理行 物理行是以一個行終止序列結束的字符序列。在源文件和字符串中,可以使用任何標準平臺上的行終止序列 - Unix 所用的 ASCII 字符 LF (換行), Windows 所用的 ASCII 字符序列 CR LF (回車加換行), 或者舊 Macintosh 所用的 ASCII 字符 CR (回車)。所有這些形式均可使用,無論具體平臺。輸入的結束也會被作為最后一個物理行的隱含終止標志。 當嵌入 Python 時,源碼字符串傳入 Python API 應使用標準 C 的傳統換行符 (即 `\n`,表示 ASCII 字符 LF 作為行終止標志)。 ### 2.1.3. 注釋 A comment starts with a hash character (`#`) that is not part of a string literal, and ends at the end of the physical line. A comment signifies the end of the logical line unless the implicit line joining rules are invoked. Comments are ignored by the syntax. ### 2.1.4. 編碼聲明 如果一條注釋位于 Python 腳本的第一或第二行,并且匹配正則表達式 `coding[=:]\s*([-\w.]+)`,這條注釋會被作為編碼聲明來處理;上述表達式的第一組指定了源碼文件的編碼。編碼聲明必須獨占一行。如果它是在第二行,則第一行也必須是注釋。推薦的編碼聲明形式如下 ``` # -*- coding: <encoding-name> -*- ``` 這也是 GNU Emacs 認可的形式,以及 ``` # vim:fileencoding=<encoding-name> ``` 這是 Bram Moolenaar 的 VIM 認可的形式。 如果沒有編碼聲明,則默認編碼為 UTF-8。此外,如果文件的首字節為 UTF-8 字節順序標志 (`b'\xef\xbb\xbf'`),文件編碼也聲明為 UTF-8 (這是 Microsoft 的 **notepad** 等軟件支持的形式)。 編碼聲明指定的編碼名稱必須是 Python 所認可的編碼。所有詞法分析將使用此編碼,包括語義字符串、注釋和標識符。 ### 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. 空白行 一個只包含空格符,制表符,進紙符或者注釋的邏輯行會被忽略 (即不生成 NEWLINE 形符)。在交互模式輸入語句時,對空白行的處理可能會因讀取-求值-打印循環的具體實現方式而存在差異。在標準交互模式解釋器中,一個完全空白的邏輯行 (即連空格或注釋都沒有) 將會結束一條多行復合語句。 ### 2.1.8. 縮進 一個邏輯行開頭處的空白 (空格符和制表符) 被用來計算該行的縮進等級,以決定語句段落的組織結構。 制表符會被 (從左至右) 替換為一至八個空格,這樣縮進的空格總數為八的倍數 (這是為了與 Unix 所用的規則一致)。首個非空白字符之前的空格總數將確定該行的縮進層次。一個縮進不可使用反斜杠進行多行拼接;首個反斜杠之前的空格將確定縮進層次。 在一個源文件中如果混合使用制表符和空格符縮進,并使得確定縮進層次需要依賴于制表符對應的空格數量設置,則被視為不合規則;此情況將會引發 [`TabError`](../library/exceptions.xhtml#TabError "TabError")。 **跨平臺兼容性注釋:** 由于非 UNIX 平臺上文本編輯器本身的特性,在一個源文件中混合使用制表符和空格符是不明智的。另外也要注意不同平臺還可能會顯式地限制最大縮進層級。 行首有時可能會有一個進紙符;它在上述縮進層級計算中會被忽略。處于行首空格內其他位置的進紙符的效果未定義 (例如它可能導致空格計數重置為零)。 多個連續行各自的縮進層級將會被放入一個堆棧用來生成 INDENT 和 DEDENT 形符,具體說明如下。 在讀取文件的第一行之前,先向堆棧推入一個零值;它將不再被彈出。被推入棧的層級數值從底至頂持續增加。每個邏輯行開頭的行縮進層級將與棧頂行比較。如果相同,則不做處理。如果新行層級較高,則會被推入棧頂,并生成一個 INDENT 形符。如果新行層級較低,則 *應當* 是棧中的層級數值之一;棧中高于該層級的所有數值都將被彈出,每彈出一級數值生成一個 DEDENT 形符。在文件末尾,棧中剩余的每個大于零的數值生成一個 DEDENT 形符。 這是一個正確 (但令人迷惑) 的Python 代碼縮進示例: ``` 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 ``` (實際上,前三個錯誤會被解析器發現;只有最后一個錯誤是由詞法分析器發現的 --- `return r` 的縮進無法匹配彈出棧的縮進層級。) ### 2.1.9. 形符之間的空白 除非是在邏輯行的開頭或字符串內,空格符、制表符和進紙符等空白符都同樣可以用來分隔形符。如果兩個形符彼此相連會被解析為一個不同的形符,則需要使用空白來分隔 (例如 ab 是一個形符,而 a b 是兩個形符)。 ## 2.2. 其他形符 除了 NEWLINE, INDENT 和 DEDENT,還存在以下類別的形符: *標識符*, *關鍵字*, *字面值*, *運算符* 以及 *分隔符*。 空白字符 (之前討論過的行終止符除外) 不屬于形符,而是用來分隔形符。如果存在二義性,將從左至右讀取盡可能長的合法字符串組成一個形符。 ## 2.3. 標識符和關鍵字 標識符 (或者叫做 *名稱*) 由以下詞法定義進行描述。 Python 中的標識符語法是基于 Unicode 標準附件 UAX-31,并加入了下文所定義的細化與修改;更多細節還可參見 [**PEP 3131**](https://www.python.org/dev/peps/pep-3131) \[https://www.python.org/dev/peps/pep-3131\] 。 在 ASCII 范圍內 (U+0001..U+007F),可用于標識符的字符與 Python 2.x 一致: 大寫和小寫字母 `A` 至 `Z`,下劃線 `_` 以及數字 `0` 至 `9`,但不可以數字打頭。 Python 3.0 引入了 ASCII 范圍以外的額外字符 (見 [**PEP 3131**](https://www.python.org/dev/peps/pep-3131) \[https://www.python.org/dev/peps/pep-3131\])。這些字符的分類使用包含于 [`unicodedata`](../library/unicodedata.xhtml#module-unicodedata "unicodedata: Access the Unicode Database.") 模塊中的 Unicode 字符數據庫版本。 標識符的長度沒有限制。對大小寫敏感。 ``` identifier ::= xid_start xid_continue* id_start ::= <all characters in general categories Lu, Ll, Lt, Lm, Lo, Nl, the underscore, and characters with the Other_ID_Start property> id_continue ::= <all characters in id_start, plus characters in the categories Mn, Mc, Nd, Pc and others with the Other_ID_Continue property> xid_start ::= <all characters in id_start whose NFKC normalization is in "id_start xid_continue*"> xid_continue ::= <all characters in id_continue whose NFKC normalization is in "id_continue*"> ``` 上文所用 Unicode 類別碼的含義: - *Lu* - 大寫字母 - *Ll* - 小寫字母 - *Lt* - 詞首大寫字母 - *Lm* - 修飾字母 - *Lo* - 其他字母 - *Nl* - 字母數字 - *Mn* - 非空白標識 - *Mc* - 含空白標識 - *Nd* - 十進制數字 - *Pc* - 連接標點 - *Other\_ID\_Start* - 由 [PropList.txt](http://www.unicode.org/Public/11.0.0/ucd/PropList.txt) \[http://www.unicode.org/Public/11.0.0/ucd/PropList.txt\] 定義的顯式字符列表,用來支持向后兼容 - *Other\_ID\_Continue* - 同上 所有標識符在解析時會被轉換為規范形式 NFKC;標識符的比較都是基于 NFKC。 Unicode 4.1 中的所有可用標識符字符列表參見以下非規范 HTML 文件鏈接 <https://www.dcl.hpi.uni-potsdam.de/home/loewis/table-3131.html> ### 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. 保留的標識符類 某些標識符類 (除了關鍵字) 具有特殊的含義。這些標識符類的命名模式是以下劃線字符打頭和結尾: `_*`不會被 `from module import *` 導入。特殊標識符 `_` 在交互式解釋器中被用來存放最近一次求值結果;它保存在 [`builtins`](../library/builtins.xhtml#module-builtins "builtins: The module that provides the built-in namespace.") 模塊中。當不處于交互模式時,`_` 無特殊含義也沒有預定義。參見 [import 語句](simple_stmts.xhtml#import)。 注解 `_` 作為名稱常用于連接國際化文本;請參看 [`gettext`](../library/gettext.xhtml#module-gettext "gettext: Multilingual internationalization services.") 模塊文檔了解有關此約定的詳情。 `__*__`系統定義的名稱。這些名稱由解釋器及其實現 (包括標準庫) 所定義。現有系統定義名稱相關討論參見 [特殊方法名稱](datamodel.xhtml#specialnames) 等章節。未來的 Python 版本中還將定義更多此類名稱。*任何* 不遵循文檔指定方式使用 `__*__` 名稱的行為都可能導致無警告的出錯。 `__*`類的私有名稱。這種名稱在類定義中使用時,會以一種混合形式重寫以避免在基類及派生類的 "私有" 屬性之間出現名稱沖突。參見 [標識符(名稱)](expressions.xhtml#atom-identifiers)。 ## 2.4. 字面值 字面值用于表示一些內置類型的常量。 ### 2.4.1. 字符串和字節串字面值 字符串字面值由以下詞法定義進行描述: ``` stringliteral ::= [stringprefix](shortstring | longstring) stringprefix ::= "r" | "u" | "R" | "U" | "f" | "F" | "fr" | "Fr" | "fR" | "FR" | "rf" | "rF" | "Rf" | "RF" shortstring ::= "'" shortstringitem* "'" | '"' shortstringitem* '"' longstring ::= "'''" longstringitem* "'''" | '"""' longstringitem* '"""' shortstringitem ::= shortstringchar | stringescapeseq longstringitem ::= longstringchar | stringescapeseq shortstringchar ::= <any source character except "\" or newline or the quote> longstringchar ::= <any source character except "\"> stringescapeseq ::= "\" <any source character> ``` ``` bytesliteral ::= bytesprefix(shortbytes | longbytes) bytesprefix ::= "b" | "B" | "br" | "Br" | "bR" | "BR" | "rb" | "rB" | "Rb" | "RB" shortbytes ::= "'" shortbytesitem* "'" | '"' shortbytesitem* '"' longbytes ::= "'''" longbytesitem* "'''" | '"""' longbytesitem* '"""' shortbytesitem ::= shortbyteschar | bytesescapeseq longbytesitem ::= longbyteschar | bytesescapeseq shortbyteschar ::= <any ASCII character except "\" or newline or the quote> longbyteschar ::= <any ASCII character except "\"> bytesescapeseq ::= "\" <any ASCII character> ``` 這些條目中未提及的一個語法限制是 [`stringprefix`](#grammar-token-stringprefix) 或 [`bytesprefix`](#grammar-token-bytesprefix) 與字面值的剩余部分之間不允許有空白。源字符集是由編碼聲明定義的;如果源文件中沒有編碼聲明則默認為 UTF-8;參見 [編碼聲明](#encodings)。 自然語言描述: 兩種字面值都可以用成對單引號 (`'`) 或雙引號 (`"`) 來標示首尾。它們也可以用成對的連續三個單引號或雙引號來標示首尾 (這通常被稱為 *三引號字符串*)。反斜杠 (`\`) 字符被用來對特殊含義的字符進行轉義,例如換行,反斜杠本身或是引號等字符。 字節串字面值總是帶有前綴 `'b'` 或 `'B'`;它們生成 [`bytes`](../library/stdtypes.xhtml#bytes "bytes") 類型而非 [`str`](../library/stdtypes.xhtml#str "str") 類型的實例。它們只能包含 ASCII 字符;字節對應數值在128及以上必須以轉義形式來表示。 字符串和字節串字面值都可以帶有前綴 `'r'` 或 `'R'`;這種字符串被稱為 *原始字符串* 其中的反斜杠會被當作其本身的字面字符來處理。因此在原始字符串字面值中,`'\U'` 和 `'\u'` 轉義形式不會被特殊對待。由于 Python 2.x 的原始統一碼字面值的特性與 Python 3.x 不一致,`'ur'` 語法已不再被支持。 3\.3 新版功能: 新加入了表示原始字節串的 `'rb'` 前綴,與 `'br'` 的意義相同。 3\.3 新版功能: 對舊式統一碼字面值 (`u'value'`) 的支持被重新引入以簡化 Python 2.x 和 3.x 代碼庫的同步維護。詳情見 [**PEP 414**](https://www.python.org/dev/peps/pep-0414) \[https://www.python.org/dev/peps/pep-0414\]。 包含 `'f'` 或 `'F'` 前綴的字符串字面值稱為 *格式化字符串字面值*;參見 [格式化字符串字面值](#f-strings)。`'f'` 可與 `'r'` 連用,但不能與 `'b'` 或 `'u'` 連用,因此存在原始格式化字符串,但不存在格式化字節串字面值。 在三引號字面值中,允許存在未經轉義的換行和引號 (并原樣保留),除非是未經轉義的連續三引號,這標示著字面值的結束。 ("引號" 是用來標示字面值的字符,即 `'` 或 `"`。) 除非帶有 `'r'` 或 `'R'` 前綴,字符串和字節串字面值中的轉義序列會基于類似標準 C 中的轉義規則來解讀。可用的轉義序列如下: 轉義序列 意義 注釋 `\newline` 反斜杠加換行全被忽略 `\\` 反斜杠 (`\`) `\'` 單引號 (`'`) `\"` 雙引號 (`"`) `\a` ASCII 響鈴 (BEL) `\b` ASCII 退格 (BS) `\f` ASCII 進紙 (FF) `\n` ASCII 換行 (LF) `\r` ASCII 回車 (CR) `\t` ASCII 水平制表 (TAB) `\v` ASCII 垂直制表 (VT) `\ooo` 八進制數 *ooo* 碼位的字符 (1,3) `\xhh` 十六進制數 *hh* 碼位的字符 (2,3) 僅在字符串字面值中可用的轉義序列如下: 轉義序列 意義 注釋 `\N{name}` Unicode 數據庫中名稱為 *name* 的字符 (4) `\uxxxx` 16位十六進制數 *xxxx* 碼位的字符 (5) `\Uxxxxxxxx` 32位16進制數 *xxxxxxxx* 碼位的字符 (6) 注釋: 1. 與標準 C 一致,接受最多三個八進制數碼。 2. 與標準 C 不同,要求必須為兩個十六進制數碼。 3. 在字節串字面值中,十六進制數和八進制數轉義碼以相應數值代表每個字節。在字符串字面值中,這些轉義碼以相應數值代表每個 Unicode 字符。 4. 在 3.3 版更改: 加入了對別名 [1](#id13) 的支持。 5. 要求必須為四個十六進制數碼。 6. 此方式可用來表示任意 Unicode 字符。要求必須為八個十六進制數碼。 與標準 C 不同,所有無法識別的轉義序列將原樣保留在字符串中,也就是說,*反斜杠會在結果中保留*。(這種方式在調試時很有用: 如果輸錯了一個轉義序列,更容易在輸出結果中識別錯誤。) 另外要注意的一個關鍵點是:專用于字符串字面值中的轉義序列如果在字節串字面值中出現,會被歸類為無法識別的轉義序列。 > 在 3.6 版更改: 無法識別的轉義序列會引發 DeprecationWarning。從未來某個 Python 版本開始將會引發 SyntaxError。 即使在原始字面值中,引號也可以加上反斜杠轉義符,但反斜杠會保留在輸出結果中;例如 `r"\""` 是一個有效的字符串字面值,包含兩個字符: 一個反斜杠和一個雙引號;而 `r"\"` 不是一個有效的字符串字面值 (即便是原始字符串也不能以奇數個反斜杠結束)。特別地,*一個原始字面值不能以單個反斜杠結束* (因為此反斜杠會轉義其后的引號字符)。還要注意一個反斜杠加一個換行在字面值中會被解釋為兩個字符,而 *不是* 一個連續行。 ### 2.4.2. 字符串字面值拼接 多個相鄰的字符串或字節串字面值 (以空白符分隔),所用的引號可以彼此不同,其含義等同于全部拼接為一體。因此, `"hello" 'world'` 等同于 `"helloworld"`。此特性可以減少反斜杠的使用,以方便地將很長的字符串分成多個物理行,甚至每部分字符串還可分別加注釋,例如: ``` re.compile("[A-Za-z_]" # letter or underscore "[A-Za-z0-9_]*" # letter, digit or underscore ) ``` 注意此特性是在句法層面定義的,但是在編譯時實現。在運行時拼接字符串表達式必須使用 '+' 運算符。還要注意字面值拼接時每個部分可以使用不同的引號風格 (甚至混合使用原始字符串和三引號字符串),格式化字符串字面值也可與普通字符串字面值拼接。 ### 2.4.3. 格式化字符串字面值 3\.6 新版功能. *格式化字符串字面值* 或稱 *f-string* 是帶有 `'f'` 或 `'F'` 前綴的字符串字面值。這種字符串可包含替換字段,即以 `{}` 標示的表達式。而其他字符串字面值總是一個常量,格式化字符串字面值實際上是會在運行時被求值的表達式。 轉義序列會像在普通字符串字面值中一樣被解碼 (除非字面值還被標示為原始字符串)。解碼之后,字符串內容所用的語法如下: ``` f_string ::= (literal_char | "{{" | "}}" | replacement_field)* replacement_field ::= "{" f_expression ["!" conversion] [":" format_spec] "}" f_expression ::= (conditional_expression | "*" or_expr) ("," conditional_expression | "," "*" or_expr)* [","] | yield_expression conversion ::= "s" | "r" | "a" format_spec ::= (literal_char | NULL | replacement_field)* literal_char ::= <any code point except "{", "}" or NULL> ``` 字符串在花括號以外的部分按其字面值處理,除了雙重花括號 `'{{'` 或 `'}}'` 會被替換為相應的單個花括號。單個左花括號 `'{'` 標示一個替換字段,它以一個 Python 表達式打頭,表達式之后可能有一個以嘆號 `'!'` 標示的轉換字段。之后還可能帶有一個以冒號 `':'` 標示的格式說明符。替換字段以一個右花括號 `'}'` 作為結束。 格式化字符串字面值中的表達式會被當作正常的包含在圓括號中的 Python 表達式一樣處理,但有少數例外。空表達式不被允許,[`lambda`](expressions.xhtml#lambda) 表達式必須顯式地加上圓括號。替換表達式可以包含換行 (例如在三引號字符串中),但是不能包含注釋。每個表達式會在格式化字符串字面值所包含的位置按照從左至右的順序被求值。 如果指定了轉換符,表達式的求值結果會先轉換再格式化。轉換符 `'!s'` 即對結果調用 [`str()`](../library/stdtypes.xhtml#str "str"),`'!r'` 為調用 [`repr()`](../library/functions.xhtml#repr "repr"),而 `'!a'` 為調用 [`ascii()`](../library/functions.xhtml#ascii "ascii")。 在此之后結果會使用 [`format()`](../library/functions.xhtml#format "format") 協議進行格式化。格式說明符會被傳入表達式或轉換結果的 [`__format__()`](datamodel.xhtml#object.__format__ "object.__format__") 方法。如果省略格式說明符則會傳入一個空字符串。然后格式化結果會包含在整個字符串最終的值當中。 頂層的格式說明符可以包含有嵌套的替換字段。這些嵌套字段也可以包含有自己的轉換字段和 [格式說明符](../library/string.xhtml#formatspec),但不可再包含更深層嵌套的替換字段。這里的 [格式說明符微型語言](../library/string.xhtml#formatspec) 與字符串 .format() 方法所使用的相同。 格式化字符串字面值可以拼接,但是一個替換字段不能拆分到多個字面值。 一些格式化字符串字面值的示例: ``` >>> name = "Fred" >>> f"He said his name is {name!r}." "He said his name is 'Fred'." >>> f"He said his name is {repr(name)}." # repr() is equivalent to !r "He said his name is 'Fred'." >>> width = 10 >>> precision = 4 >>> value = decimal.Decimal("12.34567") >>> f"result: {value:{width}.{precision}}" # nested fields 'result: 12.35' >>> today = datetime(year=2017, month=1, day=27) >>> f"{today:%B %d, %Y}" # using date format specifier 'January 27, 2017' >>> number = 1024 >>> f"{number:#0x}" # using integer format specifier '0x400' ``` 與正常字符串字面值采用相同語法導致的一個結果就是替換字段中的字符不能與外部的格式化字符串字面值所用的引號相沖突: ``` f"abc {a["x"]} def" # error: outer string literal ended prematurely f"abc {a['x']} def" # workaround: use different quoting ``` 格式表達式中不允許有反斜杠,這會引發錯誤: ``` f"newline: {ord('\n')}" # raises SyntaxError ``` 想包含需要用反斜杠轉義的值,可以創建一個臨時變量。 ``` >>> newline = ord('\n') >>> f"newline: {newline}" 'newline: 10' ``` 格式化字符串字面值不可用作文檔字符串,即便其中沒有包含表達式。 ``` >>> def foo(): ... f"Not a docstring" ... >>> foo.__doc__ is None True ``` 另請參見 [**PEP 498**](https://www.python.org/dev/peps/pep-0498) \[https://www.python.org/dev/peps/pep-0498\] 了解加入格式化字符串字面值的提議,以及使用了相關的格式字符串機制的 [`str.format()`](../library/stdtypes.xhtml#str.format "str.format")。 ### 2.4.4. 數字字面值 數字字面值有三種類型: 整型數、浮點數和虛數。沒有專門的復數字面值 (復數可由一個實數加一個虛數合成)。 注意數字字面值并不包含正負號;`-1` 這樣的負數實際上是由單目運算符 '`-`' 和字面值 `1` 合成的。 ### 2.4.5. 整型數字面值 整型數字面值由以下詞法定義進行描述: ``` integer ::= decinteger | bininteger | octinteger | hexinteger decinteger ::= nonzerodigit (["_"] digit)* | "0"+ (["_"] "0")* bininteger ::= "0" ("b" | "B") (["_"] bindigit)+ octinteger ::= "0" ("o" | "O") (["_"] octdigit)+ hexinteger ::= "0" ("x" | "X") (["_"] hexdigit)+ nonzerodigit ::= "1"..."9" digit ::= "0"..."9" bindigit ::= "0" | "1" octdigit ::= "0"..."7" hexdigit ::= digit | "a"..."f" | "A"..."F" ``` 整型數字面值的長度沒有限制,能一直大到占滿可用內存。 在確定數字大小時字面值中的下劃線會被忽略。它們可用來將數碼分組以提高可讀性。一個下劃線可放在數碼之間,也可放在基數說明符例如 `0x` 之后。 注意非零的十進制數開頭不允許有額外的零。這是為了避免與 Python 在版本 3.0 之前所使用的 C 風格八進制字面值相混淆。 一些整型數字面值的示例如下: ``` 7 2147483647 0o177 0b100110111 3 79228162514264337593543950336 0o377 0xdeadbeef 100_000_000_000 0b_1110_0101 ``` 在 3.6 版更改: 允許在字面值中使用下劃線進行分組。 ### 2.4.6. 浮點數字面值 浮點數字面值由以下詞法定義進行描述: ``` floatnumber ::= pointfloat | exponentfloat pointfloat ::= [digitpart] fraction | digitpart "." exponentfloat ::= (digitpart | pointfloat) exponent digitpart ::= digit (["_"] digit)* fraction ::= "." digitpart exponent ::= ("e" | "E") ["+" | "-"] digitpart ``` 注意整型數部分和指數部分在解析時總是以 10 為基數。例如,`077e010` 是合法的,且表示的數值與 `77e10` 相同。浮點數字面值允許的范圍依賴于具體實現。對于整型數字面值,支持以下劃線進行分組。 一些浮點數字面值的示例如下: ``` 3.14 10. .001 1e100 3.14e-10 0e0 3.14_15_93 ``` 在 3.6 版更改: 允許在字面值中使用下劃線進行分組。 ### 2.4.7. 虛數字面值 虛數字面值由以下詞法定義進行描述: ``` imagnumber ::= (floatnumber | digitpart) ("j" | "J") ``` 一個虛數字面值將生成一個實部為 0.0 的復數。復數是以一對浮點數來表示的,它們的取值范圍相同。要創建一個實部不為零的復數,就加上一個浮點數,例如 `(3+4j)`。一些虛數字面值的示例如下: ``` 3.14j 10.j 10j .001j 1e100j 3.14e-10j 3.14_15_93j ``` ## 2.5. 運算符 以下形符屬于運算符: ``` + - * ** / // % @ << >> & | ^ ~ < > <= >= == != ``` ## 2.6. 分隔符 以下形符在語法中歸類為分隔符: ``` ( ) [ ] { } , : . ; @ = -> += -= *= /= //= %= @= &= |= ^= >>= <<= **= ``` 句點也可出現于浮點數和虛數字面值中。連續三個句點有表示一個省略符的特殊含義。以上列表的后半部分為增強賦值操作符,在詞法中作為分隔符,但也起到運算作用。 以下可打印 ASCII 字符作為其他形符的組成部分時具有特殊含義,或是對詞法分析器有重要意義: ``` ' " # \ ``` 以下可打印 ASCII 字符不在 Python 詞法中使用。如果出現于字符串字面值和注釋之外將無條件地引發錯誤: ``` $ ? ` ``` 腳注 [1](#id10)<http://www.unicode.org/Public/11.0.0/ucd/NameAliases.txt> ### 導航 - [索引](../genindex.xhtml "總目錄") - [模塊](../py-modindex.xhtml "Python 模塊索引") | - [下一頁](datamodel.xhtml "3. 數據模型") | - [上一頁](introduction.xhtml "1. 概述") | - ![](https://box.kancloud.cn/a721fc7ec672275e257bbbfde49a4d4e_16x16.png) - [Python](https://www.python.org/) ? - zh\_CN 3.7.3 [文檔](../index.xhtml) ? - [Python 語言參考](index.xhtml) ? - $('.inline-search').show(0); | ? [版權所有](../copyright.xhtml) 2001-2019, Python Software Foundation. Python 軟件基金會是一個非盈利組織。 [請捐助。](https://www.python.org/psf/donations/) 最后更新于 5月 21, 2019. [發現了問題](../bugs.xhtml)? 使用[Sphinx](http://sphinx.pocoo.org/)1.8.4 創建。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看