• python yield在函数中起返回值中的使用


    yield有许多用法,原理真的搞不清,个人用了代码比较的方法,总算大致理解它作为函数返回时所起的作用:

    在下面例子中,用yield生成器来提高速度(只要函数内有yield,就是生成器了,或者叫迭代器,这个就不纠结了,他只是定义了我要用这个逻辑去找想要的结果,实际定义生成器时,代码并没有执行,执行是取回的时候发生,并且不是一次全部取回,或许是取回其中一个结果,一看已经对了,后面的执行就没有必要了,python也不会去执行了)

    LeetCode37题解(yield生成器提高速度)

    题目:

    假设题目要求得到每个排列的结果:

    考虑组合(非排列),为了避免重复,就如题中举例,划分数有大到小排列,比如6=5+1,这样1+5就不行
    递归:从6里取2作为第一个的话,剩余4再划分时,不能超过2,这样就不会出现3,2,1,然后2,3,1再来一遍的情况:

    用了yield作为return使用的程序:

    def fulldivision(n,limit):
        if n==1 or n == 0:
            yield [n,]
        else:
            for i in range(min(n,limit),0,-1):
                for result in fulldivision(n-i,i):
                    yield [i,] + result
    c = 0
    for res in fulldivision(6,6):
            c += 1
            print ('Solution %d: ' % c,res)

    不用yield,手动拼接列表,然后返回的程序(为了对比,保持了原来yield,只是注释掉)

    def fulldivision(n,limit):
        res = None        #这里要res要初始化
        if n==1 or n == 0:
            #yield [n,]
            return ((n,),)
        else:
            for i in range(min(n,limit),0,-1):
                for result in fulldivision(n-i,i):
                #    yield [i,] + result
                    if res == None:      #这里要None判别
                        res = (((i,) + result),)
                    else:
                        res =  res + (((i,) + result),)
        return res
                
    c = 0
    for res in fulldivision(6,6):
            c += 1
            print ('Solution %d: ' % c,res)

    两个程序结果一样:

    Solution 1:  (6, 0)
    Solution 2:  (5, 1)
    Solution 3:  (4, 2, 0)
    Solution 4:  (4, 1, 1)
    Solution 5:  (3, 3, 0)
    Solution 6:  (3, 2, 1)
    Solution 7:  (3, 1, 1, 1)
    Solution 8:  (2, 2, 2, 0)
    Solution 9:  (2, 2, 1, 1)
    Solution 10:  (2, 1, 1, 1, 1)
    Solution 11:  (1, 1, 1, 1, 1, 1)

  • 相关阅读:
    实现JDK代理
    Dictionary字典类介绍
    在服务器上新建虚拟机及安装系统
    开启远程桌面设置
    Windows Server 2008 R2远程协助选项灰色
    server 2012系统更改电脑密码
    eclipse + maven + scala+spark环境搭建
    C#数据路接口中获取SQL数据的用法
    C#常用快捷键
    oracle常用的快捷键
  • 原文地址:https://www.cnblogs.com/nocomment/p/13053239.html
Copyright © 2020-2023  润新知