迭代器与生成器
迭代器
"""
迭代器就是用来迭代取值的工具
迭代其实就是一个重复的过程,但是每次重复都是基于上一次的结果进行的,单纯的重复不叫迭代
优点:
(1):找到一种通用的迭代取值方案---->for循环
(2): 惰性计算,节省内存
缺点:
(1): 不能取指定的值,只能往后next
(2): 迭代器对象是一次性的;一个迭代器对象取值取干净了,就不能在继续取了。若想继续取值,则必须重新来一个迭代器对象。
可迭代对象:
内置有__iter__方法的对象都是可迭代对象
迭代器对象:
调用可迭代对象的__iter__()会得到一个返回值,这个返回值就是迭代器对象
内置有__next__方法的对象都是迭代器对象
特点:
1.内置有__next__()方法 用来取值
2.内置有__iter__()方法 方便for循环
"""
>>> l = [1,2,3,4,5]
>>> iter_l = iter(l) # 等价于 iter_l = l.__iter__
>>> next(iter_l) # 等价于 iter_l.__next__
1
>>> next(iter_l)
2
>>> next(iter_l)
3
# 这是两种迭代器的取值方式,注意迭代器取值一次性取完,后面就不能再取,要取只能重新来一个迭代器
l = [1,2,3,4,5,6,7]
iter_l = iter(l)
while True:
try:
print(next(iter_l))
except StopIteration as e:
break
生成器
"""
自定义的迭代器
"""
"""
需求:
造一个生成器,内部有1-10 这样一个列表
"""
def func(start, stop, step=1):
while start < stop:
yield start
start += 1
g = func(1,10)
for i in g:
print(i)
"""
yiel对比return
相同点: 都可以返回任意类型,任意个数的值
不同点: return只能返回一次值,函数就立即结束
yield可以返回多次值,可以暂停函数的运行
"""
函数递归
"""
函数递归:
函数递归是函数嵌套的一种特殊格式,内部自己调用自己,其实就是一种循环机制
递归分为两个阶段:
回溯: 一层一层往下调用
递推: 一层一层向上推出结果
"""
例如:
"""
需求:
取出下面列表的每一个元素
"""
l = [11, [22, [33, [44, [55, [66, [77, [88, [99]]]]]]]]]
def func(l):
for item in l:
if type(item) is list:
func(item)
else:
print(item)
func(l)
算法之二分法
"""
需求:
最快找到指定值
"""
nums = [3, 7, 9, 13, 21, 33, 57, 63, 78, 99]
file_num = 63
def search(l, file_num):
if len(l) == 0:
return
mid = len(l) //2
if file_num > l[mid]:
search(l[mid+1:], file_num)
elif file_num < l[mid]:
search(l[:mid], file_num)
else:
print(f‘找到了‘)
search(nums, 63)
三元表达式
"""
条件成立时的返回值 if 条件 else 条件不成立时的返回值
"""
例:
"""
找最大值
"""
x = 20
y = 10
print(x if x > y else y )
各种生成式
# 列表生成式
"""
需求:
生成一个1-10的列表,要求大于3元素
可以用来做一些列表的映射
"""
res = [i for i in range(10) if i > 3]
# 字典生成式
d = {‘k%i‘%i:i for i in range(3)}
#集合生成式
s = {i for i in range(4)}
# 生成器表达式(没有元组生成式,因为元组本身的不可变,而且有列表生成式,需要元组把列表做一个类型转换就可以了)
>>> g = (i for i in range(3))
>>> print(g)
<generator object <genexpr> at 0x000002781E541F90>
>>> next(g)
0
>>>
例:
"""
需求:
计算一个文本文件的字符个数,假设这个文件很大
"""
with open(‘a.txx‘, ‘rt‘, encoding=‘utf-8‘)as f:
res = sum(len(line) for line in f)
print(res)
迭代器与生成器