Python函数基础
1.什么是函数
函数就是一段可以重复使用的代码,给它起个名字,需要时调用就可以使用,无需反复编写冗余代码。
2.函数定义和调用
2.1 定义
函数定义:使用关键字def
def 函数名(参数列表): # 参数变量可选择,可以不写
函数体
return 返回值 # return 返回值也是可选择的
例如:
def greet():
print("你好,python!")
2.2 调用
函数调用:函数名()
例如上面定义的greet函数,调用:
greet()
运行结果:
3.函数参数
3.1 形参和实参
形参:写在def 函数名(形参),只是一个占位符,代表“这里将要放一个数据”,没有实际值。
实参:调用函数时,真正传进去的值,就是实参。
例如:
def greet(name):
print(f"{name},你好呀")
greet("张三")
运行结果:
实参“张三”传递给形参name
3.2 形参的四种类型
3.2.1 位置参数
位置参数:按顺序传、必须传、不能少的参数。
调用函数时,实参传入的顺序、个数必须和形参完全一致。
例如:
# 制作咖啡
def make_coffee(coffee_type, size, suger):
print(f"制作一杯{size}的{coffee_type},加{suger}勺糖")
# 按位置传入实参,与形参一一对应
make_coffee("冰美式", "中杯", 5)
运行结果:
3.2.2 默认参数
默认参数:函数定义时给形参指定默认值,调用时实参可以省略该参数。传入了实参就用实参,没传就使用默认值。
例如:
# 定义泡茶函数:两个参数都设置了默认值
# tea_type 默认是红茶,suger 默认甜度是1
def make_tea(tea_type="红茶", suger=1):
print(f"泡一杯{tea_type},甜度为{suger}")
# 不传任何实参,全部使用默认参数
make_tea()
# 只传第一个位置参数,修改茶的种类,甜度使用默认值
make_tea("茉莉花")
# 传入两个位置参数,同时修改茶的种类和甜度
make_tea("绿茶", 2)
运行结果:
注意:非默认参数必须放在默认参数前面。如果把默认参数写在前面,程序无法分辨你传入的值是给默认参数还是非默认参数,就会直接报错。
例如:
def make_tea(suger, tea_type="红茶"):
print(f"泡一杯{tea_type},甜度为{suger}")
make_tea(1)
make_tea(2,"绿茶")
运行结果:
3.2.3 可变参数
可变参数:接收任意数量的位置参数,Python 会自动把它们打包成一个元组。
定义:*args。形参前加 * 表示该参数为可变位置参数,args参数名。
例如:
#定义一个求和函数
def get_sum(*args):
result = 0
# 遍历 args 元组中的所有数字
for i in args:
result += i
print(result)
get_sum(1,2)
get_sum(2,5,8)
运行结果:
3.2.4 关键字可变参数
关键字可变参数:接收任意数量的“键=值”形式的参数,自动打包成字典。
定义:**kwargs。形参前加 ** 表示该参数为可变关键字参数 ,kwargs参数名。
例如:
# 创建用户信息函数
# username:必传位置参数
# **kwargs:关键字可变参数,接收任意多个键值对,自动打包成字典
def creat_user(username, **kwargs):
print(f"用户名:{username}")
# 遍历字典,打印键值对
for i in kwargs.items():
print(i[0],i[1],sep=":")
# 只传用户名,不传额外信息
creat_user("张三")
print("=======") # 间隔两次调用对比结果
# 传用户名和性别、年龄两个关键字参数
creat_user("张三", sex="男", age=18)
注意: 关键字参数的名字不带引号!在函数内部,会自动把 sex 变成字典的键 ‘sex’。
运行结果:
4.return返回值
4.1 return的作用
return 会返回结果,调用者可以接收这个结果并做后续处理;同时 return 会终止函数执行,函数执行到 return 时立即停止,后面的代码不再执行。
例如:
def add(a, b):
print("---")
return a+b
print("***")
res = add(1,2)
print(res)
运行结果:
4.2 return三种返回情况
4.2.1 无返回值(None)
函数只执行操作(如打印,修改全局变量),不需要返回结果。
例如:
def greet():
print("你好,python!")
# 只写return或不写是一样的效果,都会默认返回 None
return
# 调用函数,接收函数的返回值(这里函数没有返回有效数据)
res = greet()
# 打印接收的结果 和 结果的类型
# 结果是 None,类型是 NoneType
print(res, type(res))
运行结果:
4.2.2 返回单个值
函数用 return 后面只跟一个数据,调用后可以用变量接住这个结果。
例如:
def greet():
print("你好呀!")
# 返回单个字符串值:张三
return "张三"
# return 将返回值 "张三" 交给 greet()
# res 接收 greet() 的返回值,即 res = "张三"
res = greet()
# 打印res-->张三
print(res)
运行结果:
4.2.3 返回多个值
实际返回元组,值与值之间逗号隔开。
例如:
def greet():
print("你好呀!")
# 返回多个值
return "张三", "男", 18
res = greet()
# 打印是元组
print(res)
运行结果:

return 返回多个值调用时可以用多个变量同时接收,一一对应,这就叫解包。
例如:
def calculate(a, b):
sum_ = a + b
mul_ = a * b
return sum_,mul_
# 不解包,用一个变量接收(得到元组)
result = calculate(5, 4)
print(result)
print("------")
# 解包,多个变量对应多个返回值
sum1, mul1 = calculate(4, 6)
print(sum1)
print(mul1)
运行结果:
5.全局变量和局部变量
5.1 定义
5.1.1 全局变量:在函数外面定义,整个程序都能用。
例如:
# 全局变量
pi = 3.14
def area(radius):
return pi*radius**2
res = area(2)
print(res)
# 打印全局变量
print(pi)
运行结果:
5.1.2 局部变量:在函数内部定义的变量,只能在函数内生效,函数执行完后就失效,外部无法访问。
例如:
def calc_tax(income):
# 局部变量
tax_rate = 0.2
return income * tax_rate
result = calc_tax(1000)
print(result)
# 打印局部变量报错
print(tax_rate)
运行结果:
正确代码:
def calc_tax(income):
tax_rate = 0.2
return income * tax_rate
result = calc_tax(1000)
print(result)
运行结果:
5.2 修改全局变量
使用global关键字
例如:不修改全局变量
discount = 0.1
def update():
discount = 0.5
print(f"函数内部折扣:{discount}")
update()
print(f"函数外部折扣:{discount}")
运行结果:
例如:修改全局变量
discount = 0.1
def update():
# global关键字修改discount全局变量
global discount
# 修改全局变量的值,从 0.1 改为 0.5
discount = 0.5
# 函数内部打印修改后的折扣
print(f"函数内部折扣:{discount}")
update()
# 因为函数里用global修改了,所以外部也变成 0.5
print(f"函数外部折扣:{discount}")
运行结果:
6.总结
定义:函数用def定义。def 函数名(参数):函数体 return 返回值,先定义后调用,不调用不执行。
参数:位置参数(必须传参,顺序个数相同一一对应),默认参数(实参不传使用默认值),*args(任意个数位置参数),**kwargs(任意关键字参数,键=值)
return 返回值:三种返回情况:没有返回值None,一个返回值,多个返回值(元组形式返回,解包一个个接收返回值)。终止函数,函数执行到return 后面不执行。
作用域:全局变量:定义在函数外,整个程序生效,修改用global;局部变量:在函数内定义,在函数内生效。
更多推荐
所有评论(0)