python中的循环迭代 |
您所在的位置:网站首页 › python中的static › python中的循环迭代 |
python中的循环迭代
iter() 作用于可迭代对象(list, dict)尝试返回一个迭代器(迭代器本身也是可迭代对象)。
for循环其实是通过拿到可迭代对象的迭代器并调用next()
1.返回可迭代对象的迭代器
l = ["a", "b", "c"]
iter_l = iter(l) # 返回list_iterator object at...
m = {"name": "Ted", "age": 30}
iter(m) # 返回dict_keyiterator object at...
iter(m.items()) # 返回dict_itemiterator object at...
next(iter_l) # 返回'a'
next(iter_l) # 返回'b'
2.实现迭代器
需要实现 _iter_ 和 _next_方法
class Range7:
"""生成某个范围内被7整除或者包含7的数字"""
def __init__(self, start, end):
self.start = start
self.end = end
def __iter__(self):
# 返回迭代器对象
return Range7Iterator(self)
class Range7Iterator:
def __init__(self, range_obj):
self.range_obj = range_obj
self.current = range_obj.start
def __iter__(self):
return self
def __next__(self):
while True:
if self.current >= self.range_obj.end:
raise StopIteration
if self.num_is_valid(self.current):
ret = self.current
self.current += 1
return ret
self.current += 1
def num_is_valid(self, num):
if num == 0:
return False
return num % 7 == 0 or '7' in str(num)
r = Range7(0, 50)
tuple(r)
3.生成器修饰可迭代对象
生成器这里的作用是包裹迭代逻辑,进行过滤筛选啥的
def even_only(numbers):
for num in numbers:
if num % 2 == 0:
yield num
for i in even_only(range(100)):
print(i)
4.itertools模块优化循环
1)product()扁平化多层嵌套循环 为了简化嵌套循环,接收多个可迭代对象,然后根据笛卡尔积生成结果。 from itertools import product list(product([1,2], [3,4])) # 返回[(1, 3), (1, 4), (2, 3), (2, 4)] # 大大简化嵌套循环 for i, j, k in product(range(10), range(20), range(30)): if i + j + k == 20: print(i, j, k)2)islice()循环内隔行处理 比如想处理1、3、5、7、9....奇数行的数据 # islice(seq, start, end, step) 序列,开始行,结束行,步长 with open(filename, 'r') as fp: for i, line in islice(fp, 1, None, 2): # 从第1行开始处理,直到空行,步长2(隔1行处理) yield line.strip()3)使用takewhile()替代break for user in users: if not is_qualified: break # 业务代码处理逻辑... # 以上代码可以写成: # takewhile(predicate, literable) 参数:真值测试,迭代对象。即迭代对象满足predicate真值测试才会迭代 from itertools import takewhile for user in takewhile(is_qualified, users): # 业务代码处理逻辑... 5.for循环中的else语句循环没有被break终止的话else语句就会被执行 for i in range(20): if i > 20: break print(i) else: print("没有大于20的数字") |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |