小编ale*_*xis的帖子

我怎样才能理解Python循环的`else`子句?

许多Python程序员可能没有意识到while循环和for循环的语法包含一个可选else:子句:

for val in iterable:
    do_something(val)
else:
    clean_up()
Run Code Online (Sandbox Code Playgroud)

else子句的主体是某些清理操作的好地方,并且在循环的正常终止时执行:即,退出循环returnbreak跳过该else子句; continue执行后退出.我知道这只是因为我只是看着它(再次),因为我永远记得else子句被执行.

总是?关于循环的"失败",顾名思义?定期终止?即使循环退出return?如果不抬头,我永远无法完全确定.

我责怪我对关键词选择的持续存在的不确定性:我发现else这种语义非常缺乏统一性.我的问题不是"为什么这个关键字用于此目的"(我可能会投票关闭,但只有在阅读了答案和评论后),但我怎么能想到else关键字,以便它的语义有意义,我因此能记得吗?

我确信对此有相当多的讨论,我可以想象选择是为了与try语句的else:条款(我也必须查找)保持一致,并且目标是不添加到列表中Python的保留字.也许选择的理由else将澄清其功能并使其更令人难忘,但我将名称与功能联系起来,而不是在历史解释本身之后.

这个问题的答案,我的问题简要地作为副本被关闭,包含了很多有趣的背景故事.我的问题有一个不同的焦点(如何连接else关键字选择的特定语义),但我觉得应该有一个链接到这个问题的某个地方.

python loops for-loop while-loop

187
推荐指数
11
解决办法
1万
查看次数

在多个进程之间共享结果队列

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

77
推荐指数
2
解决办法
4万
查看次数

在python中轮询键盘(检测按键)

如何从控制台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的可移植性也不错,但并不是必需的.

python keyboard console nonblocking blocking

60
推荐指数
8
解决办法
12万
查看次数

转换为(不是)ipython Notebook格式

附带IPython笔记本nbconvert,可以笔记本导出为其他格式.但是如何以相反的方向转换文本?我问,因为我已经拥有不同格式的材料和良好的工作流程,但我想利用Notebook的交互式环境.

一个可能的解决方案:可以通过导入.py文件来创建笔记本,并且文档指出当nbconvert将笔记本导出为python脚本时,它会在可用于重新创建笔记本的注释中嵌入指令.但是这些信息附带关于此方法的局限性的免责声明,并且在我能找到的任何地方都没有记录可接受的格式.(奇怪的是,在描述笔记本的JSON格式的部分中显示了一个示例).任何人都可以提供更多信息,或更好的选择吗?

编辑(2016年3月1日):已接受的答案不再有效,因为出于某种原因,Notebook API的第4版不支持此输入格式. 我添加了一个自我答案,展示了如何使用当前(v4)API导入笔记本.(我不是不接受当前的答案,因为它解决了我当时的问题并指出了我在自我回答中使用的资源.)

python ipython ipython-notebook jupyter-notebook

53
推荐指数
7
解决办法
4万
查看次数

使用.pth文件

我试图在我没有对全局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那里放一个文件,它就没有效果了.这真的不应该起作用,还是我做错了什么?

python

37
推荐指数
1
解决办法
4万
查看次数

在Python中设置分区

我有一个数组 [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 arrays combinatorics

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

从python程序中禁用散列随机化

与Python 3.3开始,哈希算法是不确定性避免某种攻击.这对于Web服务器来说很好,但是在尝试调试程序时会很痛苦:每次运行脚本时,dict内容都会以不同的顺序迭代.

一些早期版本的python有一个-R用于启用散列随机化的标志,但现在它是默认行为,该标志尚未被其相反的替换.可以通过设置环境变量来禁用随机化PYTHONHASHSEED:

PYTHONHASHSEED

如果未将此变量设置或设置为random,则使用随机值为str,bytes和datetime对象的哈希值设定种子.
如果将PYTHONHASHSEED设置为整数值,则将其用作固定种子,以生成散列随机化所涵盖类型的散列().

问题是必须在启动python进程之前设置此变量.我试着与设置os.putenv(),或在os.environ,但这些似乎都对散列方法没有效果.这并不太令人惊讶:我不希望python在每一组或字典查找之前检查环境!所以,问题仍然存在:

有没有办法让python程序禁用自己的哈希随机化?

python hash python-3.x

29
推荐指数
3
解决办法
8253
查看次数

Python中"in"的优先级

这是一个(非常基本的)语言律师问题.我理解代码的作用以及原因,所以请不要用基本的解释.

在表达式中,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语句语法的一部分.不过,我不确定如何/在哪里指定非表达式优先级.

python syntax operator-precedence

24
推荐指数
2
解决办法
1104
查看次数

在ipython笔记本中嵌入图像以便分发

我有一个ipython笔记本,带有我本地驱动器的嵌入式图像.我期待它与代码单元的输出一起嵌入JSON中,但是当我分发笔记本时,图像并没有出现在用户身上.在Notebook中嵌入图像的推荐方法是什么,如果用户重新运行代码单元,清除单元格输出等,它不会消失?

笔记本系统缓存包含的图像![label](image.png),但它们仅持续到重新启动服务于笔记本的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现有(旧)答案提供了一些非常有用的指针,但不是解决方案.

ipython ipython-notebook

16
推荐指数
2
解决办法
9098
查看次数

为什么我不能从模块别名导入?

我只是偶然发现了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

16
推荐指数
2
解决办法
2591
查看次数