Python官方語法學習

通讀了Python官網(wǎng)的語法說明文檔。原文來自:Python 語言參考(3.8.2版本)恨憎。在此蕊退,將原文的要點進行記錄與分享。


1 概述


2 詞法分析

Python 程序由一個解析器讀取憔恳。輸入到解析器的是一個由詞法分析器所生成的形符流瓤荔。Python 會將讀取的程序文本轉(zhuǎn)為 Unicode 碼點;源文件的文本編碼可由編碼聲明指定钥组,默認為 UTF-8输硝。

2.1 行結(jié)構(gòu)

  1. 邏輯行NEWLINE形符表示。
    • 語句不能跨邏輯行程梦。
    • 邏輯行可由多個物理行按規(guī)則拼接
  2. 物理行以換行字符終止点把,如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

特殊的標識符

  1. _*:以下劃線字符_開始的標識符不會被import語句from module import *導入愉粤。
  2. __*__:以雙下劃線字符開始并結(jié)尾的標識符為系統(tǒng)定義的名稱砾医,特殊方法對于的名稱
  3. __*:以雙下劃線開始的標識符是類的私有名稱,會被類定義隱式的轉(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>

注:

  1. ! 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 標準類型層級

  1. None

  2. NotImplemented
    邏輯值為真

  3. Ellipsis
    邏輯值為真

  4. numbers.Number

    • numbers.Integeral
      • 整形(int)
      • 布爾型(bool)
    • numbers.Real(float)
    • numbers.Complex(complex)
  5. 序列: 有限有序集,支持len()讨韭,切片a[i:j]脂信,擴展切片a[i:j:k]

    • 不可變序列:
      • 字符串str
      • 元組
      • 字節(jié)串bytes
    • 可變序列:
      • 列表
      • 字節(jié)數(shù)值bytearray
      • 擴展模塊arraycollections
  6. 集合類型:無序有限集癣蟋,支持迭代,支持len()

    • 集合set()
    • 凍結(jié)集合frozenset()
  7. 映射:任意索引類型的有限集合狰闪,支持下標a[k]用于賦值或del語句疯搅,支持len()

    • 字典
  8. 可調(diào)用類型

    • 用戶定義函數(shù),特殊屬性:

      1. __doc__ 可寫
      2. __name__ 可寫
      3. __qualname__ 可寫埋泵,函數(shù)限定名稱幔欧,顯式從模塊開始的層級
      4. __module__ 可寫,函數(shù)所述模塊的名稱
      5. __defaults__ 可寫丽声,默認參數(shù)值構(gòu)成的元組
      6. __code__ 可寫礁蔗,變異后的函數(shù)體代碼
      7. __globals__ 只讀,函數(shù)所屬模塊的全局命名空間字典引用
      8. __dict__ 可寫雁社,命名空間支持的函數(shù)屬性
      9. __closure__ 只讀
      10. __annotations__ 可寫浴井,包含參數(shù)標注的自定
      11. __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)

  9. 模塊

    • 具有字典對象實現(xiàn)的命名空間,也是模塊中函數(shù)__globals__所引用的字典
    • 可寫屬性:__name__事秀,__doc__彤断,__annotations__野舶,__file__
    • 只讀屬性__dict__
  10. 自定義類

    • 每個類都通過字典實現(xiàn)獨立的命名空間,類屬性在字典中查找
    • 特別屬性:__name__宰衙,__module__類所在模塊平道,__dict____bases__包含基類的元組供炼,__doc__一屋,__annotations__
  11. 類實例

    • 通過調(diào)用類對象創(chuàng)建,每個類實例通過字典實現(xiàn)獨立的命名空間劲蜻。
    • 若為找到類屬性陆淀,而對象對應的類具有__getattr__()方法則會調(diào)用該方法。
    • 屬性賦值與刪除會更新實例字典先嬉,但不更新類字典轧苫。若類具有__setattr__()__delattr()__則調(diào)用方法而不直接更新實例字典
    • 特殊屬性:__dict____class__
  12. I/0對象

  13. 內(nèi)部類型(定義可能在未來解釋器版本中變化)

    • 代碼對象
      • 編譯為字節(jié)的可執(zhí)行Python代碼疫蔓,或稱bytecode
      • vs函數(shù)對象含懊,函數(shù)對象具有全局對象的引用,代碼對象不包含上下文
    • 幀對象:表示執(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

  1. 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
  2. object.__init__(self[, ...])
    • 其參數(shù)與傳遞給構(gòu)造表達器的參數(shù)相同仍侥。
    • 應確币觯基類正確初始化super().__init__([args...])
    • 返回值為None
  3. object.__del__(self)
    • 在實例被銷毀時調(diào)用
    • 派生類需確保基類的__del__()正確被調(diào)用
    • 注:del xx的引用計數(shù)減一农渊;當引用計數(shù)為零時厨幻,才可能執(zhí)行x.__del__()
  4. object.__repr__(self)
    • 若可能,使用輸出的字符串能重建相同取值的對象;若不可能則返回形如<...一些有用信息...>的字符串
  5. object.__str__(self):一種非正式或格式良好的字符串
  6. object.__bytes__(self):返回bytes對象
  7. object.__format__(self, format_spec):對象的格式化字符串顯示
  8. 比較方法
    • 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ù)的方法
  9. object.__hash__(self)
    • 用于對哈希集setfrozenset徽鼎,dict執(zhí)行哈希函數(shù)hash()盛末。建議將參與比較的對象組件打包為元組整體進行hash計算
    • __eq__()
      • 用戶定義類默認有__eq__()__hash__()方法,確保當x==y時意味著x is yhash(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進程中是一致的。
  10. object.__bool__(self)
    • 若類未定義__bool__()也未定義__len__()則實例邏輯值為真

3.3.2 屬性訪問

  1. object.__getattr__(self, name)
    • 當默認屬性訪問失敗時調(diào)用:
      • 可能由于__getattribute__()時 隐解,name非實例屬性
      • 或者對于name特性調(diào)用__get__()
  2. object.__getattribute__(self, name)
    • 類實例屬性訪問調(diào)用鞍帝。為避免方法的無限遞歸,總是調(diào)用相同名稱的基類方法實現(xiàn)
  3. object.__setattr__(self, name, value)
    • 當實例屬性被賦值時調(diào)用煞茫。正常實現(xiàn)是調(diào)用相同名稱的基類方法
  4. object.__delattr__(self, name)
    • __setattr__()效果范圍類似帕涌,僅在del obj.name時生效
  5. object.__dir__(self)
    • 對象調(diào)用dir()時調(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)的實例是其他所有類的成員時,這些特殊方法才有效

  1. object.__get__(self,instance,owner=None)
    • 實現(xiàn)所有者類屬性/類實例屬性的方法
  2. object.__set__(self,instance,value)
    • 設置instance指向的屬性值為新值
    • 使用__set__()__delete__()將描述器變?yōu)?strong>數(shù)據(jù)描述器
  3. object.__delete__(self,instance)
  4. 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__

  1. object.__slots__
    • slots用以顯示聲明數(shù)據(jù)成員劲阎,禁止創(chuàng)建__dict__以及__weakref__除非顯示聲明或在父類中可用.
    • 繼承一個未定義slots的類時,實例的__dict____weakref__總是可訪問的鸠真。

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)建使用的元類货岭。

  1. 解析MRO條目
  2. 確定適當?shù)脑?
    • 若沒有基類且沒有顯示指定元類,使用type()
    • 若給出顯示的元類且不是type()的實例序攘,則直接用作元類
    • 若給出一個type()實例作為元類茴她,或者定義了基類,則使用最近派生的元類
  3. 準備類命名空間
    • 若元類有__prepare__屬性程奠,則以namespace = metaclass.__prepare__(name,bases,**kwds)調(diào)用丈牢,namespace傳遞給元類的__new__
    • 元類的__prepare__須顯式聲明為classmethod
    • __prepare__返回的命名空間返回給__new__,但最終類對象創(chuàng)建時瞄沙,命名空間拷貝至新的只讀代理dict中己沛,作為類對象的字典。
  4. 執(zhí)行類主體
  5. 創(chuàng)建類對象
    • 執(zhí)行元類__new____init__

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>

  1. object.__len__(self)
  2. object.__length_hint__(self)(可選)
  3. object.__getitem__(self,key)
  4. object.__setitem__(self,key,value)
  5. object.__delitem__(self,key)
  6. object.__missing__(self,key)(在getitem找不到鍵時調(diào)用)
  7. object.__iter__(self)
  8. object.__reversed__(self)
  9. 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é)程并不直接支持迭代黄选。

  1. coroutine.send(value)開始或恢復協(xié)程的執(zhí)行.
  2. coroutine.throw(type[,value[,traceback]])在協(xié)程內(nèi)引發(fā)指定的異常。
  3. coroutine.close()此方法會使得協(xié)程清理自身并退出

