day_11_函数进阶
1.函数作为变量
python中声明函数其实就是声明一个类型是function的变量,函数名就是变量名
普通变量能做的事情函数都可以做
1-1 一个变量可以给另一个变量赋值
将函数名作为变量,给另一个变量赋值
1-2 一个变量作为容器的元素
1-3 变量可以作为函数的参数
函数作为函数的参数(实参高阶参数)
应用:sort函数;sorted();max();min()函数中key参数
序列.t函数有个参数key,这个参数要求传一个函数,并且函数有一个参数和一个返回值
参数就是序列中的元素,返回值就是排序比较的对象
例子
all_message =[
('stu_1','py19020011'),
('stu_2','py19020042'),
('stu_3','py19020023')
]
# all_message.sort(key= lambda x: x[1] ,reverse= True) # 学号从大到小
# all_message.sort(key= lambda x: x[1][-1] ,reverse= True) # 学号最后一位从大到小
# print(all_message)
1-4.变量作为函数的返回值
将一个函数作为函数的返回值(返回值高阶函数)
def func1():
def temp(*nums):
return sum(nums)
return temp
print(func1()(1,3,5,9))
迭代器/生成器
1.什么是迭代器(iter)
迭代器是容器型数据类型(可以同时存储多个数据),但是想要获取/查看迭代器中元素的值,只能将元素取出来。
取出来的元素在迭代器中就不存在了,取得时候只能从前往后一个一个的取,不能跳着取。
2.迭代器中的元素
迭代器的元素只能通过类型转换,将其他容器转换成迭代器;或者通过生成器去生成。
2-1 转换 - 所有序列都可以转换成迭代器。迭代器中的元素可以是任何类型的数据
3.获取迭代器中的元素 --> 迭代器获取元素,不管以什么样的方式获取,获取后,这个元素在迭代器中就不存在了
3-1 next(迭代器) - 获取迭代器顶部数据(最上面的数据)
next(iter),next.next()
3-2 遍历获取每个元素
4.什么是生成器
4-1 生成器就是迭代器,迭代器不一定是生成器
调用一个带有yield关键字的函数就能得到一个生成器。(yield 只能出现在函数体当中)
4-2 生成器的元素
生成器获取元素的方式和迭代器一样:next()和循环遍历
生成器元素的个数:看执行完生成器对应的函数会遇到几次yield
4-3 元素的值:看yield后面的结果
4-4 生成器产生数据的原理
当获取生成器的元素,会执行生成器对应的函数,从开始执行到yield为止,将yield后的数据作为元素返回,并且记录结束位置。记录目的是下次获取元素的时候从上次结束的位置接着往后执行,直到遇到yield,将yield后面的数据作为元素返回并且记录结束位置:以此类推,如果next方法在开始执行到函数结束未遇到yield,那么就获取不到元素,报错。
5.生成式
生成式本质还是生成器,知识写法更简洁
5-1 生成式的写法
# 语法1
(表达式 for 变量 in 序列)
# 展开
def func():
for 变量 in 序列:
yield 表达式
gen = func()
# 一句话实现交换一个字典的key和value
dict1 = dict1((value,key) for key,value in dict1.item())
# 语法2
(表达式 for 变量 in 序列 if 条件语句)
# 展开
def func():
for 变量 in 序列:
if 条件语句:
yield 表达式
gen = func()
说明
() --> 固定写法
表达式 --> 除了赋值语句意外的任何语句,比如:数据、赋值过的变量、运算表达式、函数调用表达式等,这个表达式一般都和后面的变量有联系
补充:python三目运算符
值1 if 条件语句 else 值2