迭代器,生成器

一:python中的for循环。

二:迭代器:

可以将某个数据集内的数据挨个取出来。

可以迭代的有:数字,字符串,列表,元组,字典..........

rom collections import Iterable
l=[1,2,3,4]
t=(1,2,3,4)
d={1:2,3:4}
s={1,2,3,4}
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(d,Iterable))
print(isinstance(s,Iterable))

           True
           True
           True
           True

二:可迭代协议

能被for循环的就是就是可迭代的。--------------可以被迭代满足的要求就是可迭代协议。(就是内部实现了_inter_方法)

print(dir([1,2]))
print(dir([2,3]))
print(dir({1:2}))
print(dir({1,2}))

三:迭代器------------------>必须遵循迭代器协议---------->(必须要有_iter_和_next_方法)。

访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有元素访问完毕,只能前进不能后退。

rint(set(dir([1,2].__iter__()))-set(dir([1,2])))

                              {‘__next__‘, ‘__length_hint__‘, ‘__setstate__‘}
=[1,2,3,4]
l_iter=l.__iter__()
item=l_iter.__next__()
print(item)
item=l_iter.__next__()
print(item)
item=l_iter.__next__()
print(item)
item=l_iter.__next__()
print(item)
item=l_iter.__next__
print(item)

1
2
3
4
<method-wrapper ‘__next__‘ of list_iterator object at 0x0000020A4F0397F0>

range:

print(‘_next_‘in dir(range(12)))      #查看‘_next_’是不是在执行range后,是否有‘_next_’
print(‘_next_‘in dir(range(12)))      #查看‘_next_’是不是在执行range后,是否有‘_next_’
from collections import Iterator
print(isinstance(range(100000000000),Iterator))#判断range在执行之后得到的结果是不是一个迭代器。

四:初识生成器

我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,可以用for循环,只能用一次。

迭代器有的好处是可以节省内存。

如果在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。

python中提供的生成器

1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方              继续执行

2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表

             生成器Generator:

        本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)

        特点:惰性运算,开发者自定义

生成器函数:

import time
def genrator_fun1():          #生成器函数
    a=1
    print(‘现在定义了a变量‘)
    yield a
    b = 2
    print(‘现在定义了变量‘)
    yield b
g1=genrator_fun1()          #打印g1,发现g1就是生成器
print(‘g1:‘,g1)
print(‘-‘*20)
print(next(g1))             #激活生成器
time.sleep(0.1)             #延迟0.1秒

-------------------
现在定义了a变量
1
现在定义了变量
2
def produce():
    for i in range(2000000):
        yield "生产了第%s件衣服"%i
product_g=produce()
print(product_g._next_())
print(product_g._next_())
print(product_g._next_())
num = 0
for i in product_g:
    print(i)
    num+=1
    if num == 5:
        break

五:列表生成器和列表表达式

1.把列表解析的[]换成()得到的就是生成器表达式

2.列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如, sum函数是Python的内置函数,该函数使用迭代器协议访            问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和:

egg_list=[‘鸡蛋%s‘%i for i in range(1,11)]       #列表解析
laomuji=(‘鸡蛋%s‘%i for i in range(1,11))        #生成器表达式
print(laomuji)
print(next(laomuji))              #next本质调用
print(laomuji.__next__())
print(next(laomuji))

 鸡蛋1
鸡蛋2
鸡蛋3

         

print(dir([1,2]))print(dir([2,3]))print(dir({1:2}))print(dir({1,2}))
时间: 2024-11-10 11:35:56

迭代器,生成器的相关文章

Day4 - 迭代器&amp;生成器、装饰器、Json &amp; pickle 数据序列化、软件目录结构规范

---恢复内容开始--- 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 需求:列表a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],要求把列表里的每个值加1 1 a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 2 b = [] 3 for i in a: 4 b.append(i+1) 5 a = b 6 print(a) 普通青

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

[python]--迭代器,生成器补充

在python中,list,string,dict都是可迭代对象,可以通过for语句遍历. 迭代器 迭代器对象要求支持迭代器协议的对象,在python中,支持迭代器协议就算实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身; next()方法返回容器的下一个元素,在结尾时引发StopIteration异常 __iter__()和next()方法 这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素. 对于可迭代对象,

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de

day4装饰器-迭代器&amp;&amp;生成器

一.装饰器 定义:本质是函数,(装饰其他函数)就是为其它函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1.函数及“变量” 2.高阶函数 a.把一个函数名当做实参传给另一个函数(在不修改被装饰器函数源代码的情况下为其添加新功能) b.返回值中包含函数名 3.嵌套函数 高阶函数+嵌套函数 = 装饰器 延迟3秒 import time def test1(): time.sleep(3) print('in the test1')

函数---迭代器&amp;生成器&amp;列表解析&amp;三元表达式

可迭代对象:obj.__iter__ 迭代器:iter1=obj.__iter() 1iter1.__next__ 2iter2.__next__ 迭代器: 优点:不依赖索引 惰性计算,节省内存 缺点: 不如按照索引的取值方便 一次性,只能往后取,不能回退 迭代器的应用: 提供了一种不依赖索引的统一的迭代方法 惰性计算,比如取文件的每一行 判断可是否是可迭代对象和迭代器 from collections import Iterable, Iterator # 导入模块功能 isinstance(

Python装饰器、迭代器&amp;生成器、re正则表达式、字符串格式化

Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########

Python 迭代器&amp;生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

python学习第十三天 迭代器 生成器

1.函数复习总结 # 函数 -- 2天 # 函数的定义和调用 # def 函数名(形参): #函数体 #return 返回值 #调用 函数名(实参) # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs # 站在实参的角度上 : 按照位置传,按照关键字传 # 返回值:没有返回值 返回一个值 返回多个值 # 接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收 # 闭包函数 -- 在内部函数引用外部函数的变量 # 装饰器函