3.4.3 異步迭代器Asynchronous Iterators

異步迭代器可以在__anext__方法中調(diào)用異步代碼婶肩。

  1. object.__aiter__(self)返回一個異步迭代器對象
  2. 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 名稱綁定

  1. 名稱用于指代對象离唐,通過綁定操作引入:函數(shù)的形參病附,import語句,類與函數(shù)定義名稱亥鬓,被表達式賦值的目標完沪,for循環(huán)開始,withexcept語句的as后嵌戈。
  2. import語句from ... import *將模塊定義的所有導入模塊綁定覆积,這種形式綁定僅可用于模塊層級。
  3. del語句的目標是解除目標綁定熟呛。
  4. 每條賦值語句或?qū)胝Z句均發(fā)生在類/函數(shù)內(nèi)部定義的代碼塊中宽档,或者在模塊層級(最高層級的代碼塊)
  5. 名稱綁定在代碼塊中,則為代碼塊的局部變量庵朝,除非聲明nonlocalglobal吗冤。若名稱綁定在模塊層級,則為全局變量九府。(模塊代碼塊的變量即為局部變量又為全局變量椎瘟。)如果變量在一個代碼塊中使用但是沒有定義,則為自由變量

4.2.2 名稱的解析

  1. 作用域定義了代碼塊中名稱的可見性侄旬。如果代碼塊定義局部變量肺蔚,其作用域包括該代碼塊。內(nèi)部代碼塊會屏蔽外部代碼塊的相同名稱綁定勾怒。
  2. 環(huán)境指對一個代碼塊可見的所有作用域的集合婆排。當一個名稱在代碼塊中使用時,由它最近的作用域解析笔链。
  3. 一個代碼塊內(nèi)任何位置的名稱綁定導致整個代碼塊對該名稱的引用均在此代碼塊內(nèi)段只。
  4. global語句在代碼塊中表示,所有對該語句指定名稱的使用都是最高層級命名空間對該名稱的綁定引用鉴扫。最高層級命名空間就是全局命名空間赞枕,包含:模塊命名空間、內(nèi)置命名空間坪创。global語句必須位于所有指定名稱使用之前
  5. nonlocal語句使名稱指向之前的最近包含函數(shù)作用域中的綁定變量
  6. 模塊的作用域在模塊第一次被導入時自動創(chuàng)建屿衅,一個腳本的主模塊總是被命名為__main__
  7. 類定義代碼塊以及exec()eval()參數(shù)的名稱解析是特殊情況蜕琴。未綁定的局部變量會在全局命名空間查找厚柳。涨颜?類代碼塊定義的名稱的作用域限制在類代碼塊中,不會擴展到方法(包括推導式與生成器表達式)中依沮。

