標籤:
1. 定義一個函數:
1)必須以def開頭
2)參數之間用,隔開
3)函數的內容以冒號:開始,並且縮排
4)不帶運算式的return,相當於返回None
def function_name(parameters): #do something ... return [expression]
def cal_sum(a,b): return (a + b) #調用函數sum = cal_sum(2, 6)print(sum)>>> 8
2. 函數的參數傳遞
我們知道在c++中,函數的參數既可以傳遞值,也可以傳遞引用。那麼在Python中是怎麼樣的呢?
#改變整數def change_number(num): print("num = ", num) num += 1 print(‘num = ‘, num) num = 3print(‘before change: num = ‘, num)change_number(num)print(‘after change: num = ‘, num)>>> before change: num = 3num = 3num = 4after change: num = 3
#改變字串def change_string(string): print("string = ", string) string = ‘hello‘ print(‘string = ‘, string)name = ‘billy‘print(‘before change: name = ‘, name)change_string(name)print(‘after change: name = ‘, name)>>> before change: name = billystring = billystring = helloafter change: name = billy
#改變listdef change_list(list_test): print(list_test) list_test[0] = 111 #print(list_test)list1 = [100, ‘b‘]change_list(list1)print(list1)>>> [100, ‘b‘][111, ‘b‘]
通過上面的例子,可以看出,在Python中,對於整數、浮點數、True/False是按照值傳遞的,即會先將自己當前的值賦給函數的參數,在函數內部的任何修改均不影響外部的值。對於字串、list、dict這種變數類型,是按照引用傳遞的,即函數的參數是傳遞對象的引用,因此在函數內部的修改,均會影響到變數的值。這裡特別說明一下字串的傳遞與修改過程,首先string參數指向"billy"對象,由於Python中的字串是“不可變”對象,之後對string的修改,就是把string參數指向了"hello"對象了,而原先的name變數仍然指向"billy"對象。
3. 預設參數:即讓該參數有一個預設值,這個在GUI編程中經常用到。
def create_label(width = 100, height = 10): print(‘width = %d, height = %d‘ % (width, height))create_label()create_label(200)create_label(200, 30)>>> width = 100, height = 10width = 200, height = 10width = 200, height = 30
4. 具名引數:預設的函數調用過程中,參數的傳遞是通過位置進行的,如果函數的個數比較多的情況下,我們很有可能會搞不清楚參數的位置,這個時候通過具名引數,就能很好的解決
def create_label(name, width, height = 10): print(‘name = %s, width = %d, height = %d‘ % (name, width, height))create_label(‘label1‘, 200, 40)create_label(width=200, height=40, name=‘label2‘)>>>name = label1, width = 200, height = 40name = label2, width = 200, height = 40
上述函數調用的效果是一樣的,不過通過具名引數,參數的位置就不用要求name必須防止在前面了。
5.變長參數:在c語言中,用...來表示函數的參數個數不是固定的,那麼在Python中,我們首先會想到可以傳遞一個tuple, list, dict,tuple, list, dict裡面可以存放任意數量的值。如:
def cal_sum(num_list): sum = 0 for num in num_list: sum += num return sumlist1 = [1, 2, 3]print(cal_sum(list1))>>>6
課時這樣子有個缺陷,就是每次都要把要傳遞的值儲存到list中,Python通過*和**來解決,由Python幫我們完成此操作。
def cal_sum(*var_tuple): sum = 0 for num in var_tuple: sum += num return sumprint(cal_sum(1, 2, 3, 4))print(cal_sum(1, 2, 3, 4, 5, 6))list1 = [1, 2, 3]print(cal_sum(*list1))>>>10216
*不能傳遞具名引數,必須使用**
def create_window(**var_dict): print(var_dict) for(k, v) in var_dict.items(): print(k ,v)create_window(name=‘window1‘, height=300, width=200)dict1 = {‘name‘:‘window2‘, ‘width‘:200, ‘height‘:300}create_window(**dict1)>>>{‘name‘: ‘window1‘, ‘height‘: 300, ‘width‘: 200}name window1height 300width 200{‘name‘: ‘window2‘, ‘height‘: 300, ‘width‘: 200}name window2height 300width 200
Note: 在函數的var_tuple參數前加上*,表示var_tuple接收的是一個tuple, 在var_dict參數前加上**,表示var_dict接收的是一個dict。
而在調用cal_sum函數時,在list1前面加上*,表示把list1中的元素作為可變參數傳遞進去。在調用create_window函數時,在dict1前面加上**,表示把dict1中的元素作為命名的可變參數傳遞進去。
6. 函數的傳回值。在Python中是可以有多個傳回值的
def return_value(): a = 1 b = 2 return a, b, a+bnum1, num2, num3 = return_value()print(num1, num2, num3)>>> 1 2 3
實際上Python會將所有的傳回值存放到一個臨時的tuple中,如果只有1個變數來接收返回參數,那麼就會將此變數引用此tuple,如果有多個變數來接收返回參數,Python會對tuple變數進行unpack,此時會要求接收變數的個數與傳回值的個數一樣才行。
Python入門(八) 函數基礎