小编zeh*_*ard的帖子

列表是否理解为Python 3中的`list(generator expression)`的语法糖?

在Python 3中,列表理解只是语法糖,用于生成list函数的生成器表达式?

例如是以下代码:

squares = [x**2 for x in range(1000)]
Run Code Online (Sandbox Code Playgroud)

实际上在后台转换成以下内容?

squares = list(x**2 for x in range(1000))
Run Code Online (Sandbox Code Playgroud)

我知道输出是相同的,并且Python 3修复了列表推导所具有的周围命名空间的令人惊讶的副作用,但就CPython解释器所做的事情而言,前者转换为后者,或者是否有任何区别在如何执行代码?

背景

我发现,在评论部分等价的这一主张这个问题,和快速谷歌搜索显示了同样的要求正在作出这里.

在Python 3.0文档中的新内容中也提到了这一点,但措辞有些含糊:

还要注意,列表推导具有不同的语义:它们更接近于list()构造函数中的生成器表达式的语法糖,特别是循环控制变量不再泄漏到周围的范围中.

python list-comprehension generator-expression python-3.x python-internals

33
推荐指数
3
解决办法
2249
查看次数

为什么Python多处理守护进程不能打印到标准输出?

我一直在尝试多处理,并使用守护进程运行到一个mindblock.

我有一个守护进程和一个非守护进程,守护进程每隔一秒无限期地发出输出,而非守护进程在启动时立即打印输出,休眠3秒,然后再次打印并返回.

问题是,守护进程的预期输出根本没有显示出来.

回顾过去关于守护进程的SO问题,常见问题似乎是在守护进程之前结束的其他进程,或者需要刷新以显示输出的stdout.两者都(我认为)已得到解决,但我仍然只看到来自非守护进程的打印输出.

代码:

from multiprocessing import Process, current_process
import sys
import time

def worker():
    """
    Announce that the process has started, sleep 3 seconds
    then announce that the process is ending.
    """
    name = current_process().name
    print name, 'starting...'
    sys.stdout.flush()

    time.sleep(3)
    print name, 'ending...'
    sys.stdout.flush()

    return


def daemon():
    """
    Announce that the process has started, beep, then beep
    once every second
    """
    name = current_process().name
    print name, 'starting...'
    print 'beep...'
    sys.stdout.flush()

    while True:
        time.sleep(1)
        print 'beep...'
        sys.stdout.flush() …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

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

用于"减少和返回中间结果作为序列"的Common Lisp函数

在Clojure中,有一个高阶函数reductions,你可以使用类似的参数,reduce并返回一个包含所有中间结果的序列.

Common Lisp中是否有等价物?我无法在网上找到任何参考资料,包括https://common-lisp.net/tutorials/上的各种书籍/文章,但鉴于Lisp作为一系列List Processing语言的遗产,我想象一下list-> list函数就像reductions将存在于方言之间.

clojure common-lisp

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

为什么在访问Python对象属性时使用getattr()而不是__dict__?

在源示例和具有某种程度的Python对象内省的SO答案中,常见的模式是:

getattr(some_object, attribute_name_string)
Run Code Online (Sandbox Code Playgroud)

是否有理由将此模式作为首选:

some_object.__dict__[attribute_name_string]
Run Code Online (Sandbox Code Playgroud)

这似乎更直接地显示了正在发生的事情?是因为后者太接近CPython中可能会发生变化的特定实现吗?

NB原始问题错误地将流行的成语识别为:

some_object.__getattr__(attribute_name_string)
Run Code Online (Sandbox Code Playgroud)

python introspection

2
推荐指数
1
解决办法
822
查看次数

python中的空字符串?

我无法理解以下代码的含义:

begin = None 
while begin != "": 
    begin = (raw_input("\nBegin:"))
Run Code Online (Sandbox Code Playgroud)

什么begin !=""意思?空字符串""代表什么?

python string variables

2
推荐指数
1
解决办法
851
查看次数

为什么let f = List.map fst与let gx = List.map fst x之间的推断类型不同

在OCaml中,推断的类型

let f = List.map fst
Run Code Online (Sandbox Code Playgroud)

val f : ('_weak1 * '_weak2) list -> '_weak1 list = <fun>
Run Code Online (Sandbox Code Playgroud)

而推断的类型

val f : ('_weak1 * '_weak2) list -> '_weak1 list = <fun>
Run Code Online (Sandbox Code Playgroud)

val g : ('a * 'b) list -> 'a list = <fun>
Run Code Online (Sandbox Code Playgroud)

(类型取自utop)。

结果,f不能多态使用,而g可以。

为什么纯函数之间的这种eta转换会导致类型推断如此不同?

ocaml

2
推荐指数
1
解决办法
68
查看次数