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;局部变量:在函数内定义,在函数内生效。

更多推荐