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

一、迭代器

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,数据类型的转化。

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

时间: 2024-10-11 00:44:02

python 全栈开发,Day13(迭代器,生成器)的相关文章

Python 全栈开发五 迭代器 生成器 装饰器

一.迭代器 迭代器是一个可以记住遍历的位置的对象.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器有两个基本的方法:iter() 和 next(). 字符串,列表或元组对象都可用于创建迭代器,生成迭代器的方法是iter(): >>li = [1,2,3,4,5] >>it = iter(li) #生成一个迭代器 >>it.__next__() 1 >>next(it) #以上两种next都可以使用 2 >

Python全栈开发之---迭代器、可迭代对象、生成器

1.什么叫迭代 现在,我们已经获得了一个新线索,有一个叫做"可迭代的"概念. 首先,我们从报错来分析,好像之所以1234不可以for循环,是因为它不可迭代.那么如果"可迭代",就应该可以被for循环了. 这个我们知道呀,字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. 我们怎么来证明这一点呢? 1 from collections import Iterable 2 3 l = [1,2,3,4] 4 t = (1,2,3,4) 5 d =

python全栈开发-Day13 内置函数

一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以内存地址为准. is运算符用于比较两个对象的身份,等号比较两个对象的值,内置函数type()则返回一个对象的类型 #更多内置函数:https://docs.python.org/3/library/functions.html?highlight=built#ascii 二.内置函数详情 1.abs

python全栈开发目录

python全栈开发目录 linux命令 初识python python基础数据类型 函数编程.set.深浅拷贝 内置函数 文件操作 装饰器 迭代器和生成器 常用模块 初识类和对象 类和对象(进阶) 反射 异常处理 socket.IO多路复用 线程.进程.协程 HTML CSS JavaScript DOM文档操作 jQuery实例 web框架本质 Tornado mysql基础 mysql进阶 ..... 基本算法 递归--二分法查找 冒泡排序 更多 线程池

Python 全栈开发【第一篇】:目录

Python 全栈开发[第0篇]:目录 第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基础语法入门 Python 全栈开发[第三篇]:数据类型.字符编码.文件操作 第二阶段:函数编程&常用标准库 Python 全栈开发[第四篇]:函数.递归.生成器.迭代器 Pyhton 全栈开发[第五篇]:常用模块学习 第三阶段:面向对象编程&网络编程基础 Python 全栈开发[第六篇]:面向对象

Python全栈开发【基础三】

Python全栈开发[基础三]  本节内容: 函数(全局与局部变量) 递归 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 1 def 函数名(参数): 2 3 ... 4 函数体 5 ... 6 返回值 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算 参数:为函数体提供数据 返回值:当函数执行完毕后,可以给调用者返回数据. 总结使用函数的好处: 1.减少代码重用 2.保持一致性,易维护

Python全栈开发【第一篇】:初识Python

Python全栈开发[第一篇] 本节内容: Python 的种类 Python 的环境 Python 入门(解释器.编码.变量.input输入.if流程控制与缩进.while循环) if流程控制与while循环练习题 基本数据类型前引 Python 的种类 Cpython Python的官方版本,使用C语言实现,使用最为广泛,CPython实现会将源文件(py文件)转换成字节码文件(pyc文件),然后运行在Python虚拟机上. Jyhton Python的Java实现,Jython会将Pyth

Python全栈开发

Python全栈开发 一文让你彻底明白Python装饰器原理,从此面试工作再也不怕了. 一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大,但是理解起来有些困难,因此我尽量用最简单的例子一步步的说明这个原理. 1.不带参数的装饰器 假设我定义了一个函数f,想要在不改变原来函数定义的情况下,在函数运行前打印出start,函数运行后打印出end,要实现这样一个功能该怎么实现?看下面如何用

Python全栈开发【基础二】

Python全栈开发[基础二] 本节内容: Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典) 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 1 class int(object): 2 """ 3 int(x=0) -> integer 4 int(x, base=10) -&g

Python全栈开发【基础四】

Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 匿名函数 lambda表达式:对于简单的函数,存在一种简便的表示方式,即lambda表达式 1 #这段代码 2 def calc(n): 3 return n**n 4 print(calc(10)) 5 6 #换成匿名函数 7 calc = lambda n:n**n 8 print(calc(10)) 匿名函数主要是和其它函数搭配使用 举例: 1 ########