[Python]迭代和对象的可迭代性
- 2020 年 3 月 10 日
- 筆記
文章目录
- @[toc]
- 0. 环境
- 1. 基础概念
- 1.1. 引言
- 1.2. 可迭代与迭代器的区别
- 2. 应用
- 2.1. 字典dict的迭代
- 2.2. 字符串str的迭代
- 3. 判断对象的可迭代性和获得获取迭代索引
- 3.1. 判断对象的可迭代性
- 3.2. 迭代的同时获得迭代索引(下标)
- eg.1.
- eg.2.
- eg.3.
- 4. 参考文献
Python迭代和对象的可迭代性
Python文档整理目录: https://blog.csdn.net/humanking7/article/details/80757533
0. 环境
Python 3.6
1. 基础概念
1.1. 引言
如果给定一个
list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
在Python中,迭代是通过for ... in来完成的,而很多语言比如C语言,迭代是通过下标完成的,eg:
int buf[100] = {...}; for(int i=0; i<100; 1++){ int a = buf[i] // do something }
1.2. 可迭代与迭代器的区别
可迭代: 在Python中如果一个对象有__iter__( )方法或__getitem__( )方法,则称这个对象是可迭代的(Iterable);其中__iter__( )方法的作用是让对象可以用for ... in循环遍历,__getitem__( )方法是让对象可以通过“实例名[index]”的方式访问实例中的元素。换句话说,两个条件只要满足一条,就可以说对象是可迭代的。显然列表List、元组Tuple、字典Dictionary、字符串String等数据类型都是可迭代的。当然因为Python的**“鸭子类型”**,我们自定义的类中只要实现了__iter__( )方法或__getitem__( )方法,也是可迭代的。
迭代器: 在Python中如果一个对象有__iter__( )方法和__next__( )方法,则称这个对象是迭代器(Iterator);其中__iter__( )方法是让对象可以用for ... in循环遍历,__next__( )方法是让对象可以通过next(实例名)访问下一个元素。
注意:这两个方法必须同时具备,才能称之为迭代器。列表List、元组Tuple、字典Dictionary、字符串String等数据类型虽然是可迭代的,但都不是迭代器,因为他们都没有next( )方法。
2. 应用
2.1. 字典dict的迭代
只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:
In [1]: d = {'a': 1, 'b': 2, 'c': 3}
- 默认情况下,
dict迭代的是key。
In [2]: for key in d: ...: print(key) ...: a b c
- 如果要迭代
value,可以用for value in d.values()。
In [3]: for value in d.values(): ...: print(value) ...: 1 2 3
- 如果要同时迭代
key和value,可以用for k, v in d.items()。
In [4]: for k,v in d.items(): ...: print('key:', k, ', value:', v) ...: key: a , value: 1 key: b , value: 2 key: c , value: 3
注意: 因为dict的存储不是按照list的方式顺序排列,所以迭代出的结果顺序很可能不一样。
2.2. 字符串str的迭代
In [5]: for ch in 'hello': ...: print('char is:%c' % ch) ...: char is:h char is:e char is:l char is:l char is:o
3. 判断对象的可迭代性和获得获取迭代索引
3.1. 判断对象的可迭代性
由1.2节可知,如果对象类中含有__iter__( )方法或__getitem__( )方法,则称这个对象是可迭代的(Iterable),那么如何判断呢?方法是通过collections模块的Iterable类型判断:
In [7]: from collections import Iterable In [8]: isinstance('hello', Iterable) # 字符串str可迭代 Out[8]: True In [9]: isinstance([1, 2, 3], Iterable) # 列表list可迭代 Out[9]: True In [10]: isinstance({}, Iterable) # 字典dict可迭代 Out[10]: True In [11]: isinstance(996, Iterable) # 整型int 不可迭代 Out[11]: False In [12]: isinstance(99.6, Iterable) # float 不可迭代 Out[12]: False
3.2. 迭代的同时获得迭代索引(下标)
Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:
eg.1.
# d = {'a': 1, 'b': 2, 'c': 3} In [15]: for i,key in enumerate(d): ...: print(i,' ',key) ...: 0 a 1 b 2 c
eg.2.
In [16]: for i, ele in enumerate(['a','b','c']): ...: print(i,' ',ele) ...: 0 a 1 b 2 c
eg.3.
In [17]: for i, ele in enumerate('hello'): ...: print(i,' ',ele) ...: 0 h 1 e 2 l 3 l 4 o
4. 参考文献
廖雪峰Python教程:https://www.liaoxuefeng.com/wiki/1016959663602400/1017316949097888
OK! 以上,Enjoy~

