昨日内容复习
迭代器和生成器
迭代器:
1 双下方法:很少调用的方法,是通过其他方法触发
2 可迭代的——可迭代协议,含有__inter__方法且可以被for循环
3 判断是否可迭代
print(‘inter’ in dir(数据))
4 迭代器协议:
含有__inter__和__next__方法
5迭代器与可迭代的方法:
迭代器一定可迭代,可迭代不一定是迭代器,可迭代可以通过调用iter()方法就能得到一个迭代器
6迭代器的特点:
方便使用,且只能取所有的数据(从头到尾取一次)
节省内存空间,只关心当前数据状态和下一个数据的状态,其他的数据没有在内存真正的生成
生成器
本质:迭代器
生成器的表现形式:
生成器函数:
含有yield的关键字的函数,就是生成器函数
特点
调用函数的时候函数不执行,返回生成器。
每次调用next方法的时候会取到一个值,直到取完最后一个再执行会保存
今日
生成器函数进阶
send的获取下一个值使用效果和next基本一样,只不过获取下一个值的时候给上一个yield传递了数据
send注意事项
第一次使用生成器的时候是用next获取下一个值
最后一个yield不能接收外部的值
def generator():
print(1)
content = yield 'a'
print('=====', content)
print(2)
yield 'b'
g = generator()
ret = g.__next__()
print(ret)
res = g.send('hello')
print('***', res)
例子:获取移动平均值
def average():
sum = 0
count = 0
avg = 0
while 1:
num = yield avg
sum += num
count += 1
avg = sum/count
avg_g = average()
avg_g.__next__()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)
装饰器函数实现上面例子
def init(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
result.__next__()
return result
return inner
@init
def average():
sum = 0
count = 0
avg = 0
while 1:
num = yield avg
sum += num
count += 1
avg = sum/count
avg_g = average()
avg1 = avg_g.send(10)
avg1 = avg_g.send(20)
print(avg1)
yield from 可以从一个容量中取到所有值
def generator():
a = 'abcdef'
b = '12345'
yield from a
yield from b
g = generator()
for i in g:
print(i)
列表推导式
egg_list = ['鸡蛋%s' % i for i in range(10)]
print(egg_list)
生成器表达式
(i for i in range(10))
与列表推导式区别是括号不一样,返回值不一样
g = (i for i in range(10))
for i in g:
print(i)
各种推导式
列表表达式:
[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if元素相关的条件]
例子:取出30以内能被3所整除
ret = [ i for i in range(30) if i % 3 == 0]
print(ret)
字典推导式
将key与value对调
mcase = {'a': 10, 'b': 20}
mcase_frequency = {mcase[k]: k for k in mcase}
print(mcase_frequency)
例二 合并大小写对应的value值,将k统一成小写
ret = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
ret_frequncy = {k.lower(): ret.get(k.lower(), 0) + ret.get(k.upper(), 0)for k in ret}
print(ret_frequncy)
集合推导式
集合特点:去重
squard = {x**2 for x in [1, -1, 2]}
print(squard)