python学习系列13——函数
(一)函数的定义
代码:
1 def my_max(x, y) : 2 # 定义一个变量z,该变量等于x、y中较大的值 3 z = x if x > y else y 4 # 返回变量z的值 5 return z 6 7 # 定义一个函数,声明一个形参 8 def say_hi(name) : 9 print("===正在执行say_hi()函数===") 10 return name + ",您好!"
(二)函数的调用
代码:
1 a = 6 2 b = 9 3 # 调用my_max()函数,将函数返回值赋值给result变量 4 result = my_max(a , b) # ① 5 print("result:", result) 6 # 调用say_hi()函数,直接输出函数的返回值 7 print(say_hi("孙悟空")) # ②
结果:
result: 9
===正在执行say_hi()函数===
孙悟空,您好!
(三)值传递和引用传递
Python中,根据实际参数的类型不同,函数参数的传递方式可分为 2 种,分别为值传递和引用(地址)传递:
值传递:适用于实参类型为不可变类型(字符串、数字、元组);
引用(地址)传递:适用于实参类型为可变类型(列表,字典);
值传递和引用传递的区别是,函数参数进行值传递后,若形参的值发生改变,不会影响实参的值;而函数参数继续引用传递后,改变形参的值,实参的值也会一同改变。
代码:
1 def demo(obj) : 2 obj += obj 3 print("形参值为:",obj) 4 print("-------值传递-----") 5 a = "C语言中文网" 6 print("a的值为:",a) 7 demo(a) 8 print("实参值为:",a) 9 print("-----引用传递-----") 10 a = [1,2,3] 11 print("a的值为:",a) 12 demo(a) 13 print("实参值为:",a)
结果:
-------值传递----- a的值为: C语言中文网 形参值为: C语言中文网C语言中文网 实参值为: C语言中文网 -----引用传递----- a的值为: [1, 2, 3] 形参值为: [1, 2, 3, 1, 2, 3] 实参值为: [1, 2, 3, 1, 2, 3]
(四)参数
(1)位置参数
在调用函数,指定的实际参数的数量,必须和形式参数的数量一致(传多传少都不行)。
(2)关键字参数
关键字参数是指使用形式参数的名字来确定输入的参数值。
代码:
1 # 定义一个函数 2 def girth(width , height): 3 print("width: ", width) 4 print("height: ", height) 5 return 2 * (width + height) 6 # 传统调用函数的方式,根据位置传入参数 7 print(girth(3.5, 4.8)) 8 # 根据关键字参数来传入参数 9 print(girth(width = 3.5, height = 4.8)) 10 # 使用关键字参数时可交换位置 11 print(girth(height = 4.8, width = 3.5)) 12 # 部分使用关键字参数,部分使用位置参数 13 # 位置参数必须放在关键字参数之前 14 print(girth(3.5, height = 4.8))
(3)默认参数
python允许为参数设置默认值,即在定义函数时,直接给形式参数指定一个默认值。
代码:
1 # 为两个参数指定默认值 2 def say_hi(name = "孙悟空", message = "欢迎来到C语言中文网"): 3 print(name, ", 您好") 4 print("消息是:", message) 5 # 全部使用默认参数 6 say_hi() 7 # 只有message参数使用默认值 8 say_hi("白骨精") 9 # 两个参数都不使用默认值 10 say_hi("白骨精", "欢迎学习Python") 11 # 只有name参数使用默认值 12 say_hi(message = "欢迎学习Python")
结果:
孙悟空 , 您好
消息是: 欢迎来到C语言中文网
白骨精 , 您好
消息是: 欢迎来到C语言中文网
白骨精 , 您好
消息是: 欢迎学习Python
孙悟空 , 您好
消息是: 欢迎学习Python
(五)逆向参数传递
所谓逆向参数收集,指的是在程序己有列表、元组、字典等对象的前提下,把它们的元素“拆开”后传给函数的参数。逆向参数收集需要在传入的列表、元组参数之前添加一个星号,在字典参数之前添加两个星号。
代码:
1 def test(name, message): 2 print("用户是: ", name) 3 print("欢迎消息: ", message) 4 my_list = ['小明', '欢迎来C语言中文网'] 5 test(*my_list)
结果:
用户是: 小明
欢迎消息: 欢迎来C语言中文网
(六)函数返回多个值
代码:
1 def sum_and_avg(list): 2 sum = 0 3 count = 0 4 for e in list: 5 # 如果元素e是数值 6 if isinstance(e, int) or isinstance(e, float): 7 count += 1 8 sum += e 9 return sum, sum / count 10 11 12 my_list = [20, 15, 2.8, 'a', 35, 5.9, -1.8] 13 14 # 获取sum_and_avg函数返回的多个值,多个返回值被封装成元组 15 tp = sum_and_avg(my_list) # ① 16 print(tp) 17 18 # 使用序列解包来获取多个返回值 19 s, avg = sum_and_avg(my_list) # ② 20 print(s) 21 print(avg)
结果:
(76.9, 12.816666666666668)
76.9
12.816666666666668

浙公网安备 33010602011771号