通讀了Python官網(wǎng)的語法說明文檔。原文來自:Python 語言參考(3.8.2版本)恨憎。在此蕊退,將原文的要點進行記錄與分享。
1 概述
2 詞法分析
Python 程序由一個解析器讀取憔恳。輸入到解析器的是一個由詞法分析器所生成的形符流瓤荔。Python 會將讀取的程序文本轉(zhuǎn)為 Unicode 碼點;源文件的文本編碼可由編碼聲明指定钥组,默認為 UTF-8输硝。
2.1 行結(jié)構(gòu)
-
邏輯行以
NEWLINE
形符表示。- 語句不能跨邏輯行程梦。
- 邏輯行可由多個物理行按規(guī)則拼接
- 物理行以換行字符終止点把,如LF橘荠,CR LF,CR等
2.2 其它形符
2.3 標識符和關鍵字
Python關鍵字
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
特殊的標識符
-
_*
:以下劃線字符_
開始的標識符不會被import語句from module import *
導入愉粤。 -
__*__
:以雙下劃線字符開始并結(jié)尾的標識符為系統(tǒng)定義的名稱砾医,特殊方法對于的名稱 -
__*
:以雙下劃線開始的標識符是類的私有名稱,會被類定義隱式的轉(zhuǎn)換衣厘。
2.4 字面值
字面值直接表示一些內(nèi)置類型的常量
- 字符串如蚜、字節(jié)串字面值
- 格式化字符串字面值
- 數(shù)字字面值:整數(shù)、浮點數(shù)影暴、虛數(shù)
格式化字符串字面值
以'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>
注:
-
! conversion
轉(zhuǎn)換符型宙,表達式f_expression
將先轉(zhuǎn)換在格式化:-
!s
:以str()
轉(zhuǎn)換 -
!r
:以repr()
轉(zhuǎn)換 -
!a
:以ascii()
轉(zhuǎn)換
-
2.5 運算符
2.6 分隔符
3 數(shù)據(jù)模型
3.1 對象撬呢、值與類型
每個對象有各自的編號、類型和值妆兑。編號:id()
函數(shù)返回代表編號的整數(shù)值魂拦,在CPython中即為內(nèi)存地址,編號是不可變的搁嗓。類型:type()
返回對象的類型芯勘,類型也是不可變的。值:有些對象的值是是否可變分為可變的(mutable)與不可變的(immutable)腺逛。對象的可變性是由類型決定的荷愕。
注:當不可變?nèi)萜靼勺儗ο蟮囊脮r,后者的數(shù)值改變也造成容器數(shù)值的改變棍矛。不過安疗,容器包含的內(nèi)容未變,所以依然稱該容器是不可變的够委。也就是說荐类,不可變并非是值不改變。
對象絕不會顯示被銷毀茁帽,當無法訪問時被垃圾回收掉冶。一些對象包含對外部資源的引用,當對象被垃圾回收時這些資源得到釋放脐雪。未明確的釋放外部資源,這些對象通常有close()
方法恢共,在程序中以try...finally
語句和with
語句提供的操作更便捷战秋。
3.2 標準類型層級
None
NotImplemented
邏輯值為真Ellipsis
邏輯值為真-
numbers.Number
- numbers.Integeral
- 整形(int)
- 布爾型(bool)
- numbers.Real(float)
- numbers.Complex(complex)
- numbers.Integeral
-
序列: 有限有序集,支持
len()
讨韭,切片a[i:j]
脂信,擴展切片a[i:j:k]
- 不可變序列:
- 字符串
str
- 元組
- 字節(jié)串
bytes
- 字符串
- 可變序列:
- 列表
- 字節(jié)數(shù)值
bytearray
- 擴展模塊
array
與collections
- 不可變序列:
-
集合類型:無序有限集癣蟋,支持迭代,支持
len()
- 集合
set()
- 凍結(jié)集合
frozenset()
- 集合
-
映射:任意索引類型的有限集合狰闪,支持下標
a[k]
用于賦值或del
語句疯搅,支持len()
- 字典
-
可調(diào)用類型
-
用戶定義函數(shù),特殊屬性:
-
__doc__
可寫 -
__name__
可寫 -
__qualname__
可寫埋泵,函數(shù)限定名稱幔欧,顯式從模塊開始的層級 -
__module__
可寫,函數(shù)所述模塊的名稱 -
__defaults__
可寫丽声,默認參數(shù)值構(gòu)成的元組 -
__code__
可寫礁蔗,變異后的函數(shù)體代碼 -
__globals__
只讀,函數(shù)所屬模塊的全局命名空間字典引用 -
__dict__
可寫雁社,命名空間支持的函數(shù)屬性 -
__closure__
只讀 -
__annotations__
可寫浴井,包含參數(shù)標注的自定 -
__kwdefaults__
可寫,僅包含關鍵字參數(shù)默認值的字典
-
-
實例方法霉撵,結(jié)合類磺浙、類實例與可調(diào)對象。
- 特殊只讀屬性:
__self__
為類實例徒坡,__func__
為函數(shù)對象撕氧,__doc__
為方法文檔(即__func__.__doc__
)__name__
即__func__.__name__
,__module__
方法所在模塊名稱崭参。 - 注:實例方法的
__self__
參數(shù)指代實例對象呵曹; 類方法的__self__
參數(shù)指代類型。 - 注:從函數(shù)對象到實例方法的轉(zhuǎn)換在每一次實例獲取方法時發(fā)生何暮,一種優(yōu)化方法時將實例方法屬性在本地保存奄喂,每次使用時調(diào)用本地對象。
- 特殊只讀屬性:
生成器函數(shù):使用
yield
語句的函數(shù)/方法海洼。函數(shù)被調(diào)用時返回迭代器對象跨新。協(xié)程函數(shù): 使用
async def
定義的函數(shù)/方法。異步生成器函數(shù):使用
async def
定義的含有yeild
語句的函數(shù)/方法。-
內(nèi)置函數(shù):對于C函數(shù)的外部封裝。
- 特殊只讀屬性:
__doc__
威创,__name__
庭猩,__self__
為None
,__module__
筏餐,
- 特殊只讀屬性:
內(nèi)置方法:相比內(nèi)置函數(shù),多了一個傳入C函數(shù)的對象作為隱式的額外參數(shù)
__self__
。類:
__new__()
龙优,__init__()
類實例:定義
__call__()
使類實例可調(diào)
-
-
模塊
- 具有字典對象實現(xiàn)的命名空間,也是模塊中函數(shù)
__globals__
所引用的字典 - 可寫屬性:
__name__
事秀,__doc__
彤断,__annotations__
野舶,__file__
- 只讀屬性
__dict__
- 具有字典對象實現(xiàn)的命名空間,也是模塊中函數(shù)
-
自定義類
- 每個類都通過字典實現(xiàn)獨立的命名空間,類屬性在字典中查找
- 特別屬性:
__name__
宰衙,__module__
類所在模塊平道,__dict__
,__bases__
包含基類的元組供炼,__doc__
一屋,__annotations__
-
類實例
- 通過調(diào)用類對象創(chuàng)建,每個類實例通過字典實現(xiàn)獨立的命名空間劲蜻。
- 若為找到類屬性陆淀,而對象對應的類具有
__getattr__()
方法則會調(diào)用該方法。 - 屬性賦值與刪除會更新實例字典先嬉,但不更新類字典轧苫。若類具有
__setattr__()
與__delattr()__
則調(diào)用方法而不直接更新實例字典 - 特殊屬性:
__dict__
,__class__
I/0對象
-
內(nèi)部類型(定義可能在未來解釋器版本中變化)
- 代碼對象
- 編譯為字節(jié)的可執(zhí)行Python代碼疫蔓,或稱
bytecode
- vs函數(shù)對象含懊,函數(shù)對象具有全局對象的引用,代碼對象不包含上下文
- 編譯為字節(jié)的可執(zhí)行Python代碼疫蔓,或稱
- 幀對象:表示執(zhí)行幀
- 回溯對象:表示異常的棧跟蹤記錄衅胀。
- 切片對象:表示
__getitem__()
方法得到的切片岔乔, - 靜態(tài)方法對象:
- 為對任意其它對象的封裝,靜態(tài)方法對象自身是不可調(diào)用的滚躯。
- 從類或類實例中獲得的靜態(tài)方法對象時雏门,獲得的是被封裝的對象。
- 可由
staticmethod()
構(gòu)造器創(chuàng)建
- 類方法對象:
- 對其他對象的封裝掸掏。
- 可由
classmethod()
構(gòu)造器創(chuàng)建茁影。
- 代碼對象
3.3 特殊方法
3.3.1 基本定制Basic customization
-
object.__new__(cls[,...])
- 創(chuàng)建cls類的新實例,
__new__()
總是一個靜態(tài)方法丧凤。返回值應為新對象(通常為cls)實例 - 典型的實現(xiàn)總有
super().__new__(cls[, ...])
調(diào)用募闲。 - 如果
__new__()
發(fā)返回了一個cls的實例或者子類,則新實例將調(diào)用__init__(self[, ...])
進行初始化 - 若
__new__()
沒有返回cls的實例愿待,則不會有__init__()
調(diào)用 - 用以對int浩螺,str或tuple等子類的自定義;用以創(chuàng)建唯一對象singleton
- 創(chuàng)建cls類的新實例,
-
object.__init__(self[, ...])
- 其參數(shù)與傳遞給構(gòu)造表達器的參數(shù)相同仍侥。
- 應確币觯基類正確初始化
super().__init__([args...])
- 返回值為
None
-
object.__del__(self)
- 在實例被銷毀時調(diào)用
- 派生類需確保基類的
__del__()
正確被調(diào)用 - 注:
del x
將x
的引用計數(shù)減一农渊;當引用計數(shù)為零時厨幻,才可能執(zhí)行x.__del__()
-
object.__repr__(self)
:- 若可能,使用輸出的字符串能重建相同取值的對象;若不可能則返回形如
<...一些有用信息...>
的字符串
- 若可能,使用輸出的字符串能重建相同取值的對象;若不可能則返回形如
-
object.__str__(self)
:一種非正式或格式良好的字符串 -
object.__bytes__(self)
:返回bytes
對象 -
object.__format__(self, format_spec)
:對象的格式化字符串顯示 - 比較方法
object.__lt__(self, other)
object.__le__(self, other)
object.__eq__(self, other)
object.__ne__(self, other)
object.__gt__(self, other)
object.__ge__(self, other)
- 注:當比較操作的左操作數(shù)未實現(xiàn)相關函數(shù)况脆,而右操作數(shù)有實現(xiàn),則調(diào)用右操作數(shù)的方法批糟;當右操作數(shù)是左操作數(shù)的子類時格了,優(yōu)先有操作數(shù)的方法
-
object.__hash__(self)
- 用于對哈希集
set
,frozenset
徽鼎,dict
執(zhí)行哈希函數(shù)hash()
盛末。建議將參與比較的對象組件打包為元組整體進行hash計算 - 與
__eq__()
- 用戶定義類默認有
__eq__()
與__hash__()
方法,確保當x==y
時意味著x is y
且hash(x)==hash(y)
- 若僅定義
__eq__()
時否淤,則將__hash__()
隱式設置為None
悄但;若須保留父類的__hash__()
實現(xiàn),須在類中明確__hash__ = <ParentClass>.__hash__
- 若未定義
__eq__()
則不應定義__hash__()
石抡;若定義__eq__()
同時定義了可變對象也不應定義__hash__()
檐嚣,否則對象可能至于錯誤的哈希桶中。 - 若未定義
__eq__()
時也不需要默認的__hash__()
啰扛,則應在類中明確__hash__ = None
- 用戶定義類默認有
- 注: 在str與bytes對象的hash值由隨機數(shù)加鹽嚎京,在單獨的python進程中是一致的。
- 用于對哈希集
-
object.__bool__(self)
- 若類未定義
__bool__()
也未定義__len__()
則實例邏輯值為真
- 若類未定義
3.3.2 屬性訪問
-
object.__getattr__(self, name)
- 當默認屬性訪問失敗時調(diào)用:
- 可能由于
__getattribute__()
時 隐解,name
非實例屬性 - 或者對于
name
特性調(diào)用__get__()
時
- 可能由于
- 當默認屬性訪問失敗時調(diào)用:
-
object.__getattribute__(self, name)
- 類實例屬性訪問調(diào)用鞍帝。為避免方法的無限遞歸,總是調(diào)用相同名稱的基類方法實現(xiàn)
-
object.__setattr__(self, name, value)
- 當實例屬性被賦值時調(diào)用煞茫。正常實現(xiàn)是調(diào)用相同名稱的基類方法
-
object.__delattr__(self, name)
- 與
__setattr__()
效果范圍類似帕涌,僅在del obj.name
時生效
- 與
-
object.__dir__(self)
- 對象調(diào)用
dir()
時調(diào)用,返回值為一個序列续徽,
- 對象調(diào)用
3.3.2.1 自定義模塊屬性訪問
特殊名稱__getattr_
與__dir__
可用來自定義對模塊屬性的訪問
自定義模塊的行為蚓曼,可以將模塊對象的__class__
屬性設置為types.ModuleType
的子類:
sys.modules[__name__].__class__ = ***Module
3.3.2.2 實現(xiàn)描述器
當含有如下__get__
,__set__
炸宵,__delete__
辟躏,__set_name__
特殊方法的類(稱為描述器descriptor)的實例是其他所有類的成員時,這些特殊方法才有效
-
object.__get__(self,instance,owner=None)
- 實現(xiàn)所有者類屬性/類實例屬性的方法
-
object.__set__(self,instance,value)
- 設置instance指向的屬性值為新值
- 使用
__set__()
或__delete__()
將描述器變?yōu)?strong>數(shù)據(jù)描述器
object.__delete__(self,instance)
-
object.__set_name__(self,owner,name)
- 在所有者創(chuàng)建是被調(diào)用土全,描述器賦值給name
3.3.2.3 調(diào)用描述器
描述器就是具有綁定行為的對象屬性捎琐,屬性方位被描述器的方法重載。
若沒有定義__get__()
裹匙,屬性訪問將返回描述器自身
若定義了__set__()
/__delele__()
則為數(shù)據(jù)描述器瑞凑,否則為非數(shù)據(jù)描述器;通常數(shù)據(jù)描述器定義__get__()
與__set__()
而非數(shù)據(jù)描述器僅定義__get__()
方法概页。數(shù)據(jù)描述器總是重載字典中實例定義籽御。而非數(shù)據(jù)描述器可以被實例重載。
Python方法(包括staticmethod()
和 classmethod()
) 都是作為非描述器來實現(xiàn)的。因此實例可以重定義并重載方法技掏。這允許單個實例獲得與相同類的其他實例不一樣的行為铃将。
property()
函數(shù)是作為數(shù)據(jù)描述器來實現(xiàn)的。因此實例不能重載特性屬性的行為哑梳。
3.3.2.4 __slots__
-
object.__slots__
-
slots用以顯示聲明數(shù)據(jù)成員劲阎,禁止創(chuàng)建
__dict__
以及__weakref__
除非顯示聲明或在父類中可用. - 繼承一個未定義slots的類時,實例的
__dict__
與__weakref__
總是可訪問的鸠真。
-
slots用以顯示聲明數(shù)據(jù)成員劲阎,禁止創(chuàng)建
3.3.3 類創(chuàng)建
classmethod object.__init_subclass__(cls)
- 當一個類繼承自其它類時悯仙,基類的init_subclass會被調(diào)用。
- 基類控制子類的特性吠卷,相較于元類更加靈活
- 隱式的
classmethod
元類
默認情況锡垄,類是由type()
構(gòu)建type(name,bases,dict)
。在類創(chuàng)建定義中傳入metaclass
關鍵字參數(shù)祭隔,控制類創(chuàng)建使用的元類货岭。
- 解析MRO條目
- 確定適當?shù)脑?
- 若沒有基類且沒有顯示指定元類,使用
type()
- 若給出顯示的元類且不是
type()
的實例序攘,則直接用作元類 - 若給出一個
type()
實例作為元類茴她,或者定義了基類,則使用最近派生的元類
- 若沒有基類且沒有顯示指定元類,使用
- 準備類命名空間
- 若元類有
__prepare__
屬性程奠,則以namespace = metaclass.__prepare__(name,bases,**kwds)
調(diào)用丈牢,namespace
傳遞給元類的__new__
- 元類的
__prepare__
須顯式聲明為classmethod -
__prepare__
返回的命名空間返回給__new__
,但最終類對象創(chuàng)建時瞄沙,命名空間拷貝至新的只讀代理dict中己沛,作為類對象的字典。
- 若元類有
- 執(zhí)行類主體
- 創(chuàng)建類對象
- 執(zhí)行元類
__new__
與__init__
- 執(zhí)行元類
3.3.4 實例與子類檢查
用以重載isinstance()
與issubclass()
內(nèi)置函數(shù)行為距境,這樣可以通過元類實現(xiàn)抽象基類ABC功能:
-class.__instancecheck__(self, instance)
class.__subclasscheck__(self, instance)
3.3.5 模擬泛型類型
classmethod object.__class_getitem_(cls, key)
申尼。按照key參數(shù)指定的類型返回一個表示泛型類的專門化對象
3.3.6 模擬可調(diào)多項
object.__call__(self[, args...])
3.3.7 模擬容器類型
可以定義下列方法來實現(xiàn)容器對象。 容器通常屬于序列(如列表或元組)或映射(如字典)垫桂,但也存在其他形式的容器师幕。 前幾個方法集被用于模擬序列或是模擬映射;兩者的不同之處在于序列允許的鍵應為整數(shù) k 且 0 <= k < N 其中 N 是序列或定義指定區(qū)間的項的切片對象的長度诬滩。 此外還建議讓映射提供 keys(), values(), items(), get(), clear(), setdefault(), pop(), popitem(), copy() 以及 update() 等方法霹粥,它們的行為應與 Python 標準字典對象的相應方法類似。 此外 collections.abc 模塊提供了一個 MutableMapping 抽象基類以便根據(jù)由 getitem(), setitem(), delitem(), 和 keys() 組成的基本集來創(chuàng)建所需的方法疼鸟。 可變序列還應像 Python 標準列表對象那樣提供 append(), count(), index(), extend(), insert(), pop(), remove(), reverse() 和 sort() 等方法后控。 最后,序列類型還應通過定義下文描述的 add(), radd(), iadd(), mul(), rmul() 和 imul() 等方法來實現(xiàn)加法(指拼接)和乘法(指重復)空镜;它們不應定義其他數(shù)值運算符浩淘。 此外還建議映射和序列都實現(xiàn) contains() 方法以允許高效地使用 in 運算符捌朴;對于映射,in 應該搜索映射的鍵张抄;對于序列砂蔽,則應搜索其中的值。 另外還建議映射和序列都實現(xiàn) iter() 方法以允許高效地迭代容器中的條目欣鳖;對于映射察皇,iter() 應當?shù)鷮ο蟮逆I;對于序列泽台,則應當?shù)渲械闹?/p>
object.__len__(self)
-
object.__length_hint__(self)
(可選) object.__getitem__(self,key)
object.__setitem__(self,key,value)
object.__delitem__(self,key)
-
object.__missing__(self,key)
(在getitem找不到鍵時調(diào)用) object.__iter__(self)
object.__reversed__(self)
object.__contains__(self,item)
3.3.8 模擬數(shù)字類型
運算 | 基本 | 反射 | 擴展 | |
---|---|---|---|---|
+ |
__add__ |
__radd__ |
__iadd__ |
|
- |
__sub__ |
|||
* |
__mul__ |
|||
@ |
__matmul__ |
|||
/ |
__truediv__ |
|||
// |
__floordiv__ |
|||
% |
__mod__ |
|||
divmod() |
__divmod__ |
None | ||
pow() /**
|
__pow__ |
|||
<< |
__lshift__ |
|||
>> |
__rshift__ |
|||
& |
__and__ |
|||
^ |
__xor__ |
|||
` | ` | __or__ |
-
__neg__
,__pos__
,__abs__
(abs()
),__invert__
(~
) -
__complex__
,__int__
,__float__
__index__
-
__round__
,__trunc__
,__floor__
,__ceil__
3.3.9 with語句上下文管理器
上下文管理器是指執(zhí)行with
語句時需要建立的實時上下文。上下文管理器負責處理進入矾缓、退出實時上下文時需要執(zhí)行的代碼塊怀酷。通常使用with
語句,也可以直接調(diào)用
-
object.__enter__(self)
進入上下文嗜闻。 -
object.__exit__(self,exc_type, exc_value, traceback)
退出上下文蜕依,三個參數(shù)描述了導致上下文退出時的異常;若上下文正常退出琉雳,三個參數(shù)均為None
3.4 協(xié)程Coroutines
3.4.1 可等待對象Awaitable Objects
awaitable
對象實現(xiàn)__await__()
方法样眠,在await
語句中使用。從async def
函數(shù)返回的Coroutine
對象也屬于可等待對象翠肘。
object.__await__(self)
必須返回一個iterator
3.4.2 協(xié)程對象Coroutine Objects
Coroutine
對象屬于可等待對象檐束。 協(xié)程的執(zhí)行可通過調(diào)用__await__()
并迭代其結(jié)果來進行控制。當協(xié)程結(jié)束執(zhí)行并返回時束倍,迭代器會引發(fā)StopIteration
被丧,該異常的value屬性將指向返回值。
協(xié)程也具有下面列出的方法绪妹,它們類似于生成器的對應方法甥桂。但是,與生成器不同邮旷,協(xié)程并不直接支持迭代黄选。
-
coroutine.send(value)
開始或恢復協(xié)程的執(zhí)行. -
coroutine.throw(type[,value[,traceback]])
在協(xié)程內(nèi)引發(fā)指定的異常。 -
coroutine.close()
此方法會使得協(xié)程清理自身并退出
3.4.3 異步迭代器Asynchronous Iterators
異步迭代器可以在__anext__
方法中調(diào)用異步代碼婶肩。
-
object.__aiter__(self)
返回一個異步迭代器對象 -
object.__anext__(self)
返回一個可等待對象的下一個結(jié)果值办陷,或StopAsyncIteration
3.4.4 異步上下文管理器
異步上下文管理器可在async with
語句中使用,需要定義__aenter__
和__aexit__
方法狡孔。
4 執(zhí)行模型
4.1 程序結(jié)構(gòu)
代碼塊被作為一個單元來執(zhí)行:模塊懂诗、函數(shù)體、類定義苗膝。內(nèi)置函數(shù)eval()
與exec()
的字符串參數(shù)也是代碼塊殃恒。
代碼塊在執(zhí)行幀中被執(zhí)行植旧,一個幀包含某些管理信息并決定代碼塊執(zhí)行后將如何繼續(xù)執(zhí)行。
4.2 命名與綁定
4.2.1 名稱綁定
-
名稱用于指代對象离唐,通過綁定操作引入:函數(shù)的形參病附,
import
語句,類與函數(shù)定義名稱亥鬓,被表達式賦值的目標完沪,for
循環(huán)開始,with
與except
語句的as
后嵌戈。 -
import語句
from ... import *
將模塊定義的所有導入模塊綁定覆积,這種形式綁定僅可用于模塊層級。 -
del
語句的目標是解除目標綁定熟呛。 - 每條賦值語句或?qū)胝Z句均發(fā)生在類/函數(shù)內(nèi)部定義的代碼塊中宽档,或者在模塊層級(最高層級的代碼塊)
- 名稱綁定在代碼塊中,則為代碼塊的局部變量庵朝,除非聲明
nonlocal
或global
吗冤。若名稱綁定在模塊層級,則為全局變量九府。(模塊代碼塊的變量即為局部變量又為全局變量椎瘟。)如果變量在一個代碼塊中使用但是沒有定義,則為自由變量
4.2.2 名稱的解析
- 作用域定義了代碼塊中名稱的可見性侄旬。如果代碼塊定義局部變量肺蔚,其作用域包括該代碼塊。內(nèi)部代碼塊會屏蔽外部代碼塊的相同名稱綁定勾怒。
- 環(huán)境指對一個代碼塊可見的所有作用域的集合婆排。當一個名稱在代碼塊中使用時,由它最近的作用域解析笔链。
- 一個代碼塊內(nèi)任何位置的名稱綁定導致整個代碼塊對該名稱的引用均在此代碼塊內(nèi)段只。
-
global
語句在代碼塊中表示,所有對該語句指定名稱的使用都是最高層級命名空間對該名稱的綁定引用鉴扫。最高層級命名空間就是全局命名空間赞枕,包含:模塊命名空間、內(nèi)置命名空間坪创。global
語句必須位于所有指定名稱使用之前 -
nonlocal
語句使名稱指向之前的最近包含函數(shù)作用域中的綁定變量 - 模塊的作用域在模塊第一次被導入時自動創(chuàng)建屿衅,一個腳本的主模塊總是被命名為
__main__
- 類定義代碼塊以及
exec()
與eval()
參數(shù)的名稱解析是特殊情況蜕琴。未綁定的局部變量會在全局命名空間查找厚柳。涨颜?類代碼塊定義的名稱的作用域限制在類代碼塊中,不會擴展到方法(包括推導式與生成器表達式)中依沮。
4.2.3 內(nèi)置命名空間與受限的執(zhí)行
與代碼塊執(zhí)行相關的內(nèi)置命名空間是通過全局命名空間中的builtins來找到涯贞。在__main__
模塊中枪狂,builtins就是內(nèi)置模塊builtins
;在其它模塊中builtins是builtins
模塊字典的別名
4.2.4 與動態(tài)特性的交互
eval()
與exec()
函數(shù)沒有對完整環(huán)境的訪問權(quán)限以解析名稱宋渔。名稱可以在調(diào)用者的局部或者全局命名空間被解析州疾。自由變量的解析不是在最近包含的命名空間,而是在全局命名空間中皇拣。
4.3 異常
pass
5 導入系統(tǒng)
import
語句是發(fā)起導入機制的常用方式严蓖。importlib.import_module()
以及__import__()
等函數(shù)也可以用來發(fā)起調(diào)用導入機制。
import
語句完成兩個操作:搜索指定名稱的模塊氧急,然后將搜索結(jié)果綁定至當前作用域名稱颗胡。搜索操作為__import__()
函數(shù)調(diào)用,函數(shù)的返回值用于執(zhí)行綁定操作吩坝。
對__import__()
的直接調(diào)用將僅執(zhí)行模塊搜索以及在找到時的模塊創(chuàng)建操作杭措,但可能產(chǎn)生一些副作用,例如導入父包以及更新緩存钾恢。
當一個模塊首次被導入時,Python會搜索該模塊鸳址,如果未找到就創(chuàng)建一個module對象并初始化它瘩蚪。
5.1 importlib
importlib
模塊用來與導入系統(tǒng)進行交互。例如importlib.import_module()
提供了比內(nèi)置import()更推薦的調(diào)用導入機制接口
5.2 包
包相當于將模塊組織在一起的目錄稿黍,任何具有path屬性的模塊都看作是包疹瘦。
- 常規(guī)包:含有
__init__.py
文件的目錄。當常規(guī)包被導入時巡球,該__init__.py
文件被隱式執(zhí)行言沐。 - 命名空間包:由多個部分組成,每個部分為父包增加子包酣栈,沒有
__init__.py
文件险胰。
5.3 搜索
Python根據(jù)導入模塊的完整限定名稱開始所示。一個指向子模塊的帶點號路徑將從父包開始依次導入矿筝。
- 模塊緩存:
-
sys.modules
緩存之前所有導入的模塊起便。 -
sys.modules
鍵值對應的值為需要導入的模塊。刪除鍵值會是模塊緩存的條目無效窖维。
-
- 查找器:
- 查找器的任務是確定是否能使用其所知的策略找到該名稱的模塊榆综。
- Python包含多個默認的查找器:第一個負責定位內(nèi)置模塊;第二個負責定位凍結(jié)模塊铸史;第三個負載在import path(通常來自
sys.path
鼻疮,子包還包含上級包__path__
)中搜索模塊。 - 查找器返回一個模塊的模塊規(guī)格說明(module spec)琳轿,以供后續(xù)加載過程使用
- 導入鉤子(Import hooks):
- 實現(xiàn)導入機制的可擴展性判沟,包含兩種鉤子:元鉤子(meta hooks)與導入路徑鉤子(import path hooks)
-
元鉤子導入開始時被調(diào)用(除
sys.modules
緩存查找外耿芹,其它導入過程尚未發(fā)生)。能夠重載查找器特性水评。元鉤子注冊通過向sys.meta_path
添加查找器對象完成猩系。(元鉤子包含三個默認查找器BuiltinImporter,F(xiàn)rozenImporter中燥,PathFinder實現(xiàn)上述Python默認查找器功能) -
導入路徑鉤子在遇到所關聯(lián)的路徑條目時被調(diào)用寇甸。通過向
sys.path_hooks
添加可調(diào)用對象完成。(通常被PathFinder在查找時使用)
- 元路徑查找器:
- 在
sys.modules
找不到模塊時疗涉,Python接著搜索sys.meta_path
元路徑查找器拿霉。元路徑查找器必須實現(xiàn)find_spec()
方法。 - 若
sys.meta_path
處理過程到達列表末尾仍未返回說明咱扣,則放棄導入過程绽淘。
- 在
5.4 加載
在加載器執(zhí)行模塊代碼前,先將模塊增加至sys.modules
中闹伪。模塊加載委托加載器執(zhí)行exec_module()
或load_modules()
進行沪铭。
-
子模塊:當導入
spam.foo
之后,在spam
中將有一個子模塊foo
的屬性偏瓤。 - 模塊規(guī)格說明:作為模塊對象的
__spec__
屬性對外公開(參見importlib) - 模塊屬性:
- 導入機制在加載期間根據(jù)模塊規(guī)格說明填充以下屬性杀怠,在加載器執(zhí)行模塊前完成
-
__name__
完整限定名稱,在導入系統(tǒng)中唯一標識模塊 -
__loader__
加載器 -
__package__
可以與name取值相同厅克,對于子模塊應設為父包名 __spec__
-
__path__
模塊為包是必須設置赔退,必須有字符串組成的可迭代對象,于子包導入期間使用证舟。 -
__file__
可選屬性硕旗,文件位置 -
__cached__
可選屬性,編譯緩存文件位置
- 模塊的repr
- 緩存字節(jié)碼:使用
--check-hash-based-pycs
開啟基于哈希的.pyc文件有效性檢查女责。
5.5 基于路徑的查找器
元路徑查找器之一是基于路徑的查找器(path based finder)PathFinder
漆枚,用以搜索import path
±鹬瘢基于路徑的查找器只是遍歷路徑浪读,具體的查找使用路徑條目查找器(path entry finder)進行,并產(chǎn)生緩存查找器對象sys.path_importer_cache
以避免重復的費時查找辛藻。
如果路徑條目不在緩存中碘橘,基于路徑的查找器將在每個條目上迭代sys.path_hooks的可調(diào)用對象,若找到模塊吱肌,則返回路徑條目查找器對象痘拆。
5.6 替換標準導入系統(tǒng)
5.7 包相對導入
導入時使用前綴點號,一個前綴點號表示相對當前包氮墨,額外每一個點號代表向上一級
- 絕對導入可以使用
import ...
或from ... import ...
語法 - 相對導入只能使用
from ... import ...
語法形式
5.8 關于__main__
__main__
模塊在解釋器啟動時直接初始化纺蛆。__main__.__spec__
屬性為None
吐葵。當在此導入時,__spec__
為模塊規(guī)格說明
6 表達式
6.1 算術轉(zhuǎn)換
6.2 原子Atom
原子指表達式的最基本構(gòu)成元素桥氏。
atom ::= identifier | literal | enclosure
enclosure ::= parenth_form | list_display | dict_display | set_display
| generator_expression | yield_atom
-
identifier
標識符 -
literal
字面值 -
enclosure
附件
附件包括:
-
parenth_form
帶括號的形式温峭,bystarred_expression
-
comprehesion
推導式,byassignment_expression
-
list_display
列表的顯示字支,bystarred_list
與comprehension
-
set_display
集合的顯示凤藏,bystarred_list
與comprehension
-
dict_display
字典的顯示,byexpression
` -
generator_expression
生成器表達式堕伪,byexpression
` -
yield_atom
yield表達式揖庄,byexpression_list
與expression
6.2.1 標識符identifier
6.2.2 字面值literal
literal ::= stringliteral | bytesliteral
| integer | floatnumber | imagnumber
6.2.3 帶括號的形式parenth_form
parenth_form ::= "(" [starred_expression] ")"
6.2.4 推導式comprehension
comprehension ::= assignment_expression/*賦值表達式*/ comp_for
comp_for ::= ["async"] "for" target_list "in" or_test [comp_iter]
comp_iter ::= comp_for | comp_if
comp_if ::= "if" expression_nocond [comp_iter]
Python中,為了構(gòu)建列表欠雌、集合與字典蹄梢,采用兩種方式:
- 第一種的顯示的列出容器內(nèi)容,
- 第二種是通過一組循環(huán)和篩選指令計算出來富俄,稱為推導式
comp_iter
是推導式結(jié)構(gòu)的隱式作用域禁炒。最左側(cè)/最外層的for語句在作用域中求職后,作為參數(shù)傳入推導式內(nèi)部的隱式作用域霍比。
6.2.5 列表顯示list_display
list_display ::= "[" [starred_list | comprehension] "]"
# 方括號齐苛、括號內(nèi)可為空
6.2.6 集合顯示set_display
set_display ::= "{" (starred_list | comprehension) "}"
# 花括號、括號內(nèi)不為空桂塞,否則為字典
6.2.7 字典顯示dict_display
dict_display ::= "{" [key_datum_list | dict_comprehension] "}"
key_datum_list ::= key_datum ("," key_datum)* [","]
key_datum ::= expression ":" expression | "**" or_expr
dict_comprehension ::= expression ":" expression comp_for
注:雙星號**表示字典拆包,操作數(shù)必須是一個mapping
馍驯。
6.2.8 生成器表達式
generator_expression ::= "(" expression comp_for ")"
以圓括號括起來的推導式阁危,將產(chǎn)生一個新的生成器對象。
6.2.9 yield表達式
yield_atom ::= "(" yield_expression ")"
yield_expression ::= "yield" [expression_list | "from" expression]
注:當yield表達式是賦值語句右側(cè)的唯一表達式時汰瘫,括號可以省略
生成器-迭代器Generator-iterator方法:
-
generator.__next__()
- 返回
yield
表達式的expression_list
值
- 返回
-
generator.send(value)
-
value參數(shù)為
yield
表達式的結(jié)果 - 返回生成器的下一個值
-
value參數(shù)為
-
generator.throw(type[,value[,traceback]])
- 在生成器暫停位置印發(fā)
type
類型異常
- 在生成器暫停位置印發(fā)
-
generator.close()
- 在稱長期函數(shù)暫停位置引發(fā)
GeneratorExit
- 在稱長期函數(shù)暫停位置引發(fā)
6.3 原型Primary
primary ::= atom | attributeref | subscription | slicing | call
原型表示編程語言中最緊密的綁定操作狂打。
-
atributeref
屬性引用 -
subscription
下標抽取 -
slicing
切片 -
call
調(diào)用
6.3.1 屬性引用
attributeref ::= primary "." identifier
注:此處原型應支持屬性引用,否則將產(chǎn)生AttributeError
6.3.2下標抽取
subscription ::= primary "[" expression_list "]"
抽取是在序列或映射中進行混弥。
注:如果原型為映射趴乡,表達式列表必須求值為一個以該映射的鍵為值的對象,值/元組蝗拿;如果原型為序列晾捏,表達式列表必須求值為一個整數(shù)或一個切片
6.3.3 切片
slicing ::= primary "[" slice_list "]"
slice_list ::= slice_item ("," slice_item)* [","]
slice_item ::= expression | proper_slice
proper_slice ::= [lower_bound] ":" [upper_bound] [ ":" [stride] ]
lower_bound ::= expression
upper_bound ::= expression
stride ::= expression
注: 如果切片列表包含至少一個逗號,則鍵將是一個包含切片項轉(zhuǎn)換的元組哀托;否則的話惦辛,鍵將是單個切片項的轉(zhuǎn)換
6.3.4 調(diào)用
call ::= primary "(" [argument_list [","] | comprehension] ")"
argument_list ::= positional_arguments ["," starred_and_keywords]
["," keywords_arguments]
| starred_and_keywords ["," keywords_arguments]
| keywords_arguments
positional_arguments ::= positional_item ("," positional_item)*
positional_item ::= assignment_expression | "*" expression
starred_and_keywords ::= ("*" expression | keyword_item)
("," "*" expression | "," keyword_item)*
keywords_arguments ::= (keyword_item | "**" expression)
("," keyword_item | "," "**" expression)*
keyword_item ::= identifier "=" expression
-
poisitional_arguments
位置參數(shù):賦值表達式
or*表達式
-
starred_and_keywords
:混用*表達式
(位置參數(shù))or關鍵字項
(關鍵字參數(shù)) -
keyword_item
關鍵字參數(shù):關鍵字項
or**表達式
若存在關鍵字參數(shù),首先為正式參數(shù)創(chuàng)建一個未填充的空列表仓手,將所有位置參數(shù)從前至后依次填入胖齐;然后對于每個關鍵字參數(shù)玻淑,使用標識符填充相應參數(shù),若空位已被填充則TypeError
呀伙;填充完后的空位使用函數(shù)的默認值填充补履,若沒有默認值則TypeError
6.4 await表達式
只能在coroutine function
內(nèi)部使用
await_expr ::= "await" primary
6.5 冪運算符
power ::= (await_expr | primary) ["**" u_expr]
注:冪運算符的綁定比在其左側(cè)的一元運算符更緊密;但綁定緊密程度不及在其右側(cè)的一元運算符
6.6 一元算術和位運算
u_expr ::= power | "-" u_expr | "+" u_expr | "~" u_expr
6.7 二元算術運算
m_expr ::= u_expr | m_expr "*" u_expr | m_expr "@" m_expr |
m_expr "http://" u_expr | m_expr "/" u_expr |
m_expr "%" u_expr
a_expr ::= m_expr | a_expr "+" m_expr | a_expr "-" m_expr
6.8 移位運算
shift_expr ::= a_expr | shift_expr ("<<" | ">>") a_expr
6.9 二元位運算
and_expr ::= shift_expr | and_expr "&" shift_expr
xor_expr ::= and_expr | xor_expr "^" and_expr
or_expr ::= xor_expr | or_expr "|" xor_expr
6.10 比較運算
comparison ::= or_expr (comp_operator or_expr)*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="
| "is" ["not"] | ["not"] "in"
6.11 布爾運算
not_test ::= comparison | "not" not_test
and_test ::= not_test | and_test "and" not_test
or_test ::= and_test | or_test "or" and_test
6.12 賦值表達式
assignment_expression ::= [identifier ":="] expression
注:賦值表達式可用于定義:1)列表剿另、集合與字典中的推導式箫锤;2)調(diào)用中的位置參數(shù);3)作為列表顯示驰弄、集合顯示的表達式列表麻汰。
6.13 條件表達式、表達式戚篙、lambda表達式
conditional_expression ::= or_test ["if" or_test "else" expression]
注:表達式x if C else y
首先對C求值五鲫,結(jié)果為真再對x求值,否則對y求值
expression ::= conditional_expression | lambda_expr
lambda_expr ::= "lambda" [parameter_list] ":" expression
expression_nocond ::= or_test | lambda_expr_nocond
lambda_expr_nocond ::= "lambda" [parameter_list] ":" expression_nocond
6.14 lambda表達式
表達式lambda parameters: expression
會產(chǎn)生一個函數(shù)對象岔擂,該未命名對象類似如下定義
def <lambda>(parameters):
return expression
6.15 表達式列表
expression_list ::= expression ("," expression)* [","]
starred_item ::= assignment_expression | "*" or_expr
starred_expression ::= expression | (starred_item ",")* [starred_item]
starred_list ::= starred_item ("," starred_item)* [","]
注:starred_list
相比較于expression_list
增加了星號表達式* ...
與賦值表達式... := ...
位喂,用于列表顯示、集合顯示表達
6.16 求值順序
6.17 運算符優(yōu)先級
7 簡單語句
簡單語句由一個單獨的邏輯行構(gòu)成乱灵。 多條簡單語句可以存在于同一行內(nèi)并以分號分隔
simple_stmt ::= expression_stmt
| assert_stmt
| assignment_stmt
| augmented_assignment_stmt
| annotated_assignment_stmt
| pass_stmt
| del_stmt
| return_stmt
| yield_stmt
| raise_stmt
| break_stmt
| continue_stmt
| import_stmt
| future_stmt
| global_stmt
| nonlocal_stmt
7.1 表達式語句
expression_stmt ::= starred_expression
7.2 賦值語句
assignment_stmt ::= (target_list "=")+ (starred_expression | yield_expression)
target_list ::= target ("," target)* [","]
target ::= identifier
| "(" [target_list] ")"
| "[" [target_list] "]"
| attributeref
| subscription
| slicing
| "*" target
7.3 assert語句
簡單的assert expression1, expression2
相當于
if __debug__:
if not expression: raise AssertionError(expression2)
7.4 pass語句
7.5 del語句
7.6 return語句
7.7 yeild語句
7.8 raise語句
raise_stmt ::= "raise" [expression ["from" expression]]
如果不帶表達式塑崖,raise
將重新引起當前作用域內(nèi)的最后一個激活的異常,若沒有異常則引發(fā)RuntimeError
痛倚。
raise
的首個表達式表異常對象规婆,必須是BaseException
子類或?qū)嵗?code>from子句用于異常串聯(lián),若在異常處理器或finally
引發(fā)蝉稳,串聯(lián)機制隱式發(fā)揮作用抒蚜,可通過在from
子句中指定None
來顯示抑制
try:
print(1 / 0)
except:
raise RuntimeError("Something bad happened") from None
7.9 break語句
7.10 continue 語句
7.11 import語句
import_stmt ::= "import" module ["as" identifier] ("," module ["as" identifier])*
| "from" relative_module "import" identifier ["as" identifier]
("," identifier ["as" identifier])*
| "from" relative_module "import" "(" identifier ["as" identifier]
("," identifier ["as" identifier])* [","] ")"
| "from" module "import" "*"
module ::= (identifier ".")* identifier
relative_module ::= "."* module | "."+
7.12 global語句
7.13 nolocal語句
8 復合語句
復合語句是包含其它語句(語句組)的語句;它們會以某種方式影響或控制所包含其它語句的執(zhí)行耘戚。
-
if
嗡髓,while
和for
語句用來實現(xiàn)傳統(tǒng)的控制流程構(gòu)造。 -
try
語句為一組語句指定異常處理和/和清理代碼收津。 -
with
語句允許在一個代碼塊周圍執(zhí)行初始化和終結(jié)化代碼饿这。 - 函數(shù)和類定義在語法上也屬于復合語句。
一條復合語句由一個或多個子句組成撞秋。
- 子句頭以一個作為唯一標識的關鍵字開始并以一個冒號結(jié)束长捧。
- 子句體是由一個子句控制的一組語句。 子句體可以是在子句頭的冒號之后與其同處一行的一條或由分號分隔的多條簡單語句吻贿,或者也可以是在其之后縮進的一行或多行語句唆姐。但是,只有在縮進形式下才可以嵌套復合語句。
#復合語句
compound_stmt ::= if_stmt
| while_stmt
| for_stmt
| try_stmt
| with_stmt
| funcdef
| classdef
| async_with_stmt
| async_for_stmt
| async_funcdef
#子句體
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
statement ::= stmt_list NEWLINE | compound_stmt
stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
8.1 if語句
8.2 while語句
while_stmt ::= "while" assignment_expression ":" suite
["else" ":" suite]
8.3 for語句
for_stmt ::= "for" target_list "in" expression_list ":" suite
["else" ":" suite]
注: 系統(tǒng)將為expression_list
的結(jié)果創(chuàng)建一個迭代器奉芦,然后將為迭代器所提供的每一項執(zhí)行一次子句體赵抢,具體次序與迭代器的返回順序一致
注:當所有項被耗盡時,else
子句的子句體如果存在將會被執(zhí)行声功,并終止循環(huán)烦却。
- for循環(huán)子句頭會對目標列表的變量進行賦值,將覆蓋變量的賦值(包括循環(huán)體內(nèi)的賦值)
- 目標列表的名稱在循環(huán)結(jié)束時不會被刪除先巴,但是如果迭代序列為空,名稱將不會被賦值伸蚯。
8.4 try語句
try_stmt ::= try1_stmt | try2_stmt
try1_stmt ::= "try" ":" suite
("except" [expression ["as" identifier]] ":" suite)+
["else" ":" suite]
["finally" ":" suite]
try2_stmt ::= "try" ":" suite
"finally" ":" suite
- 如果在對
except
子句頭中的表達式求值時引發(fā)了異常摩渺,則原來對異常處理器的搜索會被取消,啟動對新的異常的搜索 - 當找到一個匹配的
except
子句時剂邮,該異常將被賦值給該except
子句在as
關鍵字之后指定的目標摇幻,并在except
子句體執(zhí)行。 - 當使用
as
將目標賦值為一個異常時挥萌,它將在except
子句結(jié)束時被清除绰姻。 -
else
語句的異常不會由之前的except
子句處理 -
finally
指定異常清理程序,如果在try
引瀑,except
和else
子句中發(fā)生未處理的異常狂芋,先暫時保存,至finally
子句末尾重新引發(fā)憨栽;若finally
子句產(chǎn)生新的異常帜矾,被保存的異常被設置為新異常的上下文。
8.5 with語句
with_stmt ::= "with" with_item ("," with_item)* ":" suite
with_item ::= expression ["as" target]
注:with
語句會保證如果__enter__()
方法返回時未發(fā)生錯誤屑柔,則__exit__()
將總是被調(diào)用黍特。
8.6 函數(shù)定義
funcdef ::= [decorators] "def" funcname "(" [parameter_list] ")"
["->" expression] ":" suite
decorators ::= decorator+
decorator ::= "@" dotted_name ["(" [argument_list [","]] ")"] NEWLINE
dotted_name ::= identifier ("." identifier)*
parameter_list ::= defparameter ("," defparameter)* "," "/" ["," [parameter_list_no_posonly]]
| parameter_list_no_posonly
parameter_list_no_posonly ::= defparameter ("," defparameter)* ["," [parameter_list_starargs]]
| parameter_list_starargs
parameter_list_starargs ::= "*" [parameter] ("," defparameter)* ["," ["**" parameter [","]]]
| "**" parameter [","]
parameter ::= identifier [":" expression]
defparameter ::= parameter ["=" expression]
funcname ::= identifier
參數(shù)說明:
-
decorators
裝飾器組:由多個裝飾器組成 -
decorator
裝飾器- 以點號(屬性)名稱標識裝飾器
- 可以調(diào)用形式輸入
argument_list
,即包括位置參數(shù)锯蛀、關鍵字參數(shù)等 - 以
NEWLINE
結(jié)尾
-
parameter_list
形參列表:- 多個函數(shù)形參組成的列表
- 由
*參數(shù)
,**參數(shù)
構(gòu)成的參數(shù)列表次慢。在*
或*identifier
后的函數(shù)形參僅接受關鍵字參數(shù)旁涤。 - 參數(shù)列表中的斜杠字符
/
參數(shù)用于分隔位置形參與關鍵字形參,位于/
前的形參不能接受關鍵字參數(shù)迫像。
-
defparameter
形參:- 以形參 = 表達式設置默認形參值
特別注意:
- 函數(shù)定義是一條可執(zhí)行語句劈愚。將函數(shù)名稱綁定至一個函數(shù)對象
- 函數(shù)定義不會執(zhí)行函數(shù)體,只有當函數(shù)調(diào)用時才會執(zhí)行闻妓。
- 裝飾器以函數(shù)對象作為輸入菌羽,求值結(jié)果綁定至函數(shù)名稱。
- 如果一個形參具有默認值由缆,則后續(xù)所有在
*
之前的形參也必須具有默認值注祖。 - 默認形參在執(zhí)行函數(shù)定義時按照從左至右的順序被求值猾蒂,注意默認形參為可變對象的情況時,通常與預期不一致是晨。
- 形參可以帶有標注
: expression
肚菠;函數(shù)可以帶有返回標注-> expression
。標注的存在不改變函數(shù)語義罩缴。 標注值可以作為函數(shù)對象的__annotations__
屬性中以對應形參名稱為鍵的字典值被訪問蚊逢。
8.7 類定義
classdef ::= [decorators] "class" classname [inheritance] ":" suite
inheritance ::= "(" [argument_list] ")"
classname ::= identifier
8.8 協(xié)程
async_funcdef ::= [decorators] "async" "def" funcname "(" [parameter_list] ")"
["->" expression] ":" suite
async_for_stmt ::= "async" for_stmt
async_with_stmt ::= "async" with_stmt
- 協(xié)程函數(shù):可以在多個位置上掛起與恢復執(zhí)行。
await
箫章、async for
與async with
只能在協(xié)程函數(shù)體內(nèi)部使用烙荷。 - async for語句
- async with語句
9 最高層級組件
9.1 完整的Python程序
Python程序會在最小初始化環(huán)境中被執(zhí)行:所有內(nèi)置模塊和標準模塊均可用但均處于未初始化狀態(tài);僅有sys
檬寂,builtins
终抽,__main__
初始化;__main__
模塊提供局部焰薄、全局命名空間拿诸。
一個完整程序可通過三種形式被傳遞給解釋器:
- 使用 -c 字符串 命令行選項,
- 使用一個文件作為第一個命令行參數(shù)塞茅,
- 使用標準輸入亩码。
如果文件或標準輸入是一個 tty 設置,解釋器會進入交互模式野瘦;否則的話描沟,它會將文件當作一個完整程序來執(zhí)行。
10 完整語法
原文來自:Python官網(wǎng)的Python 語言參考(3.8.2版本)鞭光。
若侵權(quán)請聯(lián)系刪除