解讀python3.7教程(三)——函數、參數、 Lambda表達式

1. 定義函數

>>> 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()

在其他語言中,您可能會反對fib不是一個函數,而是一個過程,因爲它不返回值。事實上,即使沒有return語句的函數也會返回一個值,儘管這個值相當枯燥。這個值被稱爲None(它是一個內置的名稱)。編寫值None通常會被解釋器禁止,如果它是唯一寫入的值。如果您真的想使用print(),可以看到它:

2.默認值參數

⚠️導入警告:默認值只計算一次。當默認值是可變對象(如列表、字典或大多數類的實例)時,這會產生不同的效果。例如,以下函數累增在後續調用時傳遞給它的參數:

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

默認值是指向一個列表對象,程序開始的時候這個列表對象是空。而不是每次調用函數的時候新建一個空列表。
這將會打印

[1]
[1, 2]
[1, 2, 3]

如果不希望在後續調用之間共享默認值,則可以編寫如下函數:

def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L

3.關鍵字參數

在函數調用中,關鍵字參數必須跟隨位置參數。傳遞的所有關鍵字參數都必須與函數接受的一個參數相匹配,它們的順序並不重要。這也包括非可選的參數。任何參數都不能收到超過一次的值。

通常,這些變量參數將是形式參數列表中的最後一個參數,因爲它們獲取傳遞給函數的所有其餘輸入參數。在*args參數之後出現的任何形式參數都是‘只關鍵字’參數,這意味着它們只能用作關鍵字而不是位置參數。

>>> def concat(*args, sep="/"):
...     return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'

4 解包參數列表

當參數已經在列表或元組中,但需要爲要求單獨位置參數的函數調用解包時,就會發生相反的情況。例如,內置range()函數需要獨立的開始參數和停止參數。如果它們不能單獨使用,則使用*-操作符編寫函數調用,將參數從列表或元組中解包:

>>> 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]

以同樣的方式,字典可以使用**-操作符傳遞關鍵字參數:

>>> 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 !

5 Lambda表達式

可以使用lambda關鍵字創建小型匿名函數。此函數返回兩個參數之和:lambda a,b : a+b。Lambda函數可以在任何需要函數對象的地方使用。它們在語法上僅限於一個表達式。在語義上,它們只是正常功能定義的語法糖。與嵌套函數定義一樣,lambda函數可以引用包含範圍中的變量:

>>> def make_incrementor(n):
...     return lambda x: x + n
...
>>> f = make_incrementor(42)
>>> f(0)
42
>>> f(1)
43

上面的示例使用lambda表達式返回函數。另一個用途是傳遞一個小函數作爲參數:

>>> 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')]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章