许多Python程序员可能没有意识到while
循环和for
循环的语法包含一个可选else:
子句:
for val in iterable:
do_something(val)
else:
clean_up()
Run Code Online (Sandbox Code Playgroud)
该else
子句的主体是某些清理操作的好地方,并且在循环的正常终止时执行:即,退出循环return
或break
跳过该else
子句; continue
执行后退出.我知道这只是因为我只是看着它(再次),因为我永远记得当该else
子句被执行.
总是?关于循环的"失败",顾名思义?定期终止?即使循环退出return
?如果不抬头,我永远无法完全确定.
我责怪我对关键词选择的持续存在的不确定性:我发现else
这种语义非常缺乏统一性.我的问题不是"为什么这个关键字用于此目的"(我可能会投票关闭,但只有在阅读了答案和评论后),但我怎么能想到else
关键字,以便它的语义有意义,我因此能记得吗?
我确信对此有相当多的讨论,我可以想象选择是为了与try
语句的else:
条款(我也必须查找)保持一致,并且目标是不添加到列表中Python的保留字.也许选择的理由else
将澄清其功能并使其更令人难忘,但我将名称与功能联系起来,而不是在历史解释本身之后.
这个问题的答案,我的问题简要地作为副本被关闭,包含了很多有趣的背景故事.我的问题有一个不同的焦点(如何连接else
关键字选择的特定语义),但我觉得应该有一个链接到这个问题的某个地方.
该multiprocessing
模块的文档显示了如何将队列传递给以multiprocessing.Process
.开头的进程.但是,如何与异步工作进程共享队列apply_async
?我不需要动态加入或其他任何东西,只是工人(反复)将结果报告回基地的一种方式.
import multiprocessing
def worker(name, que):
que.put("%d is done" % name)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=3)
q = multiprocessing.Queue()
workers = pool.apply_async(worker, (33, q))
Run Code Online (Sandbox Code Playgroud)
这失败了:
RuntimeError: Queue objects should only be shared between processes through inheritance
.我理解这意味着什么,我理解继承的建议,而不是要求pickle/unpickling(以及所有特殊的Windows限制).但如何做我传递队列中一个可行的办法?我找不到一个例子,我尝试了几种以各种方式失败的替代品.请帮忙?
python queue parallel-processing multiprocessing python-multiprocessing
如何从控制台python应用程序轮询键盘?具体来说,我想在许多其他I/O活动(套接字选择,串行端口访问等)中做类似的事情:
while 1:
# doing amazing pythonic embedded stuff
# ...
# periodically do a non-blocking check to see if
# we are being told to do something else
x = keyboard.read(1000, timeout = 0)
if len(x):
# ok, some key got pressed
# do something
Run Code Online (Sandbox Code Playgroud)
在Windows上执行此操作的正确pythonic方法是什么?此外,Linux的可移植性也不错,但并不是必需的.
附带IPython笔记本nbconvert
,可以将笔记本导出为其他格式.但是如何以相反的方向转换文本?我问,因为我已经拥有不同格式的材料和良好的工作流程,但我想利用Notebook的交互式环境.
一个可能的解决方案:可以通过导入.py
文件来创建笔记本,并且文档指出当nbconvert
将笔记本导出为python脚本时,它会在可用于重新创建笔记本的注释中嵌入指令.但是这些信息附带了关于此方法的局限性的免责声明,并且在我能找到的任何地方都没有记录可接受的格式.(奇怪的是,在描述笔记本的JSON格式的部分中显示了一个示例).任何人都可以提供更多信息,或更好的选择吗?
编辑(2016年3月1日):已接受的答案不再有效,因为出于某种原因,Notebook API的第4版不支持此输入格式. 我添加了一个自我答案,展示了如何使用当前(v4)API导入笔记本.(我不是不接受当前的答案,因为它解决了我当时的问题并指出了我在自我回答中使用的资源.)
我试图在我没有对全局site-packages
目录的写访问权的系统上发现一个模块,并且不改变环境(PYTHONPATH
).我试图将.pth
文件放在与我正在执行的脚本相同的目录中,但它似乎被忽略了.例如,我创建了一个extras.pth
包含以下内容的文件:
N:\PythonExtras\lib\site-packages
Run Code Online (Sandbox Code Playgroud)
但是,打印并放置在同一目录中的以下脚本False
.
import sys
print r"N:\PythonExtras\lib\site-packages" in sys.paths
Run Code Online (Sandbox Code Playgroud)
sys.path
我有写访问权限的唯一目录是包含脚本的目录.是否有另一个(目前不存在的)目录,我可以放置extras.pth
并让它被看到?有没有更好的方法来解决这个问题?
我在Windows上使用python 2.7..pth
我在这里可以找到的所有问题都使用系统模块目录.
编辑:我已经跟踪了Windows每用户安装目录%APPDATA%\Python\Python27\site-packages
.我可以在那里放置一个模块,它将被导入,但如果我在.pth
那里放一个文件,它就没有效果了.这真的不应该起作用,还是我做错了什么?
我有一个数组 [1,2,3]
我想使用数组的所有元素进行所有可能的组合:
结果:
[[1], [2], [3]]
[[1,2], [3]]
[[1], [2,3]]
[[1,3], [2]]
[[1,2,3]]
Run Code Online (Sandbox Code Playgroud) 与Python 3.3开始,哈希算法是不确定性腌避免某种攻击.这对于Web服务器来说很好,但是在尝试调试程序时会很痛苦:每次运行脚本时,dict内容都会以不同的顺序迭代.
一些早期版本的python有一个-R
用于启用散列随机化的标志,但现在它是默认行为,该标志尚未被其相反的替换.可以通过设置环境变量来禁用随机化PYTHONHASHSEED
:
PYTHONHASHSEED
如果未将此变量设置或设置为random,则使用随机值为str,bytes和datetime对象的哈希值设定种子.
如果将PYTHONHASHSEED设置为整数值,则将其用作固定种子,以生成散列随机化所涵盖类型的散列().
问题是必须在启动python进程之前设置此变量.我试着与设置os.putenv()
,或在os.environ
,但这些似乎都对散列方法没有效果.这并不太令人惊讶:我不希望python在每一组或字典查找之前检查环境!所以,问题仍然存在:
有没有办法让python程序禁用自己的哈希随机化?
这是一个(非常基本的)语言律师问题.我理解代码的作用以及原因,所以请不要用基本的解释.
在表达式中,in
具有更高的优先级比and
.所以,如果我写
if n in "seq1" and "something":
...
Run Code Online (Sandbox Code Playgroud)
它被解释就像
if (n in "seq1") and "something":
...
Run Code Online (Sandbox Code Playgroud)
然而,in
一个的for
循环具有的优先级低于and
(其实它有,否则下面的是一个语法错误).因此,如果Python初学者写道
for n in "seq1" and "something":
...
Run Code Online (Sandbox Code Playgroud)
......,它相当于:
for n in ("seq1" and "something"):
...
Run Code Online (Sandbox Code Playgroud)
(如果"seq1"是真实的,则评估为for n in "something"
).
那么,问题是:in
指定/记录for循环关键字的优先级在哪里?我理解这n in ...
不是这个上下文中的表达式(它没有值),但它是for
语句语法的一部分.不过,我不确定如何/在哪里指定非表达式优先级.
我有一个ipython笔记本,带有我本地驱动器的嵌入式图像.我期待它与代码单元的输出一起嵌入JSON中,但是当我分发笔记本时,图像并没有出现在用户身上.在Notebook中嵌入图像的推荐方法是什么,如果用户重新运行代码单元,清除单元格输出等,它不会消失?
笔记本系统缓存包含的图像
,但它们仅持续到重新启动服务于笔记本的python"内核".如果我重命名磁盘上的图像文件,我可以关闭并重新打开笔记本,它仍然显示图像; 但是当我重新启动内核时它会消失.
编辑:如果我生成一个图像作为代码单元格输出,然后将笔记本导出为html,图像嵌入在html中作为编码数据.当然必须有一种方法来挂钩这个功能并将输出加载到降价(或更好的"原始nbconvert")单元格?
from IPython.display import Image
Image(filename='imagename.png')
Run Code Online (Sandbox Code Playgroud)
将导出(with ipython nbconvert
)到包含以下内容的html:
<div class="output_png output_subarea output_execute_result">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnAAAAFgCAYAAAA...
</div>
Run Code Online (Sandbox Code Playgroud)
但是,即使我手动将此片段嵌入到markdown单元格中,也无法显示图像.我究竟做错了什么?
PS现有(旧)答案提供了一些非常有用的指针,但不是解决方案.
我只是偶然发现了python中的这种意外行为(2.7和3.x):
>>> import re as regexp
>>> regexp
<module 're' from '.../re.py'>
>>> from regexp import search
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'regexp'
Run Code Online (Sandbox Code Playgroud)
当然是from re import search
成功的,就像我创建别名之前一样.但为什么我不能使用别名regexp
(现在是一个已知模块)作为导入名称的来源?
此设置你的,只要有一个模块的多个变种一个讨厌的惊喜:说我仍在使用Python 2和我想使用的C版pickle
,cPickle
.如果我然后尝试从中导入一个名称pickle
,它将从简单pickle
模块中获取(我不会注意到它,因为它不会引发错误!)
>>> import cPickle as pickle
>>> from pickle import dump
>>> import inspect
>>> inspect.getsourcefile(dump)
'.../python2.7/pickle.py' # Expected cPickle.dump
Run Code Online (Sandbox Code Playgroud)
哎呀!
闲逛我看到,sys.modules
包括真正的模块名称(re
或者cPickle
,而不是别名regexp
或 …
python ×9
ipython ×2
arrays ×1
blocking ×1
console ×1
for-loop ×1
hash ×1
keyboard ×1
loops ×1
nonblocking ×1
python-3.x ×1
queue ×1
syntax ×1
while-loop ×1