2018/11/16(python(迭代器与生成器))

1.迭代----每次结果都是基于上一个结果

2.迭代器协议:对象必须提供一个next方法,执行该方法要么返回迭代中的下项,要么就引起一个stoplteration异常,以终止迭代(只能往后走,不能往前看)

3.可迭代对象指的是内置有__iter__方法的对象,即obj.__iter__

x=‘helloworld‘
x_t=x.__iter__()    #遵循迭代器协议,生成可迭代对象
print(x_t.__next__())
print(x_t.__next__())
print(x_t.__next__())

#for循环实质
for i in x:
    print(i)

生成器

可以理解为一种数据类型,他自动实现了迭代器协议,(其他数据类型需要调用自己内置的_iter_),所以生成器就是可迭代对象。

两种形式:

    1.生成器函数----使用yield语句而不是return。(yield一次返回一个结果,在每个结果中间,挂起函数状态,以便下次从离开他的地方继续执行。)

def test():
    yield 1
    yield 2
    yield 3
g=test()
print(g)
print(g.__next__())
print(g.__next__())

    2.类似列表推导。

# encoding:utf-8
l=[‘课程%s‘%i for i in range(10)]        #列表解析你,缺点太占用内存
print(l)
#生成器表达式
n=(‘课程%s‘%i for i in range(10))       #将列表解析[]改为()
print(n)
print(n.__next__())
print(n.__next__())
print(n.__next__())

三元表达式

name=‘alex‘
result=‘woman‘ if name==‘alex‘ else ‘man‘
print(result)
m=[‘课程%s‘%i for i in range(10) if i>5]      #三元多项式
print(m)
def T():
    for i in range(100):
        print(‘第%s轮‘%i)
        yield i
        print(‘第%s轮结束‘%i)
t=T()
x=t.__next__()
print(x)
#好处中间可以加代码
t.__next__()

实际应用

人口文档内容
{‘province‘:‘北京‘,‘population‘:2000000}
{‘province‘:‘天津‘,‘population‘:1000000}
{‘province‘:‘南京‘,‘population‘:3000000}
{‘province‘:‘山东‘,‘population‘:1000000}
{‘province‘:‘山西‘,‘population‘:2000000}

#代码
def fun():
    with open(‘人口‘,‘r‘,encoding=‘gbk‘) as f:
        for i in f:
            p=eval(i)
            yield p[‘population‘]
def fun2():
    s=0
    with open(‘人口‘,‘r‘,encoding=‘gbk‘) as f:
        for i in f:
            p=eval(i)
            s+=p[‘population‘]
    return s
data=fun()
s=fun2()
data_1=data.__next__()
print(data_1/s)
data_2=data.__next__()
print(data_2/s)
data_3=data.__next__()
print(data_3/s)
data_4=data.__next__()
print(data_4/s)
data_5=data.__next__()
print(data_1/s)

实现程序单线程并发

import time
def consum(name):
    print(‘我是%s,我开始吃包子了‘%name)
    while True:
        baozi=yield 1
        time.sleep(1)
        print(‘%s很开心的把%s吃了‘%(name,baozi))
def product():
    c1=consum(‘wupeiqi‘)
    c2=consum(‘bob‘)
    c1.__next__()
    c2.__next__()
    for i in range(5):
        time.sleep(1)
        c1.send(‘包子%s‘%i)       #把包子x传给baozi,必须传一个参数
        c2.send(‘包子%s‘%i)
product()
x=‘helloworld‘x_t=x.__iter__()    #遵循迭代器协议,生成可迭代对象print(x_t.__next__())print(x_t.__next__())print(x_t.__next__())

#for循环实质for i in x:    print(i)

原文地址:https://www.cnblogs.com/2018-1025/p/9976076.html

时间: 2024-09-28 21:38:44

2018/11/16(python(迭代器与生成器))的相关文章

python迭代器、生成器和yield语句

http://blog.csdn.net/pipisorry/article/details/22107553 一.迭代器(iterator) 迭代器:是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration.任何这类的对象在Python中都可以用for循环或其他遍历工具迭代,迭代工具内部会在每次迭代时调用next方法,并且捕捉StopIteration异常来确定何时离开. 迭代器对象要求支持迭代

Python迭代器和生成器介绍

Python迭代器和生成器介绍 迭代器 迭代器是一个实现了迭代器协议的对象,Python中的迭代器协议就是有next方法的对象会前进到下一结果,而在一系列结果的末尾是,则会引发StopIteration. 在for循环中,Python将自动调用工厂函数iter()获得迭代器,自动调用next()获取元素,还完成了检查StopIteration异常的工作. 常用的几个内建数据结构tuple.list.set.dict都支持迭代器,字符串也可以使用迭代操作. 你也可以自己实现一个迭代器,如上所述,只

Lesson 023 —— python 迭代器与生成器

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

2018.11.16 浪在ACM 集训队第五次测试赛

2018.11.16 浪在ACM 集训队第五次测试赛 整理人:李继朋 Problem A : 参考博客:[1]朱远迪 Problem B : 参考博客: Problem C : 参考博客: Problem D : 参考博客:[1]朱远迪 Problem E : 参考博客: 原文地址:https://www.cnblogs.com/QLU-ACM/p/9977949.html

python——迭代器、生成器、装饰器

迭代器 迭代器规则 迭代:重复做一些事很多次,就像在循环中那样. 不仅可以对字典和序列进行迭代,还可以对其他对象进行迭代:只要该对象实现了__iter__方法. __iter__方法会返回一个迭代器(iterator),所谓的迭代器就是具有next方法(这个方法在调用时不需要任何参数)的对象.在调用next方法时,迭代器会返回他的下一个值.如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopIteration异常. 注意:迭代器规则在3.0中有一些变化.在新的规则中,迭代器对象应

python—迭代器,生成器与for循环机制

一:什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代器中的下一项,要么就引起一个stoplteration异常,以终止协议(只能往后走不能往前) 2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个_iter_()方法) 3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min函数等)使用迭代器协议访问对象. 二:for循环机制 1.for循环机制的本质:循环所有对象,全部都是使用迭代器协议. 三

Python 迭代器、生成器和列表解析

迭代器 迭代器在 Python 2.2 版本中被加入, 它为类序列对象提供了一个类序列的接口. Python 的迭代无缝地支持序列对象, 而且它还允许迭代非序列类型, 包括用户定义的对象.即迭代器可以迭代不是序列但表现出序列行为的对象, 例如字典的 key , 一个文件的行, 等等.迭代器有以下特性: 提供了可扩展的迭代器接口. 对列表迭代带来了性能上的增强. 在字典迭代中性能提升. 创建真正的迭代接口, 而不是原来的随机对象访问. 与所有已经存在的用户定义的类以及扩展的模拟序列和映射的对象向后

Python: 迭代器与生成器小结

迭代器与生成器的区别: 1. 迭代器由Class对象创建. 生成器由包含yield表达的Function对象或者Generator Expression创建. 2. 迭代器的原理: (1)由Iterable.__iter__()返回Iterator. (2)由Iterator.__next__()返回迭代值, 直到StopIteration. 一般迭代器同时实现__iter__()与__next__(), 在__iter__()返回self, 在__next__()返回迭代值,直到StopIte

Python迭代器与生成器

生成器 仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得. 创建一个生成器函数 >>> def scq(): ...    print("11") # 当函数代码块中遇到yield关键字的时候,这个函数就是一个生成器函数 ...    yield 1 ...    print("22") ...    yield 2 ...    print("33") ...    yield 3 ... 把生成器赋值给