4.2.3 內(nèi)置命名空間與受限的執(zhí)行

與代碼塊執(zhí)行相關的內(nèi)置命名空間是通過全局命名空間中的builtins來找到涯贞。在__main__模塊中枪狂,builtins就是內(nèi)置模塊builtins;在其它模塊中builtinsbuiltins模塊字典的別名

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ù)導入模塊的完整限定名稱開始所示。一個指向子模塊的帶點號路徑將從父包開始依次導入矿筝。

  1. 模塊緩存:
    • sys.modules緩存之前所有導入的模塊起便。
    • sys.modules鍵值對應的值為需要導入的模塊。刪除鍵值會是模塊緩存的條目無效窖维。
  2. 查找器:
    • 查找器的任務是確定是否能使用其所知的策略找到該名稱的模塊榆综。
    • Python包含多個默認的查找器:第一個負責定位內(nèi)置模塊;第二個負責定位凍結(jié)模塊铸史;第三個負載在import path(通常來自sys.path鼻疮,子包還包含上級包__path__)中搜索模塊。
    • 查找器返回一個模塊的模塊規(guī)格說明(module spec)琳轿,以供后續(xù)加載過程使用
  3. 導入鉤子(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在查找時使用)
  4. 元路徑查找器:
    • sys.modules找不到模塊時疗涉,Python接著搜索sys.meta_path元路徑查找器拿霉。元路徑查找器必須實現(xiàn)find_spec()方法。
    • sys.meta_path處理過程到達列表末尾仍未返回說明咱扣,則放棄導入過程绽淘。

