码迷,mamicode.com
首页 > 编程语言 > 详细

python 全栈开发,Day13(迭代器,生成器)

时间:2018-04-03 17:36:48      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:为什么   attribute   star   size   转换   sdi   机制   好处   _for   

一、迭代器

python 一切皆对象

能被for循环的对象就是可迭代对象

可迭代对象: str,list,tuple,dict,set,range

迭代器: f1文件句柄

 

dir打印该对象的所有操作方法

s = ‘python‘
print(dir(s))

执行输出:

[‘__add__‘, ‘__class__‘, ‘__contains__‘, ‘__delattr__‘, ‘__dir__‘, ‘__doc__‘, ‘__eq__‘, ‘__format__‘, ‘__ge__‘, ‘__getattribute__‘, ‘__getitem__‘, ‘__getnewargs__‘, ‘__gt__‘, ‘__hash__‘, ‘__init__‘, ‘__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__方法的对象就叫做可迭代对象
可迭代对象就遵循可迭代协议。

如何判断 两种方式

第一种:

s = ‘python‘
print(‘__iter__‘ in dir(s))

执行输出:

True

 

第二种:

from collections import Iterable
l = [1, 2, 3, 4]
print(isinstance(l, Iterable))

执行输出:

True

 

from collections import Iterable
l = [1, 2, 3, 4]
print(type(l))
print(isinstance(l,list))

执行输出:

<class ‘list‘>
True

 


type只能判断是什么类型

isinstance判断方面更广,不仅能判断类型,还能判断是否可迭代

 

迭代器

可迭代对象转化成迭代器:可迭代对象.__iter__() --->迭代器
迭代器不仅含有__iter__,还含有__next__。遵循迭代器协议。

l1 = [1,2,3]
l1_obj = l1.__iter__()  # 迭代器
print(l1_obj)

执行输出:

<list_iterator object at 0x000001987D5EB668>

表示它是一个列表迭代器对象

 

l1 = [1,2,3]
l1_obj = l1.__iter__()  # 迭代器
print(‘__iter__‘ in  dir(l1_obj)) #是否含有__iter__方法
print(‘__next__‘ in  dir(l1)) #是否含有__next__方法
print(‘__next__‘ in  dir(l1_obj))

执行输出:

True
False
True

 

从结果中,可以看出l1_obj是同时含有__iter__和__next__的对象,所以它是迭代器

 

迭代器使用__next__获取一个值

l1 = [1,2,3]
l1_obj = l1.__iter__()  # 迭代器
print(l1_obj.__next__()) #获取一个元素
print(l1_obj.__next__())
print(l1_obj.__next__())
print(l1_obj.__next__())

执行报错:

1
Traceback (most recent call last):
2
3
File "E:/python_script/day13/迭代器.py", line 9, in <module>
print(l1_obj.__next__())
StopIteration

多取了一个,就会报错,因为列表只有3个元素

 

使用for循环方式

l1 = [1,2,3]
l1_obj = l1.__iter__()  # 转换为迭代器
for i in l1_obj:
    print(i)

执行输出:

1
2
3

 

for循环的内部机制,就是用__next__方法执行的。为什么没有报错呢?它内部有异常处理机制

总结:

 

仅含有__iter__方法的,就是可迭代对象
包含__iter__和__next__方法的,就是迭代器

 

判断迭代器的2种方法:

第1种:

l1 = [1,2,3]
l1_obj = l1.__iter__()  # 转换为迭代器
print(‘__iter__‘ in  dir(l1_obj))

第2种:

l1 = [1,2,3]
l1_obj = l1.__iter__()  # 转换为迭代器
from collections import Iterator
print(isinstance(l1_obj, Iterator))

返回True,就表示它是的

 

迭代器的好处:
1,节省内存空间。
2,满足惰性机制。
3,不能反复取值,不可逆。

 

不可逆,表示,已经取过的值,不能再次取,它只能取下一个。

 

for处理机制

l2 = [1, 2, 3, 4, 5, 6, 7, 8]
for i in l2:
    print(i)

1,将可迭代对象转化成迭代器
2,内部使用__next__方法取值
3,运用了异常处理去处理报错。

 

迭代器最大的好处,就是节省内存
好的程序员,会在内存优化方面考虑,比如迭代器。

 

使用while循环,指定用__next__方法遍历列表

l2 = [1, 2, 3, 4, 5, 6, 7, 8]
l2_obj = l2.__iter__() #1.将可迭代对象转化成迭代器
while True:
    try:
        i = l2_obj.__next__() #内部使用__next__方法取值
        print(i)
    except Exception: #运用了异常处理去处理报错
        break

try里面的代码,出现报错,不会提示红色文字
Exception 可以接收所有报错,表示报错的时候,该怎么处理,这里直接使用breck跳出循环

 

面试题:

使用whlie循环去遍历一个有限对象

直接使用上述代码即可。

 

二、生成器

 生成器:生成器本质上是迭代器

l = [1,2,3]
l.__iter__() 

#生成器的产生方式:
1,生成器函数构造。
2,生成器推导式构造。
3,数据类型的转化。

 

python 全栈开发,Day13(迭代器,生成器)

标签:为什么   attribute   star   size   转换   sdi   机制   好处   _for   

原文地址:https://www.cnblogs.com/xiao987334176/p/8708782.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!