1. 定義一個函數:
python
1)必須以def開頭
c++
2)參數之間用,隔開
express
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. 函數的參數傳遞 code
咱們知道在c++中,函數的參數既能夠傳遞值,也能夠傳遞引用。那麼在Python中是怎麼樣的呢?
對象
#改變整數 def change_number(num): print("num = ", num) num += 1 print('num = ', num) num = 3 print('before change: num = ', num) change_number(num) print('after change: num = ', num) >>> before change: num = 3 num = 3 num = 4 after 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 = billy string = billy string = hello after change: name = billy
#改變list def 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編程中常常用到。
string
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 = 10 width = 200, height = 10 width = 200, height = 30
4. 命名參數:默認的函數調用過程當中,參數的傳遞是經過位置進行的,若是函數的個數比較多的狀況下,咱們頗有可能會搞不清楚參數的位置,這個時候經過命名參數,就能很好的解決
it
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 = 40 name = 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 sum list1 = [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 sum print(cal_sum(1, 2, 3, 4)) print(cal_sum(1, 2, 3, 4, 5, 6)) list1 = [1, 2, 3] print(cal_sum(*list1)) >>> 10 21 6
*不能傳遞命名參數,必須使用**
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 window1 height 300 width 200 {'name': 'window2', 'height': 300, 'width': 200} name window2 height 300 width 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+b num1, num2, num3 = return_value() print(num1, num2, num3) >>> 1 2 3
實際上Python會將全部的返回值存放到一個臨時的tuple中,若是隻有1個變量來接收返回參數,那麼就會將此變量引用此tuple,若是有多個變量來接收返回參數,Python會對tuple變量進行unpack,此時會要求接收變量的個數與返回值的個數同樣才行。