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