参数类型说明
补充:
def fun0(a,b,c) -> int:#意思是返回值为int类型
pass
匿名函数
认识匿名函数:看案例:
def fun():
return lambda x,y,z:x+y+z
#fun()(1,2,3):后面的(1,2,3)就对应于lambda的x,y,z
print(fun()(1,2,3)) #6
高阶函数
1.高阶函数:实参高阶和返回值高阶函数
-
实参高阶:参数是函数的函数
-
返回值高阶函数:返回值是函数的函数
2.函数参数的确定数据
- x可以任何数据
def fun1(x):
return x
- x可以传整数、浮点数、布尔、列表、字符串、元组
def fun2(x):
return x*2
- x可以传列表、字符串、元组、字典
def fun3(x):
return x[2]
- x可以传函数名:可以接受不带实参的函数
def fun4(x):
return x()
- x可以传函数名:可以接受带2个实参的函数
def t(a,b):
return a+b
def fun5(x):
return x(1,2)+12
fun5(t)
常见的实参高阶函数
1.max,min,sorted(sort)
注意:函数的参数如果是函数,提供实参方式有两种: 1.直接使用匿名函数2. 使用普通函数的函数名
- max:直接比较序列中元素的大小求最大值
- 语法:max(序列,key = 函数)根据函数指定的比较规则比较序列中元素的大小获取最大值
- 要求:有且只有一个参数(代表序列中的每个元素)
- 要求:需要一个返回值(返回值代表比较对象:将参数看成序列中的元素, 返回值对应的位置描述清楚比较对象和元素)
案例:求个位数最大的值
def fun(x):
return x%10
A = [12,23,43,21,543,645,75,18,78]
# 求个位数最大的值
print(max(A,key=lambda x1:x1%10))
print(max(A,key=fun))
案例:求students中分数最高的学生
students = [
{'name': '小明', 'age': 19, 'score': 73},
{'name': '小红', 'age': 22, 'score': 99},
{'name': '小花', 'age': 32, 'score': 80},
{'name': '张三', 'age': 20, 'score': 77}
]
print(max(students,key=lambda scores :scores['score']))
案例:按照年龄的大小对students中元素从小到大排序
print(sorted(students,key = lambda item:item['age']))
案例:将names中所有的元素按照每个名字的长度从大到小排序
students = ['秦时明月','秦时明月之君临天下','秦时明月之xxx','完美世界9']
print(sorted(students,key=lambda item:-len(item)))#根据长度来排序
#['秦时明月之君临天下', '秦时明月之xxx', '完美世界9', '秦时明月']
2.map
map语法:
- map(函数,序列1)
- 有且只有1个参数(代表序列中的每个元素)
- 有一个返回值(就是序列中的元素)
案例:将所有元素乘以2
resu = list(map(lambda item:item*2,[1,2,3,4,5]))
print(resu)
#[2, 4, 6, 8, 10]
- map(函数,序列1,序列2)
- 有且只有2个参数(代表两个序列中的每个元素)
案例:计算三个学生的成绩
s1 = [89,98,98]
s2 = [89,98,94]
re = list(map(lambda x,y:x+y,s1,s2))
print(re) #[178, 196, 192]
- map(函数,序列1,序列2,序列3)
- 有且只有3个参数(代表三个序列中的每个元素)
案例:根据提供的学生信息,创建学生字典
names = ['张三', '李四', '王五', '小明']
genders = ['男', '女', '男', '男']
tels = ['1110', '12091', '27181', '18231']
def fun(x,y,z):
return {'name': x, 'genser': y, 'tel': z}
print(list(map(fun,names,genders,tels)))
# [{'name': '张三', 'gender':'男', 'tel': '1110'}, ....]
练习1:根据两列表创建字典
keys = ['name', 'age', 'gender', 'tel']
values = ['小明', 18, '男', '110']
print(dict(map(lambda x,y:{x,y},keys,values)))
# 输出:{'name': '小明', 'age': 18, ...}
练习2:使用map函数将nums中所有的偶数除以2,所有的奇数乘以2
nums = [1, 4, 5, 7, 8]
re = map(lambda x:(x*2 if x%2!=0 else x//2),nums)
print(list(re)) # [2, 2, 10, 14, 4]
3.reduce:将序列中所有的元素合并成一个数据
语法:
- reduce(函数,序列,初始值):将序 列中的元素按照函数制定的规则合并成一个数据
函数的要求:
- 有且只有两个参数(第一个参数指向初始值,第二个参数代表序列中的每个元素)
- 有一个返回值(用来描述合并规则)
案例:使用reduce求和
nums = [i for i in range(20)]
print(reduce(lambda x,y:x+y,nums))#190
案例:将nums中所有元素合并成一个数字
nums = [12, 30, 89, 76, 55]
print(reduce(lambda x,y:str(x)+str(y),nums))# 1230897655
迭代器
iter:容器型数据类型
特点:
- 作为容器打印时无法显示元素,无法通过len()获取迭代器中元素的个数
- 如果要使用迭代器中元素必须将元素从迭代器中取出来,而且一旦取出就无法再放回去。
怎么创建:
- 将其他序列转化为迭代器
- 创建生成器
怎么获取迭代器中元素:
注意:不管以什么样的方式获取到了迭代器中的元素,对应的元素- 定会从迭代器中消失
-
查单个: next(迭代器)
iter1 = iter('hello') print(next(iter1),end=',') print(next(iter1),end=',') print(next(iter1),end=',')
-
遍历
iter1 = iter('hello') for i in iter1: print(i)
生成器
容器型数据类型(生成器作为容器不具备同时保存多个数据的能力,具备的是创建多个数据的能力)
- 打印生成器也无法查看生成器中的元素
- 生成器无法统计个数
- 获取生成器中的元素,也是取一个就少一个
- 生成器获取元素的方式和迭代器一样
案例:
def fun(x,y):
yield x,y
print(list(fun(2, 3)))# [(2, 3)]
print(next(fun(23,32)))# (23, 32)
案例:
def fun1():
print('----_1_----')
yield 100
print('----_2_----')
yield 200
print('----_3_----')
yield 300
re = fun1()
print(next(re))
# ----_1_----
# 100
print(next(re))
# ----_2_----
# 200