Python迭代笔记

实现迭代器协议的对象支持遍历

for x in [1,2,3]: #列表
   ...:    print(x)
   ...:    
1
2
3

for x in (1,2,3): #元组
  ...:    print(x)
  ...:    
1
2
3

d = {'a':1,'b':2} #字典表
for k in d:
  ...:    print(k)
  ...:    
a
b

f = open('hello.txt') #文件本身也是迭代器对象,不调用读方法也能直接遍历
for line in f:
  ...:    print(line, end = '')
  ...:    
Hello world
Python

迭代器对象与可迭代对象

f = open('hello.txt')
iter(f) is f
Out[14]: True
f.__next__()
Out[16]: 'Hello world\n'
f.__next__()
Out[18]: 'Python\n'

l = ['a','b','c']
iter(l) is l
Out[21]: False
l.__next__()
AttributeError: 'list' object has no attribute '__next__'
i = iter(l)
i.__next__()
Out[25]: 'a'
i.__next__()
Out[26]: 'b'
i.__next__()
Out[27]: 'c'

文件和列表都能直接用for循环遍历,因为它们都实现了_next_()方法,使用时无需将整个文件或列表读入内存,而是一个元素接下一个元素遍历。但它们之间还有区别,文件属于迭代器对象,已经直接实现了_next_()方法;而列表属于可迭代对象,一开始并没实现_next_()方法,而是在使用for循环遍历时通过iter()方法实现_next_()方法。

使用迭代遍历操作列表

l = [1,2,3]
res = []
i = iter(l)
while True:
   ...:    try:
   ...:        x = res.append(next(i)**2)
   ...:    except StopIteration:
   ...:        break
   ...:        
res
Out[36]: [1, 4, 9]
# result = [x**2 for x in l]使用列表推导,效率更高

字典表的视图也是可迭代对象

emp = {'name':'Tom','age':20,'salary':8000.00}
emp.keys() #为可迭代对象而非列表,更省内存
Out[38]: dict_keys(['name', 'age', 'salary'])
emp.items()
Out[39]: dict_items([('name', 'Tom'), ('age', 20), ('salary', 8000.0)])
keys = emp.keys()
iter(keys) is keys
Out[41]: False

i = iter(keys) #创建迭代器对象
i.__next__()
Out[43]: 'name'
i.__next__()
Out[44]: 'age'
next(i)
Out[45]: 'salary'

内置可迭代对象

r = range(1,20) #range()返回的对象支持循环遍历及推导,但并非列表,属于可迭代对象
type(r)
Out[47]: range
iter(r) is r
Out[48]: False
i = iter(r)
i.__next__()
Out[50]: 1
i.__next__()
Out[51]: 2
next(i)
Out[52]: 3

result = zip([1,2,3],['a','b','c']) #zip()返回的也属于可迭代对象
result
Out[54]: <zip at 0x20d981fe708>
for x in result:
   ...:    print(x)
   ...:    
(1, 'a')
(2, 'b')
(3, 'c')
result = zip([1,2,3],['a','b','c'])
iter(result) is result
Out[58]: True
result.__next__()
Out[59]: (1, 'a')

类似range()、zip()返回可迭代对象的还有map()、filter(),比直接返回列表更节省内存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值