您的位置:首页 > 编程语言 > Python开发

【每天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']
>>>

还没学面向对象,下文可以先跳过

生成迭代器的方法

  1. 类中实现__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
  1. 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
>>>
  1. 生成器函数
    定义生成器函数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
>>>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: