博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
生成器、迭代器
阅读量:5998 次
发布时间:2019-06-20

本文共 2126 字,大约阅读时间需要 7 分钟。

列表生成式:

a=[x for x in range(10)]b=[x*2 for x in range(10)]def f(n):    return n**3c=[f(x) for x in range(10)]print(a,'\n',b,'\n',c)

一种简单赋值法:

t=[12,'f',4]   #元组、列表都可以a,b,c=tprint(a,b,c)

生成器的两种创建方式:

方式一:

s=(x for x in range(10)) #创建一个生成器print(s)print(next(s)) #调用range中内容的方法,等价于'print(s.__next__())'print(next(s)) #再生成一个元素for i in s:     #生成器s是一个可迭代对象,可遍历    print(i)

 方式二:

def foo():    print('ok')    yield 1    print('ok2')    yield 2    return Nonefoo()            #程序不会被执行,因为foo()此时是一个生成器对象print(foo())      #打印的是生成器对象的地址g=foo()a=next(g)      #通过'next(foo)'调用生成器对象,此时'next(foo())'会收到yield的返回值1b=next(g)       #再一次执行的是yield 2对应的代码print(a,b)for i in foo():    #for循环其实是通过'next(foo())'进行的,'next(foo())收到yield的返回值并赋给i'    print(i)
next方法说明:1.用next进入生成器,执行代码遇到yield时退出                         2.再一次next进入时,从上次yield之后的一行开始执行,直到再遇到yield时退出                         3.以此循环往复

用生成器打印Fibonaccci数列:

def fib(max):    n,before,after=0,0,1    while n

生成器对象的send方法:

def bar():    print('ok1')    count=yield 1    print(count)    print('ok2')    yield 2b=bar()#h=next(b)       #调用send之前得先用next方法进入生成器bar()s=b.send(None)    #或者send一个None,等价于next(b)k=b.send('dj')print(s,k)
send方法说明: 1.send方法类似于next:(1)也能进入生成器;(2)第二次进入也是接着上次的地方执行
2.区别在于:send进入时会带一个值给到count,但第一次进入时只能传一个空值由于生成器中yield和send方法的作用,两段代码交替执行,实现伪并发

伪并发的一个例子:

由于生成器中yield和send方法的作用,两段代码交替执行,实现伪并发

 

import timedef consumer(name):    print('%s:老板,上包子!' %name)    while True:        x = yield        print('小二:第%s笼包子来喽,客官请慢用'%x)        print('%s:吃完了,再上'%name)def producer(name):    c1=consumer('A')    next(c1)    print('%s:好嘞!'%name)    print('%s开始做包子...'%name)    for i in range(5):        time.sleep(1)        print('...过了一会,老板做出来一笼包子')        c1.send(i+1)producer('老板')

判断:k是列表,是可迭代的(Iterable);d是迭代器

from collections import Iterator,Iterablek=[1,2,3,4]d=iter(k)print(d)print(isinstance(k,list))print(isinstance(k,Iterable))print(isinstance(d,Iterator))

 

迭代器读取文件内容的应用:

f=open('abc.txt','r')for i in f:       #f是一个可迭代对象    print(i)
 
相比于下面的方法,利用迭代器可以节省内存空间
for i in f.readlines():    #f.readlines()读取文件内容,并存储为列表,占用内存    print(i)

 

 
 

 

 

 

 

转载于:https://www.cnblogs.com/Finance-IT-gao/p/10387104.html

你可能感兴趣的文章
SAP 序列号参数文件能规定货物移动的时候是否必须指定序列号
查看>>
学会在命令行中获取帮助
查看>>
数据到hadoop的迁移
查看>>
32. 职场不如意怎么办
查看>>
Process.Start() 传递参数中有空格问题
查看>>
python字符串的格式化操作
查看>>
Redis在微服务架构中的几种应用场景
查看>>
java8Stream原理深度解析
查看>>
thinkjs文档中model.relation写法的探讨
查看>>
【UiBot实战教程】只要5行代码就能扒小说!?(一)
查看>>
如何打造7*24h持续交付通道?阿里高级技术专家的5点思考
查看>>
android opengl-es 平面贴图的代码
查看>>
[面试题记录02]实现一个function,使用正则匹配获取当前浏览器的多参数,参数可以是一个或多个...
查看>>
剖析Hadoop和Spark的Shuffle过程差异
查看>>
设计模式-行为型模式-责任链模式
查看>>
五万字长文 C C++ 面试知识总结(上)
查看>>
别看朋友圈照片光鲜亮丽,其实都是套路!
查看>>
android
查看>>
阿里云对象存储OSS支持版本管理特性
查看>>
我在阿里云做前端
查看>>