一、函数的定义
变量名要先声明才能使用变量,同样函数必须先定义才能被调用。
def 函数名(参数): 函数体代码def:关键字必须函数名:字母+下划线组合参数:需要向函数传入的使用的参数函数体代码:正常书写的代码逻辑
基本函数定义与调用
def login(): print(f"欢迎来到登陆功能!")# 调用函数# 函数名() login()
有一个参数但是没有返回值的函数
def login(username): print(f"欢迎{username}来到登陆功能!")# 调用函数# 函数名(传入值)login("dream") #欢迎dream来到登陆功能!
有多个参数但是没有返回值的函数
def add(x, y): result = x + y print(f"当前加法的结果是 {result}")# 函数调用的时候,有几个参数就必须传几个参数add(1,2) #当前加法的结果是 3
有参数有返回值的函数
def add(x, y): result = x + y print(f"当前计算的结果是 {result}") return resultresult = add(1,6) #当前计算的结果是 7print(result) # 7
二、函数调用
直接调用:直接根据函数名调用函数。
间接调用:用新的变量名来存储原本函数的内存空间地址,然后再调用原本的函数。
def add(x, y): return x * yprint(add) # <function add at 0x000001EB1F4D2710># 可以将函数名赋值给其他变量名res = addprint(res(5,6)) #30
表达式调用
在函数的返回值中,如果一个返回值就是一个值进行返回。如果多个返回值,那么返回的结果是一个元祖,然后进行解包赋值。
函数的返回值就是函数体代码执行完毕后最后一行代码的值,函数的返回值可以被其他变量接收,函数的返回值可以被其他函数接收。
def get_username_password(): username = input("请输入用户名 :>>>> ").strip() password = input("请输入密码 :>>>> ").strip() return username, passworddef login(username, password): if username == "dream" and password == "521": print(f"登陆成功") else: print(f"登陆失败")#输入:dream,521username, password = get_username_password() login(username, password) #登录成功
在调用一个函数的同时调用另一个函数,获取到返回值并将其作为参数传入。
login(get_username_password()[0], get_username_password()[1])
在函数定义阶段定义在函数名后面的小括号里面的变量名就是函数的参数。
形参
形参就是在定义函数的时候放在函数名后面的参数,它可以让函数在内部使用上面定义好的形参。
实参
在函数调用的时候实际传入的值就是实参。
def add(x,y): # 在函数add后面的x 和 y 就是函数的形参 return x + yadd(1,2) #在调用函数add的时候会传入 1 和 2,传入的值就是函数的实参
四、函数参数的传递方式
def login(username, password): print(f"当前 username :>>>> {username}") print(f"当前 password :>>>> {password}")
①、按照位置传递参数
函数调用的时候,要按照函数定义的参数位置传递指定的参数,如果位置不对就会导致数据错乱。
②、按照关键字传递参数
函数定义的时候指定了当前函数的参数名是什么,在函数调用的时候就可以按照指定的变量名进行传递。
login(username="dream", password="521")login(password="521", username="dream")
③、在函数传递参数的时候,如果传少了就会报错,需要指定个数但是没有传够个数;如果传多了也会报错,需要指定个数但是传多了。
④、关键字和位置参数混合使用
当你的关键字参数和位置参数混合使用的时候,关键字参数必须放在位置参数后面否则就会报错。
def login(username, password): print(f"当前 username :>>>> {username}") print(f"当前 password :>>>> {password}")# login("dream",password="521") # 正确login(password="521","dream") # 报错
五、默认参数
在函数定义阶段,可以给指定的变量赋值一个初始的值。如果当前值被传入新的值则会被新值覆盖,如果当前值没有传入新的值则会使用原本就存在的默认值。在定义默认参数的时候,一定是默认参数放在位置参数后面。
def student(name, age, class_no, gender="male"): print(f"当前学生是 :{name} 当前年龄是 {age} 当前性别是 {gender} 当前班级是 {class_no}")
调用:
student(name="hope", age=18, gender="male", class_no=1)student(name="pop", age=18, class_no=1)
六、可变长参数
当我们调用函数的时候,会向函数内传递参数,遇到传递的参数个数大于需要的位置参数的个数。
可变长位置参数:
def add(x, y, *args): print(x, y) # 1 2 print(args) # (3, 4)add(1, 2, 3, 4) # *是解包的意思num_list = [1, 2, 3]print(num_list) # [1, 2, 3]print(*num_list) # 1 2 3# 解包的例子def login(username, password): print(username) print(password)user_data = ["dream", 521]login(*user_data)# dream# 521
可变长关键字参数:
def add(x, y, *args, **kwargs): print(x, y) print(args) print(kwargs)add(x=1, y=2, z=3, u=5)# 1 2# ()# {'z': 3, 'u': 5}
七、命名关键字参数
想要限定函数的调用者必须以key=value的形式传值,在Python3中提供了专门的语法:在定义形参时,用 * 作为一个分隔符号,* 号之后的形参称为命名关键字参数。
对于这类参数,在函数调用时,必须按照key=value的形式为其传值,且必须被传值。
def add(x, y, z=6, *args, **kwargs): return x + y# 定义在 add 后面的x 和 y 就是形形参 z 就是默认参数# 可变长位置参数 *args# 可变长关键字参数 **kwargsdef add(x,y,*,z): print(z)add(1,2,z=9)
# sex,height为命名关键字参数def register(name, age, *, sex, height): pass# 正确使用register('Dream', 18, sex='male', height='1.8m')# TypeError:未使用关键字的形式为sex和height传值register('Dream', 18, 'male', '1.8m')# TypeError没有为命名关键字参数height传值。register('Dream', 18, height='1.8m')
命令关键字参数可以通过默认值,进行简化:
def register(name, age, *, sex='male', height): print('Name:%s,Age:%s,Sex:%s,Height:%s' % (name, age, sex, height))register('Dream', 18, height='1.8m')# Name:Dream,Age:18,Sex:male,Height:1.8m
如果形参中已经有一个*args了,命名关键字参数就不再需要一个单独的 * 作为分隔符号了。
def register(name, age, *args, sex='male', height): print('Name:%s,Age:%s,Args:%s,Sex:%s,Height:%s' % (name, age, args, sex, height))# sex与height仍为命名关键字参数register('Dream', 18, 1, 2, 3, height='1.8m')# Name:Dream,Age:18,Args:(1, 2, 3),Sex:male,Height:1.8m