可迭代对象 迭代器 生成器 推导式 匿名函数
可迭代对象与迭代器
可迭代对象
1.可以进行循环更新的一个实实在在值。
#2.如何判断一个对象是否是可迭代对象: 利用内置函数:dir()可以查看对象内部方法
3.有__iter__方法的对象,都是可迭代对象。
4.str,list set tup 逗是可迭代对象
print('__iter__' in dir(str))#True
ps dir()函数可以获取对象所有方法
迭代器
1.可更新迭代的工具
2.在python中,内部含有'__iter__'方法并且含有'__next__'方法的对象就是迭代器。
3.迭代器可以迭代取值。利用next()进行取值(节省内存)或者转为list 元祖等等取值
4.一个next()取一个值 且会记录位置 迭代器一条路走到底,不走回头路。
5.取完了再next()会报错(StopIteration) 我们可以用try处理 万能异常(Exception)
可迭代对象转化成迭代器
利用内置函数iter()
l1=[1,2,3]
obj = iter(l1)
object.__iter__()
for循环原理与模拟
原理
内部将可迭代对象转为迭代器了
while模拟for循环
s = 'gkffdsa;lfkdsk;lafkds;laldgjfd'
obj = iter(s)
while 1:
try:
print(next(obj))
except StopIteration:
break
可迭代对象与迭代器的对比
- 可迭代对象是一个操作方法比较多,比较直观,存储数据相对少(几百万个对象,8G内存是可以承受的)的一个数据集。
- 当你侧重于对于数据可以灵活处理,并且内存空间足够,将数据集设置为可迭代对象是明确的选择。
- 是一个非常节省内存,可以记录取值位置,可以直接通过循环+next方法取值,但是不直观,操作方法比较单一的数据集。
- 当你的数据量过大,大到足以撑爆你的内存或者你以节省内存为首选因素时,将数据集设置为迭代器是一个不错的选择。
生成器
1.将return换为yield就是生成器函数
2.只要函数中出现了yield那么他就不是函数,它是生成器函数。
3.不结束函数,对应着给 next 返回值(多个值通过元组的形式返回)。 会记录位置
举例
def func():
yield 2,4,5
print(11)
yield 3
print(22)
yield 4
yield 5
ret = func() # 生成器对象
print(ret)#生成器对象
print(next(ret))#返回(2, 4, 5) 到了yield就停止后面的11不打印
print(next(ret))#返回3 第2次才打印11 到了yield就停止 后面的22 不打印
总结
yield : 对应next给next返回值
到了yield就停止后面的不打印
yield from
1.yield from 将一个可迭代对象的每一个元素返回给next
2.yield from 节省代码,提升效率(代替了for循环)
举例
def func():
l1 = [1, 2, 3]
yield from l1#就是下面的简写
'''
yield 1
yield 2
yield 3
'''
ret = func()
print(next(ret))
出错题
def eat_baozi_gen():
for i in range(1,5):
yield f'{i}号包子'
print(11)
ret1 = eat_baozi_gen()
for i in ret1:
print(i)
推导式
列表推导式
创建方式
1.循环模式: [变量(加工后的变量) for 变量 in iterable]
print([i**2 for i in range(1, 11)])
2.筛选模式: [变量(加工后的变量) for 变量 in iterable if 条件]
print([i**2 for i in range(1, 11)])
列表推导式的优缺点
优点:
1, 简单,快捷,装b。
缺点:
2. 可读性不高,不好排错。
慎用,不要入迷。
生成器推导式
生成器表达式: 小括号
与列表推导式几乎一模一样。
循环模式,筛选模式。
obj = (i for i in range(1, 11))
字典推导式
字典推导式,集合推导式: 两种模式: 循环模式,筛选模式
l1 = ['小潘', '怼怼哥','西门大官人', '小泽ml亚']
dic = {}#{0: '小潘', 1: '怼怼哥', 2: '西门大官人'}
for index in range(len(l1)):
dic[index] = l1[index]
print(dic)
使用了字典推导式
print({i:l1[i] for i in range(len(l1))})
匿名函数
一句话函数 一般与内战函数结合
1.没有名字的函数,一句话函数。
2.匿名函数只能构建简单的函数,
3.一般与内置函数一起使用
举例
func2 = lambda 形参: 返回值
func2 = lambda x,y: x + y
非学,无以致疑;非问,无以广识