18.函数进阶

函数的多返回值

# 两个return测试,只输出第一个return,原因是return可以退出当前函数,导致return下方的代码不执行
def test_return():
    return 1
    return 2
print(test_return())
1
# 函数多返回值写法
def test_return():
    return 1, "hello", True

x, y, z = test_return()
print(x)
print(y)
print(z)
1
hello
True

函数的位置参数

位置参数:调用函数时根据函数定义的参数位置来传递参数

注意:传递的参数和定义的参数的顺序及个数必须一致

def user_into(name, age, gender):
    print(f"用户信息名字:{name},年龄是:{age},性别是:{gender}")
user_into("tang", 18, "男")
用户信息名字:tang,年龄是:18,性别是:男

关键字参数

关键字参数:函数调用时通过"键=值"形式传递参数

作用:可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求

注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序

def user_into(name, age, gender):
    print(f"用户信息名字:{name},年龄是:{age},性别是:{gender}")

# 关键字传参
user_into(name="tang", age=18, gender="男")

# 可以不按照固定顺序
user_into(age=18, gender="男", name="tang")

# 可以和位置参数混用,位置参数必须在前,且匹配参数顺序
user_into("tang", gender="男", age=18)
用户信息名字:tang,年龄是:18,性别是:男
用户信息名字:tang,年龄是:18,性别是:男
用户信息名字:tang,年龄是:18,性别是:男

缺省参数

  • 缺省参数(默认值) 缺省参数必须放到最后面
def user_into(name, age, gender="男"):
    print(f"用户信息名字:{name},年龄是:{age},性别是:{gender}")

user_into(name="tang", age=18)

user_into("tang", age=18)

user_into("tt", age=18, gender="女")
用户信息名字:tang,年龄是:18,性别是:男
用户信息名字:tang,年龄是:18,性别是:男
用户信息名字:tt,年龄是:18,性别是:女

不定长参数

不定长参数:不定长参数也叫可变参数,用于不确定调用的时候会传递多少个参数(不传参也可以)的场景

作用:当调用函数时不确定参数个数时,可以使用不定长参数

不定长参数的类型:

  • 位置传递
  • 关键字传递
  • 位置传递

注意:传进的所有参数都会被变量收集,它会根据传进参数的位置合并为一个元组(tuple),变量是元组类型,这就是位置传递

def user_into(*args):
    print(args)

user_into("tang", 18)
user_into("tang", 18, "男")
('tang', 18)
('tang', 18, '男')
  • 关键字传递

注意:参数是"键=值"形式的情况下,所有的"键=值"都会被变量接受,同时会根据"键=值"组成字典

def user_into(**kwargs):
    print(kwargs)

user_into(name="tang", age=18, gender="男")
{'name': 'tang', 'age': 18, 'gender': '男'}

函数作为参数传递

函数本身也可以作为参数传入另一个函数

def test_func(compute):
    result = compute(1, 2)
    print(result)

def compute(x, y):
    return x + y

test_func(compute)
3

函数compute,作为参数,传入了test_func函数中使用

  • test_func需要一个函数作为参数传入,这个函数需要接收2个数字进行计算,计算逻辑由这个被传入函数决定
  • compute函数接收2个数字对其进行计算,compute函数作为参数,传递给了test_func函数使用
  • 最终,在test_func函数内部,由传入的compute函数,完成了对数字的计算操作

所以,这是一种计算逻辑的传递,而非数据的传递,不仅仅是加、减、乘、除等任何逻辑都可以自行定义并作为函数传入

lambda 匿名函数

函数定义中:

  • def 关键字,可以定义带有名称的函数
  • lambda 关键字,可以定义匿名函数(无名称)

有名称的函数,可以基于名称重复使用

无名称的匿名函数,只可临时使用一次

匿名函数定义语法:

lambda 传入参数:函数体(一行代码)

  • lambda 是关键字,表示定义匿名函数
  • 传入参数表示匿名函数的形式参数,如:x,y表示接收2个形式参数
  • 函数体,就是函数的执行逻辑,要注意:只能写一行代码,无法写多行代码
def test_func(compute):
    result = compute(1, 2)
    print(result)

test_func(lambda x, y : x + y)
3