5.4 加載

在加載器執(zhí)行模塊代碼前,先將模塊增加至sys.modules中闹伪。模塊加載委托加載器執(zhí)行exec_module()load_modules()進行沪铭。

  1. 子模塊:當導入spam.foo之后,在spam中將有一個子模塊foo的屬性偏瓤。
  2. 模塊規(guī)格說明:作為模塊對象的__spec__屬性對外公開(參見importlib
  3. 模塊屬性:
    • 導入機制在加載期間根據(jù)模塊規(guī)格說明填充以下屬性杀怠,在加載器執(zhí)行模塊前完成
    • __name__完整限定名稱,在導入系統(tǒng)中唯一標識模塊
    • __loader__加載器
    • __package__可以與name取值相同厅克,對于子模塊應設為父包名
    • __spec__
    • __path__模塊為包是必須設置赔退,必須有字符串組成的可迭代對象,于子包導入期間使用证舟。
    • __file__可選屬性硕旗,文件位置
    • __cached__可選屬性,編譯緩存文件位置
  4. 模塊的repr
  5. 緩存字節(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
  1. identifier標識符
  2. literal字面值
  3. enclosure附件

附件包括:

  1. parenth_form帶括號的形式温峭,by starred_expression
  2. comprehesion推導式,by assignment_expression
  3. list_display列表的顯示字支,by starred_listcomprehension
  4. set_display集合的顯示凤藏,by starred_listcomprehension
  5. dict_display字典的顯示,by expression`
  6. generator_expression生成器表達式堕伪,by expression`
  7. yield_atomyield表達式揖庄,byexpression_listexpression

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é)果
    • 返回生成器的下一個值
  • generator.throw(type[,value[,traceback]])
    • 在生成器暫停位置印發(fā)type類型異常
  • generator.close()
    • 在稱長期函數(shù)暫停位置引發(fā)GeneratorExit

6.3 原型Primary

primary ::=  atom | attributeref | subscription | slicing | call

原型表示編程語言中最緊密的綁定操作狂打。

  1. atributeref屬性引用
  2. subscription下標抽取
  3. slicing切片
  4. 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嗡髓,whilefor語句用來實現(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)烦却。

  1. for循環(huán)子句頭會對目標列表的變量進行賦值,將覆蓋變量的賦值(包括循環(huán)體內(nèi)的賦值)
  2. 目標列表的名稱在循環(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引瀑,exceptelse子句中發(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ù)說明:

  1. decorators裝飾器組:由多個裝飾器組成
  2. decorator裝飾器
    • 以點號(屬性)名稱標識裝飾器
    • 可以調(diào)用形式輸入argument_list,即包括位置參數(shù)锯蛀、關鍵字參數(shù)等
    • NEWLINE結(jié)尾
  3. parameter_list形參列表:
    • 多個函數(shù)形參組成的列表
    • *參數(shù)**參數(shù) 構(gòu)成的參數(shù)列表次慢。在**identifier后的函數(shù)形參僅接受關鍵字參數(shù)旁涤。
    • 參數(shù)列表中的斜杠字符/參數(shù)用于分隔位置形參與關鍵字形參,位于/前的形參不能接受關鍵字參數(shù)迫像。
  4. defparameter形參:
    • 形參 = 表達式設置默認形參值

特別注意:

  1. 函數(shù)定義是一條可執(zhí)行語句劈愚。將函數(shù)名稱綁定至一個函數(shù)對象
  2. 函數(shù)定義不會執(zhí)行函數(shù)體,只有當函數(shù)調(diào)用時才會執(zhí)行闻妓。
  3. 裝飾器以函數(shù)對象作為輸入菌羽,求值結(jié)果綁定至函數(shù)名稱。
  4. 如果一個形參具有默認值由缆,則后續(xù)所有在*之前的形參也必須具有默認值注祖。
  5. 默認形參在執(zhí)行函數(shù)定義時按照從左至右的順序被求值猾蒂,注意默認形參為可變對象的情況時,通常與預期不一致是晨。
  6. 形參可以帶有標注: 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
  1. 協(xié)程函數(shù):可以在多個位置上掛起與恢復執(zhí)行。await箫章、async forasync with只能在協(xié)程函數(shù)體內(nèi)部使用烙荷。
  2. async for語句
  3. async with語句

9 最高層級組件

9.1 完整的Python程序

Python程序會在最小初始化環(huán)境中被執(zhí)行:所有內(nèi)置模塊和標準模塊均可用但均處于未初始化狀態(tài);僅有sys檬寂,builtins终抽,__main__初始化;__main__模塊提供局部焰薄、全局命名空間拿诸。

一個完整程序可通過三種形式被傳遞給解釋器:

  1. 使用 -c 字符串 命令行選項,
  2. 使用一個文件作為第一個命令行參數(shù)塞茅,
  3. 使用標準輸入亩码。

如果文件或標準輸入是一個 tty 設置,解釋器會進入交互模式野瘦;否則的話描沟,它會將文件當作一個完整程序來執(zhí)行。

10 完整語法

原文來自:Python官網(wǎng)的Python 語言參考(3.8.2版本)鞭光。
若侵權(quán)請聯(lián)系刪除

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吏廉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惰许,更是在濱河造成了極大的恐慌席覆,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汹买,死亡現(xiàn)場離奇詭異佩伤,居然都是意外死亡,警方通過查閱死者的電腦和手機晦毙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進店門生巡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人见妒,你說我怎么就攤上這事孤荣。” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵盐股,是天一觀的道長钱豁。 經(jīng)常有香客問我,道長遂庄,這世上最難降的妖魔是什么寥院? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮涛目,結(jié)果婚禮上秸谢,老公的妹妹穿的比我還像新娘。我一直安慰自己霹肝,他們只是感情好估蹄,可當我...
    茶點故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沫换,像睡著了一般臭蚁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讯赏,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天垮兑,我揣著相機與錄音,去河邊找鬼漱挎。 笑死系枪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的磕谅。 我是一名探鬼主播私爷,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼膊夹!你這毒婦竟也來了衬浑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤放刨,失蹤者是張志新(化名)和其女友劉穎工秩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體进统,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡助币,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了麻昼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,912評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡馋辈,死狀恐怖抚芦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤叉抡,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布尔崔,位于F島的核電站,受9級特大地震影響褥民,放射性物質(zhì)發(fā)生泄漏季春。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一消返、第九天 我趴在偏房一處隱蔽的房頂上張望载弄。 院中可真熱鬧,春花似錦撵颊、人聲如沸宇攻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逞刷。三九已至,卻和暖如春妻熊,著一層夾襖步出監(jiān)牢的瞬間夸浅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工扔役, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留帆喇,地道東北人。 一個月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓厅目,卻偏偏與公主長得像番枚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子损敷,可洞房花燭夜當晚...
    茶點故事閱讀 45,922評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔葫笼,今天18年5月份再次想寫文章,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,771評論 2 9
  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,771評論 0 8
  • 要點: 函數(shù)式編程:注意不是“函數(shù)編程”拗馒,多了一個“式” 模塊:如何使用模塊 面向?qū)ο缶幊蹋好嫦驅(qū)ο蟮母拍盥沸恰傩浴?..
    victorsungo閱讀 1,524評論 0 6
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,823評論 1 10
  • 周一晚辦公班主任開會,周二質(zhì)量分析诱桂,周三經(jīng)驗交流會…… 開了三天會總算給點福利了:今兒的會看視頻洋丐,一會兒《亮劍》,...
    格乃閱讀 888評論 16 21