函數是帶名稱的代碼塊,用於完成具體的工作,當我們需要在程序中多次執行同一任務時,會產生大量的重復代碼
我們可以將重復代碼定義為函數,這樣每次執行任務時,只需要調用該函數即可
定義函數語法:
def functionname(parameters):
"""函數文檔"""
statement
return [expression]
1 定義函數實例
1.1 定義無參數函數
下面定義一個不含參數的歡迎函數:
def greet_user():
print('Welcome!')
greet_user()
執行結果:

該函數沒有定義參數,所以引用的時候也不需要輸入參數,直接以函數名引用即可
1.2 定義有參數函數
下面定義一個含參數的歡迎函數:
def greet_user(user):
print('Hello,%s!' % user)
greet_user('Jack')
執行結果:

該函數定義了參數,所以調用的時候必須輸入參數
當函數有多個參數時,可以通過位置給參數賦值,但位置不可靠,建議以'參數名=參數'鍵值對的形式賦值,這樣參數的位置就不影響賦值
1.3 給參數指定默認值
定義函數時,可以給參數指定默認值,這樣在調用函數時,如果給參數指定值,參數就使用指定的值,否則就使用默認值
def self_introduction(name, country='China'):
introduction = 'My name is %s,I come from %s.' % (name, country)
print(introduction)
return introduction
self_introduction(name='張無忌')
self_introduction(name='成昆', country='Japan')
結果如下:

第一次調用時,沒有指定參數country的值,所以使用了默認值;第二次調用時,則使用了指定的參數值
默認參數必須指向不可變的對象
def add_end(list1=[]):
list1.append('1')
return list1
print(add_end())
print(add_end())
print(add_end())
代碼運行結果是:

原因:函數在定義時,默認參數list1所指定的地址已經確定,而list1是一個list,所以每次調用該函數時,如果改變了列表的內容,則下次調用時,默認參數的內容就會改變
如果確實需要指定一個空的對象,可指定默認值是None,然后在函數內部對參數值判斷
1.4 定義可變參數
可變參數:就是傳入的參數個數是可變的,可以是1個、2個到任意個,還可以是0個
定義語法:def function(arg,*args):
在函數調用時,*會以單個元素的形式解包一個元祖,使其成為獨立的參數
def sum_new(*numbers):
total = 0
for n in numbers:
total = total + n * n
return total
print(sum_new())
print(sum_new(5))
a = [1, 2, 3]
print(sum_new(*a)) # 將list or tuple做為參數時,加一個*解析為可變參數
結果如下:

1.5 關鍵字參數
**kwargs表示關鍵字參數,接收的是dict
def sum_new(year, **users):
print(year, users)
sum_new(2021, a=1, b=2)
結果如下:

總結:參數的定義順序為:必選參數-->默認參數-->可變參數-->關鍵字參數
