Python生成器建议收藏

1.生成器使用yield语句,每次产生一个值,函数就会被冻结2.列表推导式可以用来创建list例:生成[1*1,2*2,3*3,4*4,5*5]的列表,即[1,4,9,16,25]

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

  生成器是Python新引入的概念,生成器可以帮助我们写出非常优雅的代码

1. 生成器

  使用yield语句,每次产生一个值,函数就会被冻结 

def fun(li):
    for i in li:
        #print (i)
        yield i

li = [1,2,3,4,5]
for i in fun(li):
    print (i)

2.列表推导式

  可以用来创建list

  例:生成[1*1, 2*2, 3*3, 4*4, 5*5]的列表,即[1,4,9,16,25]

#方法1
def fun1():
    l = []
    for i in range(1,6):
        l.append(i * i)
    return l

print (fun1())

#方法2
def fun2():
    return (i*i for i in range(1,6))

ll = list(fun2())
print (ll)

#方法3
def fun3():
    for i in range(1,6):
        yield i*i
for i in fun3():
    print (i)
输出:
>>>> [1,4,9,16,25] >>>> [1,4,9,16,25]
>>>> 1
>>>> 4
>>>> 9
>>>> 16
>>>> 25

特别注意在斐波那契数列例子中a,b=b,a+b语法

3. yield实现协程任务器调度

#coding = utf-8

'''
    yield实现协程任务调度
'''
from collections import deque

class TaskScheduler:
    def __init__(self):
        self.taskqueue = deque()

    def new_task(self, task):
        self.taskqueue.append(task)

    def run(self):
        while self.taskqueue:
            task = self.taskqueue.popleft()
            try:
  
                next(task)
                self.taskqueue.append(task)
            except Exception:
                print ("run exception")

def task1(n):
    while n > 0:
        print ("say hello: %d" %(n))
        yield n
        n -=1
    print ("task1 say goodble")

def task2(n):
    x= 0
    while x < n:
        print ("say hi:%d" %(x))
        yield x
        x += 1

    print ("task2 say goodbye")

taskschequler = TaskScheduler()
taskschequler.new_task(task1(4))
taskschequler.new_task(task2(4))
taskschequler.run()
    

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120226.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java是什么?java能用来干嘛?[通俗易懂]

    java是什么?java能用来干嘛?[通俗易懂]java是什么?java能用来干嘛?Java是一种开发语言(核心特点:跨平台,面向对象,名称由来看这里:J2EE里面的2是什么意思),对于开发者来讲,Java基本等于Jdk。Java由四方面组成:Java编程语言,即语法。Java文件格式,即各种文件夹、文件的后缀。Java文件格式,即各种文件夹、文件的后缀。Java虚拟机(JVM),即处理*.class文件的解释器。Java应…

    2022年7月7日
    21
  • java栈内存初始化,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧…

    java栈内存初始化,阿里面试官:小伙子,你给我说一下JVM对象创建与内存分配机制吧…内存分配机制逐步分析类加载检查:虚拟机遇到一条new指令(new关键字、对象的克隆、对象的序列化等)时,会先去检查这个指令的参数在常量池中定位到一个类的符号引用,并且这个符号引用代表的类是否应被加载过,如果没有那么就去加载该类分配内存类加载完毕后会给对象分配内存空间。对象的所需的内存大小在类加载完毕后就便可完全确认,为对象分配内存大小的空间等同于把一块确定大小的内存从java堆中划分出来。如何划分…

    2022年5月14日
    35
  • verilog经典教程(ps入门教程自学图解)

    Verilog入门1关键字1.1modulemodule()…endmodule代表一个模块,我们的代码写在这个两个关键字中间1.2inputoutputinput关键词,模块的输入信号,比如inputClk,Clk是外面关键输入的时钟信号;output关键词,模块的输出信号,比如output[3:0]Led;这个地方正好是一组输出信号。其中[3:0]表示0~3共4路信号。inout模块输入输出双向信号。数据总线的通信中,这种信号被广泛应用;wire关键词,线信号。例如:w

    2022年4月18日
    43
  • aptitude命令使用

    aptitude命令使用aptitude一个类似于aptinstall的命令使用引用官网的描述解释aptitude是一个功能丰富的包管理器,包括:使用类似mutt的语法灵活地检索软件包,类似dselect的持续用户操作,获取并显示大多数软件包的Debianchangelog的功能,一个类似apt-get的命令行模式。aptitude还是个Y2K兼容,轻便,自清洁以及友好的程序。常…

    2025年7月28日
    0
  • Perl正则表达式超详细教程

    Perl正则表达式超详细教程前言想必学习perl的人,对基础正则表达式都已经熟悉,所以学习perl正则会很轻松。这里我不打算解释基础正则的内容,而是直接介绍基础正则中不具备的但perl支持的功能。关于基础正则表达式的内容,可参阅基础正则表达式。我第一个要说明的是,perl如何使用正则。还记得当初把《精通正则表达式》的书看了一遍,把perl正则也学了个七七八八,但是学完后却不知道怎么去使用perl正则,虽然里面也介绍了一点…

    2022年5月6日
    33
  • 核PCA投影平面公式推导

    样本方差推导样本方差公式$$S=\frac{1}{n1}\sum_{i=1}^n(x_i\mu_i)^2$$扩展开来得到$$S=\frac{1}{n1}[(X\frac{1}{n}

    2021年12月30日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号