小编Kev*_*evB的帖子

send(None)和Next()之间的区别

通过将yield语句重新定义为PEP 342中的表达式 - 通过增强型生成器的协同程序,Python中添加了强大的新功能.David Beasley在Python协同程序上提供了很好的演示,这是关于协同程序和并发的好奇课程.

正如PEP所述,每当通过正常的next()调用恢复生成器时,yield表达式的值为None.要实例化生成器,必须调用next()或send(None)(即最初不能发送非None值).

调用next()vs send(None)有什么好处吗?next()是一个Built_in函数,所以也许这是一个因素,但似乎没有任何其他差异.我有些惊讶,将下一个可选变量添加到Pythonic会比添加一个执行相同操作的新函数更加令人惊讶.我错过了什么吗?

这是一个简单的协程,通过将它们发送到协程来保持输入的总数.

import numbers
def running_sum() :
    g_in  = 0
    g_out = 0
    while g_in is not None :
        g_in = (yield g_out)
        if isinstance(g_in, numbers.Number) :
            g_out += g_in
        print 'in_val =',g_in,'sum =',g_out
Run Code Online (Sandbox Code Playgroud)

python generator

7
推荐指数
1
解决办法
707
查看次数

支持统一python 2/3版本的类型

我有一些用python 2.7.x编写的代码,我试图与python 3.x兼容.我已经解决了将代码转换为在两个版本下工作的大多数问题,但是想要处理int/long类型的建议.

统一int和long类型的大部分工作都发生在更早的版本(2.4.x)中,并且在V3中完全消除了区别('1L'格式不再有效).同时修改了types模块以删除对已经内置的类型的引用,并删除了冗余的"long"内置类型.

所以在V2.x下,我仍然需要支持以下代码:

if type(var) == int or type(var) == long :
     do_stuff
Run Code Online (Sandbox Code Playgroud)

要么

if type(var) == int :
     do_int_stuff
elif type(var) == long :
     do_long_stuff
Run Code Online (Sandbox Code Playgroud)

但是对于V3,没有内置类很长,并且不需要do_long_stuff与普通的do_int_stuff不同.不再定义内置类类型变量'long',因此此代码将因NameError而失败.

一个简单的解决方案是在v3下将'long'定义为None或其他一些无意义类型,理解类型(var)!= long for any var.在v2.x下定义的长内置类类型将保持不变.

if sys.version_info.major == 3 :
     long = None
Run Code Online (Sandbox Code Playgroud)

没有最好的价值吗?在我的情况下,设置'long = int'不是我想要使用的.

python python-2.7 python-3.x

3
推荐指数
1
解决办法
74
查看次数

标签 统计

python ×2

generator ×1

python-2.7 ×1

python-3.x ×1