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 = 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编程中经常用到。
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. 命名参数:默认的函数调用过程中,参数的传递是通过位置进行的,如果函数的个数比较多的情况下,我们很有可能会搞不清楚参数的位置,这个时候通过命名参数,就能很好的解决
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,此时会要求接收变量的个数与返回值的个数一样才行。