【每天1分钟】PYTHON基础之条件与循环(迭代器)
2019-07-26 23:27
337 查看
版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
【每天1分钟】PYTHON基础之条件与循环(迭代器)
可迭代
在Python中如果一个对象有 iter( ) 方法或 getitem( ) 方法,则称这个对象是可迭代的( Iterable );其中 iter( ) 方法的作用是让对象可以用for … in循环遍历,getitem( ) 方法是让对象可以通过“实例名[index]”的方式访问实例中的元素。换句话说,两个条件只要满足一条,就可以说对象是可迭代的。
迭代器
在Python中如果一个对象有 iter( ) 方法和 next( ) 方法,则称这个对象是迭代器(Iterator);其中 iter( ) 方法是让对象可以用for … in循环遍历, next( ) 方法是让对象可以通过 next(实例名) 访问下一个元素。注意: 这两个方法必须同时具备,才能称之为迭代器。
>>> from collections import Iterable, Iterator # 列表、元组、字典、字符串是可迭代的 >>> isinstance([], Iterable) True >>> isinstance((), Iterable) True >>> isinstance({}, Iterable) True >>> isinstance('', Iterable) True # 但列表、元组、字典、字符串不是迭代器 >>> isinstance([], Iterator) False >>> isinstance((), Iterator) False >>> isinstance({}, Iterator) False >>> isinstance('', Iterator) False >>> # 列表 有 __getitem__ 和 __iter__ 但没有 __next__ >>> dir([]) ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort'] # 元组 有 __getitem__ 和 __iter__ 但没有 __next__ >>> dir(()) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index'] # 字典 有 __getitem__ 和 __iter__ 但没有 __next__ >>> dir({}) ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'] # 字符串 有 __getitem__ 和 __iter__ 但没有 __next__ >>> dir('') ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill'] >>>
还没学面向对象,下文可以先跳过
生成迭代器的方法
- 类中实现__iter__( )方法和__next__( )方法
from collections import Iterator class Fab: def __init__(self, n): self.a = 0 self.b = 1 self.n = n def __iter__(self): return self def __next__(self): self.a, self.b = self.b, self.a + self.b if self.a > self.n: raise StopIteration("迭代器end") return self.a t1 = Fab(100) print(isinstance(t1, Iterator)) for i in t1: print(i, end=" ") #输出结果 True 1 1 2 3 5 8 13 21 34 55 89
- iter( )函数
Python中的iter( object[, sentinel])函数可用来返回一个迭代器对象,iter( )函数只传入一个参数时,参数必须为可迭代对象;当使用第二个参数sentinel(哨兵)时,第一个参数必须是一个可调用对象。
>>> help(iter) Help on built-in function iter in module builtins: iter(...) iter(iterable) -> iterator iter(callable, sentinel) -> iterator Get an iterator from an object. In the first form, the argument must supply its own iterator, or be a sequence. In the second form, the callable is called until it returns the sentinel. >>> >>> from collections import Iterable, Iterator >>> >>> str1 = 'Iterator' >>> iter1 = iter(str1) >>> isinstance(iter1, Iterable) True >>> isinstance(iter1, Iterator) True >>> dir(iter1) ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__'] >>> next(iter1) 'I' >>> next(iter1) 't' >>> next(iter1) 'e' >>> next(iter1) 'r' >>> next(iter1) 'a' >>> next(iter1) 't' >>> next(iter1) 'o' >>> next(iter1) 'r' >>> next(iter1) Traceback (most recent call last): File "<pyshell#103>", line 1, in <module> next(iter1) StopIteration >>> def square(x): return x * x >>> iter2 = iter(square, 9) >>> isinstance(iter2, Iterable) True >>> isinstance(iter2, Iterator) True >>>
- 生成器函数
定义生成器函数generator与定义普通函数是一样的,唯一的不同生成器函数中有一个或多个yield,yield与return类似都是用来返回数据,两者的区别是return返回数据后直接退出当前函数,而yield将数据返回后仍然继续运行函数,因此最后生成器函数返回的是一个迭代器对象。
>>> from collections import Iterable, Iterator >>> >>> def reverse_str(str): for i in range(len(str)-1, -1, -1): yield str[i] >>> rst = reverse_str('Iterator') >>> isinstance(rst, Iterable) True >>> isinstance(rst, Iterator) True >>> for c in rst: print(c, end = '') rotaretI >>>
相关文章推荐
- 【每天1分钟】PYTHON基础之条件与循环(几个返回迭代器的函数)
- Python基础5条件判断+循环
- 【Python】 [基础] 条件判断 与 循环 与dict和set
- python基础之条件控制与循环
- 【每天1分钟】PYTHON基础之函数(函数定义)
- 【Python基础教程笔记(二)】字典,条件,循环和其他语句
- Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 7. 条件循环
- Python基础学习--第四篇(条件判断和循环)
- Python基础编程(五)条件、循环和其他语句
- [Python学习] 专题二.条件语句和循环语句的基础知识
- python基础知识- 条件判断语句和循环语句
- Python3.5基础——变量、数据结构、条件和循环语句、break与continue语句
- Python基础入门(十)- 布尔类型条件判断与循环
- python基础教程第5章——条件循环和其他语句
- python基础教程-第2章节 分支,循环,还有条件
- [Python学习] 专题二.条件语句和循环语句的基础知识
- Python基础编程(五)条件、循环和其他语句
- python基础知识点数据类型转换、条件控制语句、循环语句、字符串、元组、字典、逻辑运算符
- Python简单学习(lecture3)编程、条件控制、循环语句、迭代器和生成器
- 第四篇:python基础之条件和循环