迭代器
一、Python
的数据结构
- 容器(
container
)、 - 可迭代对象(
iterable
)、 - 迭代器(
iterator
)、 - 生成器(
generator
)、 - 列表/集合/字典推导式(
list,set,dict comprehension
)
二、几个数据结构
1、容器(
container
)可以理解为一个盒子,用来装各种数据,主要包括以下几种数据结构:
- list
- set
- dict
- tuple
- str
容器常见的使用,判断一个元素是否包含在容器里面或者不包括,用
in
或者not in
# list assert 2 in [1, 2, 3] assert 4 not in [1, 2, 3] # set assert 1 in {1, 2, 3} assert 4 not in {1, 2, 3} # tuple assert 1 in (1, 2, 3) assert 4 not in (1, 2, 3) # dict assert 'foo' in {'foo': '哈哈'} # str assert 'h' in 'hello'
2、可迭代对象(
iterable
)很多容器都是属于可迭代对象(需要改造下)
list1 = [1, 2, 3, 4] str1 = 'hello word' dict1 = {'nane': '哈哈', 'gender': '男'} tup = (1, 2, 3, 4) set1 = {1, 2, 3, 4} # 使用iter把容器改改造成可迭代对象 iter_list1 = iter(list1) print(type(iter_list1)) # 迭代器不管是使用next()或者 __next__()都一样的 print(next(iter_list1)) print(iter_list1.__next__()) # 使用__iter__()一样的可以把容器改为一个可迭代对象 iter_str = str1.__iter__() print(iter_str.__next__())
3、迭代器(
iterator
)为什么要有迭代器呢?它是一个带状态的对象,他能再你调用
next()
方法的时候返回容器中的下一个值 实现了__iter__
和__next__()
1、
for..in
遍历字典的原理dict1 = {'name': '哈哈', 'gender': '男', 'age': 20} for key in dict1: print('{0}--{1}'.format(key, dict1[key]))
- 执行in后对象的
dic.__iter()
方法,得到一个迭代器对象iter_dic
- 执行
next(iter_dic)
将得到的值赋值给key
,然后执行循环体代码 - 重复过程2,直到捕获到异常
stopIteration
,结束循环
- 执行in后对象的
三、判断是否可迭代对象
1、导包
from collections import Iterable
2、测试
print(isinstance([], Iterable)) print(isinstance({}, Iterable)) print(isinstance((), Iterable)) print(isinstance('hello', Iterable)) print(isinstance('100', Iterable)) print(isinstance(100, Iterable))