目录
一、什么是函数
函数是组织好的,可重复使用的,用来实现单一,或者相关联功能的代码段
python有许多内建函数,用户也可以自定义函数
二、定义函数的语法
1) 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
-
名字最好能体现函数的功能,一般用小写字母和单下划线、数字等组合
-
避免与内置函数重名(内置函数不需要定义即可直接使用)
2) 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数
- 根据函数功能,括号里可以有多个参数,也可以不带参数,命名规则与函数名相同
3) 函数的第一行语句可以选择性地使用文档字符串,用于存放函数说明。
4)函数内容以冒号 “: ”起始,并且缩进。
5)return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None
定义一个比较数据大小的函数
def max(a, b):
if a > b:
return a
else:
return b
print(max(4, 5))
>>>5
a = 4
b = 5
print(max(a, b))
>>>5
三、函数的调用方法
3.1 基本用法
1)函数名(位置参数)
直接使用参数(位置参数):输入函数名及参数所对应的值,注意此时需要注意需要按照顺序调用参数,如上面的 max(a,b);
2)函数名(关键字形参)
使用关键字调用参数,此时允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值,例:
def max(a, b):
if a > b:
return a
else:
return b
print(max(a=5, b=4))
print(max(b=4, a=5))
>>>5
>>>5
3)return 语句
用于退出函数,选择性地向调用方返回一个表达式。不带参数值的 return 语句返回 None。
4)强制位置参数
Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。
在以下的例子中,形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 和 f 要求为关键字形参:
def f(a, b, /, c, d, *, e, f): #“/”前的必须使用位置参数“*”后的必须使用形参
print(a, b, c, d, e, f)
正确用法
f(10, 20, 30, d=40, e=50, f=60)
错误用法
f(10, b=20, c=30, d=40, e=50, f=60) # b 不能使用关键字参数的形式
f(10, 20, 30, 40, 50, f=60) # e 必须使用关键字参数的形式
3.2 同时返回多个结果
当一个函数同时返回多个结果时,此时获得的是一个元组,可以通过调用元组中特定数据的方法调取想要的数据;
3.3 多个变量接收函数返回的多个值
通过使用python提供的序列解包功能,直接使用多个变量接收函数返回的多个值,如
A,B,C = max(a,b)
3.4 多参数输入(不定长)
当参数数量不确定时,可以使用“*参数名”定义不定长参数,加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数,如:
def printinfo( arg1, *vartuple ):
# "打印任何传入的参数"
print (arg1)
print (vartuple)
# 调用printinfo 函数
printinfo( 70, 60, 50 )
>>>70 #第一个参数默认给arg1
>>>(60,50) #后面两个参数以元组形式储存给vartuple
加了两个星号 ** 的参数会以字典的形式导入,如:
def printinfo( arg1, **vardict ):
"打印任何传入的参数"
print ("输出: ")
print (arg1)
print (vardict)
# 调用printinfo 函数
printinfo(1, a=2,b=3)
>>>
输出:
1
{'a': 2, 'b': 3}
3.5 变量作用域
变量作用域指的是变量作用的范围
全局变量:被定义之后的在任何地方都可以被使用,一般在函数外被赋值;
局部变量:在函数内部被定义的变量(如上方所示的a,b),只能在函数内部使用
global()函数:将局部变量声明为全局变量,用法:
rent = 3000
def cost():
global variable_cost
#将在cost()函数中定义的variable_cost变量定义为全局变量
utilities = int(input('请输入本月的水电费用'))
food_cost = int(input('请输入本月的食材费用'))
variable_cost = utilities + food_cost
print('本月的变动成本是' + str(variable_cost))
def sum_cost():
sum = rent + variable_cost
#在cost()函数中定义的variable_cost变量可以在sum_cost()函数中使用
print('本月的总成本是' + str(sum))
cost()
sum_cost()
3.6 函数的嵌套
被嵌套的函数的返回值参与到嵌套的函数中,如:
rent = 3000
def cost():
utilities = int(input('请输入本月的水电费用'))
food_cost = int(input('请输入本月的食材费用'))
variable_cost = utilities + food_cost
print('本月的变动成本是' + str(variable_cost))
return variable_cost
def sum_cost():
sum = rent + cost() #sum_cost()嵌套了cost()的结果
print('本月的总成本是' + str(sum))
sum_cost()
#输出结果为:sum = rent + variable_cost
四、匿名函数
4.1 匿名函数特点:
小型:函数通常只包含一行代码,这使得它们适用于编写简单的函数(可以具有任意数量的参数,但只能有一个表达式),这也意味着匿名函数占用内存小,计算快
匿名:普通函数不同,没有名称,只能通过赋值给变量或作为参数传递给其他函数来使用
4.2 匿名函数用法
创建方法:lambda语句,基本语法如下
lambda agruments:expression
#lambda 创建匿名函数的语句
#agruments 参数,可以是多个,也可以没有
#expression 函数表达式,只能有一个
实例:
无参数的lambda函数
f = lambda: "Hello, world!"
print(f()) # 输出: Hello, world!
>>>Hello, world!
单参数及多参数的lambda函数
x = lambda a : a + 10
print(x(5))
>>>15
x = lambda a, b : a * b
print(x(5, 6))
>>>30
lambda函数与map()函数结合,对列表元素进行批量函数运算,形成新列表
number = [1,2,3,4,5,6]
squared = list(map(lambda x:x**2,number))
print(squared)
>>>[1, 4, 9, 16, 25, 36]
lambda函数与filter()函数结合,对列表元素进行筛选,形成新列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)
>>>[2, 4, 6, 8]
lambda函数与reduce()函数结合,对列表元素进行持续计算(累加、累积、或其他特定函数持续运算等),得出结果
from functools import reduce #使用reduce前需要从functools调用
number = [1,2,3,4,5,6]
sum1 = reduce(lambda x,y:x+y,number) #累加
multiply1 = reduce(lambda x,y:x*y,number) #累乘
num1 = reduce(lambda x,y:x*y+1,number) #((((1*2+1)*3+1)*4+1)*5+1)*6+1
print(sum1)
print(multiply1)
print(num1)
>>>
21
720
1237