[譯]The Python Tutorial#More Control Flow Tools

[譯]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)鍵字elifelse 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, actiontype)。這個函數(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()需要分離的startstop參數(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))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末磕诊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌霎终,老刑警劉巖滞磺,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異莱褒,居然都是意外死亡击困,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門广凸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來阅茶,“玉大人,你說我怎么就攤上這事谅海×嘲В” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵扭吁,是天一觀的道長撞蜂。 經(jīng)常有香客問我,道長侥袜,這世上最難降的妖魔是什么谅摄? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮系馆,結(jié)果婚禮上送漠,老公的妹妹穿的比我還像新娘。我一直安慰自己由蘑,他們只是感情好闽寡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尼酿,像睡著了一般爷狈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上裳擎,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天涎永,我揣著相機(jī)與錄音,去河邊找鬼鹿响。 笑死羡微,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的惶我。 我是一名探鬼主播妈倔,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼绸贡!你這毒婦竟也來了盯蝴?” 一聲冷哼從身側(cè)響起毅哗,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捧挺,沒想到半個月后虑绵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闽烙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年翅睛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸣峭。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡宏所,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出摊溶,到底是詐尸還是另有隱情爬骤,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布莫换,位于F島的核電站霞玄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拉岁。R本人自食惡果不足惜坷剧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喊暖。 院中可真熱鬧惫企,春花似錦、人聲如沸陵叽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巩掺。三九已至偏序,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胖替,已是汗流浹背研儒。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留独令,地道東北人端朵。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像记焊,于是被迫代替她去往敵國和親逸月。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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