一、迭代器

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

def func1():
print(111)
print(222)
print(333)
return 666
print(func1())

执行输出:

111
222
333
666

将函数转换为生成器

def func1():
print(111)
print(222)
print(333)
yield 666
g = func1()
print(g)

执行输出:

<generator object func1 at 0x000001B4C369DE60>

第一:函数中只要有yield 那他就不是一个函数,而是一个生成器
第二:g称作生成器对象。

迭代器,使用__next__取值

def func1():
print(111)
print(222)
print(333)
yield 666
g = func1()
print(g.__next__())
print(g.__next__()) 

执行报错
一个__netxt__对应一个yield

比如生产10000套服装

一个厂商直接生产出10000套了

def func1():
for i in range(1,10001):
print('ARMAIN服装%d套' % i)
func1()

执行输出:

...

ARMAIN服装9998套
ARMAIN服装9999套
ARMAIN服装10000套

第二个厂商,先生产出50套,给老板看

def func1():
for i in range(1,10001):
yield 'ARMAIN服装%d套' % i
g = func1()
for i in range(1,51):
print(g.__next__())

执行输出:

...

ARMAIN服装48套
ARMAIN服装49套
ARMAIN服装50套

最终老板只要200套
先50套,再150套

def func1():
for i in range(1,10001):
yield 'ARMAIN服装%d套' % i
g = func1()
for i in range(1,51):
print(g.__next__())
#再执行150次,注意,它是从51开始的
for j in range(150):
print(g.__next__())

之前生产10000套的....

对于列表而言,for循环是从开始
对于生成器而言,它是有指针的,__next__一次,指针向前一次。它不能从头开始。
必须依次执行才行

生成器和迭代器的区别
迭代器: 有内置方法
生成器: 开发者自定义

send

def generator():
print(123)
content = yield 1
print('=======',content)
print(456)
yield g = generator()
ret = g.__next__()
print('***',ret)
ret = g.send('hello') #send的效果和next一样
print('***',ret)

执行输出:

123
*** 1
======= hello
456
*** None

send 获取下一个值的效果和next基本一致
只是在获取下一个值的时候,给上一yield的位置传递一个数据
使用send的注意事项

   第一次使用生成器的时候 是用next获取下一个值
   最后一个yield不能接受外部的值

next 和send 功能一样,都是执行一次
send可以给上一个yield赋值。

明日默写内容:

1.什么是可迭代对象,什么是迭代器
答:
内部含有__iter__方法的对象就叫做可迭代对象
内部必须有__iter__方法和__next__方法的对象,叫做迭代器

2.可迭代对象如何转化成迭代器
答:
转化成迭代器:可迭代对象.__iter__() --->迭代器
例如

l1 = [1,2,3]
l1_obj = l1.__iter__()

3.迭代器如何取值
答:
迭代器使用__next__()方法

4.什么是生成器?如何写一个生成器?生成器怎么取值?
答:
生成器,即生成一个容器。在Python中,一边循环,一边计算的机制,称为生成器。

#生成器示例

def fun1():
yield 1

  

生成器使用__next__()方法取值,或者for循环

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

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

    一.迭代器 迭代协议:对象必须提供一个next方法,执行该方法后会返回迭代的下一项或者抛出Stopiteration异常,终止迭代.切只能往前,不能倒退. 可迭代对象:遵循迭代写一点对象就是可迭代对象 ...

  2. python全栈开发-Day11 迭代器、生成器、面向过程编程

    一. 迭代器 一 .迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而 ...

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

    1.什么叫迭代 现在,我们已经获得了一个新线索,有一个叫做“可迭代的”概念. 首先,我们从报错来分析,好像之所以1234不可以for循环,是因为它不可迭代.那么如果“可迭代”,就应该可以被for循环了 ...

  4. python全栈开发_day13_迭代器和生成器

    一:迭代器 1)可迭代对象 具有内置函数__iter__的数据就是可迭代对象 2)迭代器对象 具有内置函数__next__的数据就是迭代器对象 迭代器对象一定是可迭代对象,可迭代对象不一定是迭代器对象 ...

  5. python全栈开发-Day13 内置函数

    一.内置函数 注意:内置函数id()可以返回一个对象的身份,返回值为整数. 这个整数通常对应与该对象在内存中的位置,但这与python的具体实现有关,不应该作为对身份的定义,即不够精准,最精准的还是以 ...

  6. python全栈开发学习_内容目录及链接

    python全栈开发学习_day1_计算机五大组成部分及操作系统 python全栈开发学习_day2_语言种类及变量 python全栈开发_day3_数据类型,输入输出及运算符 python全栈开发_ ...

  7. python全栈开发从入门到放弃之迭代器生成器

    1.python中的for循环 l = [1,2,3,4,5,6] for i in l: #根据索引取值 print(i) 输出结果: 1 2 3 4 5 6 2.iterable  可迭代的 可迭 ...

  8. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  9. Python全栈开发【基础四】

    Python全栈开发[基础四] 本节内容: 匿名函数(lambda) 函数式编程(map,filter,reduce) 文件处理 迭代器 三元表达式 列表解析与生成器表达式 生成器 匿名函数 lamb ...

  10. Python 全栈开发【第0篇】:目录

    Python 全栈开发[第0篇]:目录   第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...

随机推荐

  1. nmap常用参数详解

    nmap常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 借用英雄联盟的一个英雄赵信的一句话:“即使敌众我寡,末将亦能万军丛中取敌将首级!”.三国关羽,万军丛中斩了颜良, ...

  2. db nosql redis / Redis Sentinel

    s Redis基础原理和日常操作方法 http://itsm.cns*****.com/kindeditor/img/20170527/759128afca564051b491e6a51a5bad40 ...

  3. java了解哪些锁

    问题: 1.Java里的锁了解哪些? 说了Lock和synchronized  它们的使用方式和实现原理有什么区别呢?使用的话,synchronize用于方法和代码块,可以锁对象和类以及方法,Lock ...

  4. POJ 2970 The lazy programmer

    The lazy programmer Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2785   Accepted: 70 ...

  5. Spring面向切面编程AOP(around)实战

    spring aop的环绕通知around功能强大,我们这里就不细说,直接上代码,看着注释就能明白 需要的可以点击下载源码 1.如果使用注解的方式则需要先创建个注解类 package com.mb.a ...

  6. JMS学习(七)-ActiveMQ消息的持久存储方式之KahaDB存储

    一,介绍 自ActiveMQ5.4以来,KahaDB成为了ActiveMQ默认的持久化存储方式.相比于原来的AMQ存储方式,官方宣称KahaDB使用了更少的文件描述符,并且提供了更快的存储恢复机制. ...

  7. Java SE之向上转型与向下转型

    package object; //向上转型-向下转型 public class Up_Down_convert { /* 向上转型 * * 1.上转型对象可以使用和操作子类继承或者重写的方法 * 2 ...

  8. POJ1679 The Unique MST【次小生成树】

    题意: 判断最小生成树是否唯一. 思路: 首先求出最小生成树,记录现在这个最小生成树上所有的边,然后通过取消其中一条边,找到这两点上其他的边形成一棵新的生成树,求其权值,通过枚举所有可能,通过这些权值 ...

  9. Java将list数据导出到Excel——(八)

    Java实体类 package bean; public class Question { private String timu; //题干 private String leixing; //类型 ...

  10. JS结合a标签的使用

    a标签可以当作按钮使用,也可以当作连接. <a href=javascript:test(5)>弹出5</a>    会直接调用JS函数(注意中间没引号) <a href ...