[譯]The Python Tutorial#More Control Flow Tools
除了剛才介紹的while
語句之外,Python也從其他語言借鑒了其他流程控制語句族跛,并做了相應(yīng)改變捉兴。
4.1 if
Statements
或許最廣為人知的語句就是if
語句了挤茄。例如:
x = int(input("Please enter an integer: "))
if x < 0:
x = 0
print('Negative changed to zero')
elif x == 0:
print('Zero')
elif x == 1:
print('Single')
else:
print('More')
可以存在零個或者多個elif
子句,而且else
子句是可選的。關(guān)鍵字elif
是else if
的簡寫形式,可以避免過度的縮進(jìn)乌助。if ... elif ... elif ...
序列是其他語言中switch
或者case
語句的替代品。
4.2 for
Statements
Python中的for
語句與C或者Pacsal中的for
語句有微小差別陌知。Python沒有采用對等差數(shù)列數(shù)字迭代的方式(在Pascal中)實(shí)現(xiàn)循環(huán)他托,也沒有采用如C語言一樣賦予用戶自定義迭代步數(shù)和停止條件的方式實(shí)現(xiàn)循環(huán),Python的for
語句在任意序列(列表或者字符串)的項(xiàng)上迭代仆葡,以項(xiàng)在序列中的出現(xiàn)順序迭代赏参。例如(沒有別的意思):
# Measure some strings:
words = ['cat', 'window', 'defenestrate']
for w in words:
print(w, len(w))
如果需要在循環(huán)內(nèi)修改正在遍歷的序列(例如復(fù)制選中項(xiàng)),推薦首先對序列復(fù)制沿盅。遍歷序列時并沒有隱式地創(chuàng)建備份把篓。切片語句為復(fù)制序列提供了便利:
for w in words[:]: # Loop over a slice copy of the entire list.
if len(w) > 6:
words.insert(0, w)
words
使用for w in words:
,實(shí)例會嘗試創(chuàng)建一個無限列表腰涧,不斷地插入字符串defenestrate
纸俭。
4.3 The range()
Function
如果確實(shí)需要對數(shù)字的序列做迭代,built-in函數(shù)range()
可以派上用場南窗。這個函數(shù)生成算術(shù)數(shù)列:
>>> for i in range(5):
... print(i)
...
0
1
2
3
4
end
參數(shù)不會被包含到生成的序列中揍很;range(10)
生成10個值郎楼,序列項(xiàng)的合法索引長度是10≈匣冢可以讓range在另一個數(shù)字上開始呜袁,或者指定一個不同的增量(甚至是負(fù)數(shù);有時增量稱作步長'step'):
range(5, 10)
5 through 9
range(0, 10, 3)
0, 3, 6, 9
range(-10, -100, -30)
-10, -40, -70
需要對序列的索引做迭代時简珠,可以像下面這樣結(jié)合range()
和len()
函數(shù):
>>> a = ['Mary', 'had', 'a', 'little', 'lamb']
>>> for i in range(len(a)):
... print(i, a[i])
...
0 Mary
1 had
2 a
3 little
4 lamb
然而阶界,在大多數(shù)這樣的情況下,使用enumerate()
函數(shù)很方便聋庵,詳細(xì)參考Looping Techniques膘融。
直接打印range()的結(jié)果會很奇怪:
>>> print(range(10))
range(0, 10)
在許多情形中range()
返回的對象就像一個列表一樣,但是事實(shí)上它并不是祭玉。當(dāng)?shù)@個對象時氧映,它會返回目標(biāo)序列中的連續(xù)項(xiàng),但是為了節(jié)約空間脱货,并沒有真的創(chuàng)建一個列表岛都。
這種對象被稱為iterable
(可迭代的),即振峻,若一些函數(shù)或者結(jié)構(gòu)期待從某種東西中獲得連續(xù)項(xiàng)臼疫,直到結(jié)束,那么iterable
對象可以滿足這種需求扣孟。for
語句就是這樣的迭代程序烫堤。list()
函數(shù)是另外一個,它使用可迭代對象創(chuàng)建列表:
>>> list(range(5))
[0, 1, 2, 3, 4]
接下來會介紹更多返回可迭代對象和使用可迭代對象作為參數(shù)的函數(shù)凤价。
4.4 break
and continue
Statements, and else
Clauses on Loops
像C語言一樣鸽斟,break
語句跳出for
或者while
的最內(nèi)層循環(huán)。
循環(huán)語句可以有else
子句料仗;當(dāng)for
循環(huán)遍歷完循環(huán)序列或者while
循環(huán)的循環(huán)條件變?yōu)?code>False時湾盗,else
子句會執(zhí)行。但是當(dāng)循環(huán)被break
語句終止時立轧,else
子句不會執(zhí)行格粪。以下尋找素數(shù)的實(shí)例可以證明這一點(diǎn):
>>> for n in range(2, 10):
... for x in range(2, n):
... if n % x == 0:
... print(n, 'equals', x, '*', n//x)
... break
... else:
... # loop fell through without finding a factor
... print(n, 'is a prime number')
...
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
(代碼是正確的》崭模靠近看:else
子句屬于for
循環(huán)帐萎,而不是if
語句。)
當(dāng)與循環(huán)語句一起使用時胜卤,else
子句與try
語句中的else
子句相似疆导,而與if
語句的else
子句不同:當(dāng)沒有異常發(fā)生時,try
語句的else
子句會執(zhí)行葛躏,在循環(huán)中澈段,沒有break
發(fā)生時悠菜,else
子句會執(zhí)行。想要了解更多關(guān)于try
語句和異常的信息败富,參見 Handling Exceptions悔醋。
continue
語句,也是從C語言借鑒而來兽叮,用于直接跳到循環(huán)的下一個迭代:
>>> for num in range(2, 10):
... if num % 2 == 0:
... print("Found an even number", num)
... continue
... print("Found a number", num)
Found an even number 2
Found a number 3
Found an even number 4
Found a number 5
Found an even number 6
Found a number 7
Found an even number 8
Found a number 9
4.5 pass
Statements
pass
語句什么也不做芬骄,當(dāng)一個語句需要語法上的完整而不做任何事情時,可以使用pass
語句鹦聪。例如:
>>> while True:
... pass # Busy-wait for keyboard interrupt (Ctrl+C)
...
pass
語句可以用來創(chuàng)建最小類:
>>> class MyEmptyClass:
... pass
...
pass
語句的另一個用處是账阻,當(dāng)需要編寫新的代碼時,使用它作為函數(shù)或者條件體的位置占位符泽本,這為作者在更加抽象的層次思考問題提供了便利淘太。pass
被默默地忽視:
>>> def initlog(*args):
... pass # Remember to implement this!
...
4.6 Defining Functions
以下是打印任意邊界斐波那契數(shù)列的函數(shù):
>>> def fib(n): # write Fibonacci series up to n
... """Print a Fibonacci series up to n."""
... a, b = 0, 1
... while a < n:
... print(a, end=' ')
... a, b = b, a+b
... print()
...
>>> # Now call the function we just defined:
... fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
關(guān)鍵字def
引入函數(shù)定義,必須在后面跟上函數(shù)名字和形參列表观挎。構(gòu)成函數(shù)體的語句另起一行琴儿,必須縮進(jìn)段化。
函數(shù)體的第一條語句可以選擇性使用字符串作為函數(shù)的文檔字符串嘁捷,或者docstring
。(更多關(guān)于文檔字符串參見 Documentation Strings) 許多工具使用文檔字符串自動生成在線或者打印文檔显熏,或者允許使用者交互地瀏覽代碼雄嚣;在代碼中寫文檔字符串是一個好的實(shí)踐,因此需要將其作為習(xí)慣喘蟆。
函數(shù)的執(zhí)行引入了函數(shù)局部變量使用的新符號表缓升。更準(zhǔn)確的說,所有在函數(shù)中賦值變量都將值存儲在局部符號表中蕴轨;變量引用首先在局部符號表中查找港谊,然后是封閉函數(shù)的局部符號表,然后是全局符號表橙弱,最后是built-in符號表歧寺。因此,在函數(shù)中全局變量可以被引用棘脐,但是不能直接賦予新值(除非使用global
語句聲明)斜筐。
當(dāng)函數(shù)被調(diào)用時,實(shí)參也被引入被調(diào)用函數(shù)的局部符號表中蛀缝。因此顷链,參數(shù)按照按值調(diào)用的方式傳遞(這里的值總是對象引用,而不是對象的值屈梁。)[1] 當(dāng)函數(shù)調(diào)用其他函數(shù)時嗤练,為調(diào)用會產(chǎn)生新的局部符號表榛了。
函數(shù)定義在當(dāng)前符號表中引入函數(shù)名。函數(shù)名引用的值擁有一個被解釋器識別為“用戶自定義函數(shù)”的類型煞抬。這個值也可以賦值給其他名字忽冻,然后使用這個名字來調(diào)用函數(shù)。這種方式是函數(shù)重命名機(jī)制:
>>> fib
<function fib at 10042ed0>
>>> f = fib
>>> f(100)
0 1 1 2 3 5 8 13 21 34 55 89
擁有其他語言經(jīng)驗(yàn)的程序員此疹,可能會認(rèn)為fib
不是一個方法而是一個過程僧诚,因?yàn)樗鼪]有返回值。事實(shí)上蝗碎,沒有返回語句的函數(shù)確實(shí)返回了值湖笨,而且是相當(dāng)煩人的值,這個值被稱為None
(built-in名字)蹦骑。如果None
值是唯一要寫的值慈省,那么寫的時候通常會被解釋器忽視。使用print()
可以看到打印的None
值:
>>> fib(0)
>>> print(fib(0))
None
想要定義返回斐波那契數(shù)列數(shù)字而不是打印數(shù)字的函數(shù)非常簡單:
>>> def fib2(n): # return Fibonacci series up to n
... """Return a list containing the Fibonacci series up to n."""
... result = []
... a, b = 0, 1
... while a < n:
... result.append(a) # see below
... a, b = b, a+b
... return result
...
>>> f100 = fib2(100) # call it
>>> f100 # write the result
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
這個例子也示范了Python的一些新特性:
-
return
語句從函數(shù)中返回一個值眠菇。不帶任何表達(dá)式的return
語句返回None
边败。函數(shù)結(jié)束時也會返回None
。 - 語句
result.append(a)
調(diào)用列表對象result
的方法捎废。方法是屬于對象的函數(shù)笑窜,并且以obj.methodname
命名,這里obj
是一個對象(或許是返回對象的表達(dá)式)登疗,methodname
是定義在obj
所屬類型中的函數(shù)名排截。不容的類型定義了不同的函數(shù)。不同類型中的函數(shù)可以擁有相同的名字而不會導(dǎo)致二義(使用類辐益,自定義新的對象類型和函數(shù)是可行的断傲,參見Classes
) 這個例子中的方法append()
定義在列表對象中;該方法在列表末尾添加新元素智政。這個例子中等同于result = result + [a]
认罩,但是append()
方法更加高效。
4.7 More on Defining Functions
定義函數(shù)可以使用許多參數(shù)续捂,有三種形式垦垂,可以將其結(jié)合使用。
4.7.1 Default Argument Values
為一個或者更多參數(shù)指定默認(rèn)值是最有用的疾忍。這種方式創(chuàng)建的函數(shù)乔外,可以使用比定義所需更少的參數(shù)來調(diào)用。例如:
def ask_ok(prompt, retries=4, reminder='Please try again!'):
while True:
ok = input(prompt)
if ok in ('y', 'ye', 'yes'):
return True
if ok in ('n', 'no', 'nop', 'nope'):
return False
retries = retries - 1
if retries < 0:
raise ValueError('invalid user response')
print(reminder)
這個函數(shù)可以用以下方式調(diào)用:
- 指定唯一的強(qiáng)制參數(shù):
ask_ok('Do you really want to quit?')
- 指定其中一個可選參數(shù):
ask_ok('OK to overwrite the file?', 2)
- 或者指定所有參數(shù):
ask_ok('OK to overwrite the file?', 2, 'Come on, only yes or no!')
這個例子也介紹了關(guān)鍵字in
一罩,用來測試序列是否包含具體的值杨幼。
參數(shù)的默認(rèn)值在函數(shù)定義時求值,因此:
i = 5
def f(arg=i):
print(arg)
i = 6
f()
會打印5。
重要提示: 參數(shù)默認(rèn)值只被求值一次差购。當(dāng)默認(rèn)參數(shù)是諸如列表四瘫,字典或者其他大多數(shù)類實(shí)例般的可變對象時,會有很大不同欲逃。例如找蜜,以下函數(shù)累積后續(xù)調(diào)用傳遞的實(shí)參:
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
會打印:
[1]
[1, 2]
[1, 2, 3]
如果不希望默認(rèn)參數(shù)被隨后的調(diào)用共享稳析,可以使用如下的函數(shù)代替:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
4.7.2 Keyword Arguments
也可以使用如kwarg = value
形式的關(guān)鍵字參數(shù)調(diào)用函數(shù)洗做。例如如下函數(shù):
def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It's", state, "!")
接受一個必須參數(shù)(voltage
)以及三個可選參數(shù)(state, action
和type
)。這個函數(shù)可以使用以下的任意方式調(diào)用:
parrot(1000) # 1 positional argument
parrot(voltage=1000) # 1 keyword argument
parrot(voltage=1000000, action='VOOOOOM') # 2 keyword arguments
parrot(action='VOOOOOM', voltage=1000000) # 2 keyword arguments
parrot('a million', 'bereft of life', 'jump') # 3 positional arguments
parrot('a thousand', state='pushing up the daisies') # 1 positional, 1 keyword
但是下面的調(diào)用方式都是非法的:
parrot() # required argument missing
parrot(voltage=5.0, 'dead') # non-keyword argument after a keyword argument
parrot(110, voltage=220) # duplicate value for the same argument
parrot(actor='John Cleese') # unknown keyword argument
函數(shù)調(diào)用中彰居,關(guān)鍵字參數(shù)必須在位置參數(shù)之后诚纸。所有傳遞的關(guān)鍵字實(shí)參必須匹配函數(shù)接受的其中一個形參(例如,actor
對于函數(shù)parrot
來說就不是一個合法的關(guān)鍵字參數(shù))陈惰,其順序不是重要的畦徘。也包括非可選形參(例如parrot(voltage = 1000)
也是合法的)。任意形參都不會接受兩次實(shí)參值抬闯。以下示例就是由于這條限制而調(diào)用失敗的:
>>> def function(a):
... pass
...
>>> function(0, a=0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: function() got multiple values for keyword argument 'a'
當(dāng)最后一個的形參是**name
形式時井辆,這個參數(shù)接收字典(參見 Mapping Types-dict
),這個字典包含不能與形參匹配的關(guān)鍵字實(shí)參溶握。關(guān)鍵字參數(shù)可以與形如*name
的形式參數(shù)結(jié)合杯缺,這種形式參數(shù)以元組接收不能與形參匹配的位置參數(shù)。(*name
必須在**name
之前)奈虾。例如夺谁,以下函數(shù):
def cheeseshop(kind, *arguments, **keywords):
print("-- Do you have any", kind, "?")
print("-- I'm sorry, we're all out of", kind)
for arg in arguments:
print(arg)
print("-" * 40)
for kw in keywords:
print(kw, ":", keywords[kw])
可以像下面一樣調(diào)用:
cheeseshop("Limburger", "It's very runny, sir.",
"It's really very, VERY runny, sir.",
shopkeeper="Michael Palin",
client="John Cleese",
sketch="Cheese Shop Sketch")
當(dāng)然會如下打恿狻:
-- Do you have any Limburger ?
-- I'm sorry, we're all out of Limburger
It's very runny, sir.
It's really very, VERY runny, sir.
----------------------------------------
shopkeeper : Michael Palin
client : John Cleese
sketch : Cheese Shop Sketch
注意關(guān)鍵字參數(shù)打印的順序保證是與其在函數(shù)調(diào)用時參數(shù)提供的順序相同的肉微。
4.7.3 Arbitrary Argument Lists
最后,最不常用的是讓函數(shù)可以使用任意數(shù)量的參數(shù)調(diào)用蜡塌。這些參數(shù)會被包裝在元組中(參見 Tuples and Sequences)碉纳。在可變數(shù)量形參之前,可以有零個或者更多普通參數(shù):
def write_multiple_items(file, separator, *args):
file.write(separator.join(args))
通常馏艾,可變參數(shù)是形參列表中的最后一個劳曹,因?yàn)榭勺儏?shù)接收了傳遞給函數(shù)的所有剩余實(shí)參。出現(xiàn)在*args
后面的任意任意形參都是keyword-only
參數(shù)(強(qiáng)制關(guān)鍵字參數(shù))琅摩,意味著他們只能作為關(guān)鍵字參數(shù)使用铁孵,而不能用作位置參數(shù)。
>>> def concat(*args, sep="/"):
... return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
4.7.4 Unpacking Argument Lists
參數(shù)已經(jīng)封裝在列表或者元組中房资,但是當(dāng)調(diào)用需要分離的位置參數(shù)的函數(shù)時蜕劝,需要拆包元組或者列表。例如,built-in函數(shù)range()
需要分離的start
和stop
參數(shù)岖沛。如果它們不是分離的暑始,可以在函數(shù)調(diào)用時使用*
操作符來從列表或者元組中拆包(譯注:事實(shí)證明,字符串也是可以被拆包的):
>>> list(range(3, 6)) # normal call with separate arguments
[3, 4, 5]
>>> args = [3, 6]
>>> list(range(*args)) # call with arguments unpacked from a list
[3, 4, 5]
以同樣的方式婴削,使用**
操作符廊镜,字典可以傳遞關(guān)鍵字參數(shù):
>>> def parrot(voltage, state='a stiff', action='voom'):
... print("-- This parrot wouldn't", action, end=' ')
... print("if you put", voltage, "volts through it.", end=' ')
... print("E's", state, "!")
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
4.7.5 Lambda Expressions
可以使用關(guān)鍵字lambda
創(chuàng)建小的匿名方法。這個函數(shù)返回其兩個參數(shù)之和:lambda a, b: a + b
唉俗。Lambda方法可以在所有需要函數(shù)對象的地方使用嗤朴。句法上,它們在被限制在一個單個表達(dá)式中虫溜。語法上播赁,它們只是正常函數(shù)定義的語法糖而已。像內(nèi)嵌函數(shù)定義一樣吼渡,lambda方法也可以引用外部作用域的變量:
>>> def make_incrementor(n):
... return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43
上面的例子使用lambda表達(dá)式來返回一個函數(shù)容为。其他的用法是將這個小函數(shù)為參數(shù)傳遞:
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
4.7.6 Documentation Strings
這里有一些關(guān)于文檔字符串的內(nèi)容和格式的約定。
第一行應(yīng)該是對象用途短小而簡明地總結(jié)寺酪。簡潔起見坎背,不應(yīng)該詳細(xì)描述對象的名字和類型,因?yàn)榭梢酝ㄟ^其他途徑了解(除非名字恰好是描述方法操作的動詞)寄雀。這一行應(yīng)該以大寫字母開始并以句號結(jié)束得滤。
如果文檔字符串有多行,第二行應(yīng)該空出來盒犹,從視覺上把總結(jié)和其他的描述分開來懂更。剩余行應(yīng)是一個或者多個描述對象的調(diào)用約定及其副作用的段落。
Python分析程序不會去掉多行字符串中的縮進(jìn)急膀,因此如果必要的話聚请,文檔處理工具自己必須去掉縮進(jìn),這遵循以下約定:第一行字符串后面的第一個非空行決定整個文檔字符串縮進(jìn)的數(shù)量赞厕。(因?yàn)榈谝恍芯o挨著它的起始引號蜈项,因此表面上看不出其縮進(jìn),所以不能使用第一行作為標(biāo)準(zhǔn))留白“相當(dāng)于”是字符串的起始縮進(jìn)晨雳。每一行都不應(yīng)該有縮進(jìn)行瑞,如果有縮進(jìn)的話,所有的留白都應(yīng)該清除掉餐禁。留白的長度應(yīng)當(dāng)?shù)扔跀U(kuò)展制表符的寬度(通常是8個空格)血久。
以下是多行文檔字符串的示例:
>>> def my_function():
... """Do nothing, but document it.
...
... No, really, it doesn't do anything.
... """
... pass
...
>>> print(my_function.__doc__)
Do nothing, but document it.
No, really, it doesn't do anything.
4.7.7 Function Annotations
方法注解 是描述用戶自定義方法使用的類型的元信息,是完全可選的(參見PEP 484獲取更多信息)帮非。
注解作為字典存儲在方法屬性__annotations__
中氧吐,并且對方法的其他部分沒有任何影響绷旗。參數(shù)注解定義在參數(shù)名字后的冒號后面,緊跟計算注解值得表達(dá)式副砍。返回注解使用->
定義衔肢,緊跟表達(dá)式,在參數(shù)列表和指示def
語句結(jié)束的冒號中間豁翎。下面的例子有一個位置參數(shù)角骤,關(guān)鍵字參數(shù)以及返回值的注解:
>>> def f(ham: str, eggs: str = 'eggs') -> str:
... print("Annotations:", f.__annotations__)
... print("Arguments:", ham, eggs)
... return ham + ' and ' + eggs
...
>>> f('spam')
Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
Arguments: spam eggs
'spam and eggs'
4.7.8 Intermezzo: Coding Style
現(xiàn)在需要寫更長更復(fù)雜的Python程序,是時候談?wù)摼幋a風(fēng)格了心剥。大多數(shù)語言可以以不同的風(fēng)格編寫(更簡潔的說是格式化)邦尊,一些編碼風(fēng)格比其他的更加可讀。讓其他人更容易讀懂你的代碼一直都是很重要的优烧,養(yǎng)成良好的編碼風(fēng)格很重要蝉揍。
對于Python來說,PEP 8被作為風(fēng)格規(guī)范指導(dǎo)畦娄,許多項(xiàng)目都在使用這種規(guī)范又沾。這個規(guī)范促成了一種非常易讀和養(yǎng)眼的代碼風(fēng)格。在某種程度上每一個Python開發(fā)者都應(yīng)該閱讀它熙卡,以下是從這個規(guī)范中提取的重要內(nèi)容:
- 使用4個空格作為縮進(jìn)杖刷,而不是tab
4個空格是小的縮進(jìn)(允許更深的嵌套深度)和大縮進(jìn)(更易讀)之間的良好折中方案。Tabs會導(dǎo)致困擾驳癌,最好棄用 - 換行以保證每一行不會超過79個字符
這在小的顯示器上非常有用滑燃,也可在大的顯示器中分屏顯示多個文件 - 使用空行分開方法和類,以及函數(shù)中的大代碼塊
- 如果可能颓鲜,注釋獨(dú)占一行
- 使用文檔字符串
- 在操作符的兩端以及頓號后面使用空格表窘,但是不要在括號內(nèi)側(cè)使用:
a = f(1, 2) + g(3, 4)
- 統(tǒng)一命名類以及函數(shù);約定使用
CamelCase
(駝峰)命名類甜滨,使用lower_case_with_underscores
(小寫帶下劃線)命名方法和函數(shù)乐严。總是使用self
作為方法的第一個參數(shù)名(參見A first Look at Classes了解更多關(guān)于類和方法的信息) - 如果代碼要在國際環(huán)境中使用艳吠,不要使用自己喜愛的獨(dú)特編碼方式麦备。Python的默認(rèn)編碼
UTF-8
或者甚至普通的ASCII
編碼都能在任何情況下起作用。 - 同樣的昭娩,不要在標(biāo)識符中使用非
ASCII
字符,除非是不同語種的人會閱讀和維護(hù)代碼黍匾。
Footnotes
<span id="jump">[1] </span> 事實(shí)上栏渺,使用引用傳遞會描述更好,因?yàn)槿绻麄鬟f的是可變對象锐涯,被調(diào)用者對對象的修改對調(diào)用者可見(如在列表中插入新的項(xiàng))