在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
我一直在尝试多处理,并使用守护进程运行到一个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) 在Clojure中,有一个高阶函数reductions,你可以使用类似的参数,reduce并返回一个包含所有中间结果的序列.
Common Lisp中是否有等价物?我无法在网上找到任何参考资料,包括https://common-lisp.net/tutorials/上的各种书籍/文章,但鉴于Lisp作为一系列List Processing语言的遗产,我想象一下list-> list函数就像reductions将存在于方言之间.
在源示例和具有某种程度的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) 我无法理解以下代码的含义:
begin = None
while begin != "":
begin = (raw_input("\nBegin:"))
Run Code Online (Sandbox Code Playgroud)
什么begin !=""意思?空字符串""代表什么?
在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转换会导致类型推断如此不同?