小编saf*_*fsd的帖子

如何从函数返回多个值?

在支持它的语言中返回多个值的规范方法通常是tupling.

选项:使用元组

考虑这个简单的例子:

def f(x):
  y0 = x + 1
  y1 = x * 3
  y2 = y0 ** y3
  return (y0, y1, y2)
Run Code Online (Sandbox Code Playgroud)

但是,随着返回值的增加,这很快就会出现问题.如果您想要返回四个或五个值,该怎么办?当然,你可以保持它们的组合,但很容易忘记哪个值在哪里.在任何想要接收它们的地方解压缩它们也相当丑陋.

选项:使用字典

下一个合乎逻辑的步骤似乎是引入某种"记录符号".在python中,显而易见的方法是通过a dict.

考虑以下:

def g(x):
  y0 = x + 1
  y1 = x * 3
  y2 = y0 ** y3
  return {'y0': y0, 'y1': y1 ,'y2': y2}
Run Code Online (Sandbox Code Playgroud)

(编辑 - 要清楚,y0,y1和y2只是作为抽象标识符.正如所指出的,在实践中你会使用有意义的标识符)

现在,我们有一个机制,我们可以在其中投射返回对象的特定成员.例如,

result['y0']
Run Code Online (Sandbox Code Playgroud)

选项:使用课程

但是,还有另一种选择.我们可以返回一个专门的结构.我已经在Python的上下文中对此进行了构建,但我确信它也适用于其他语言.事实上,如果你在C工作,这可能是你唯一的选择.开始:

class ReturnValue:
  def __init__(self, y0, y1, y2):
     self.y0 = y0
     self.y1 = y1
     self.y2 = y2

def …
Run Code Online (Sandbox Code Playgroud)

python coding-style return return-value

1011
推荐指数
12
解决办法
111万
查看次数

如何从生成器构建numpy数组?

如何从生成器对象中构建numpy数组?

让我来说明一下这个问题:

>>> import numpy
>>> def gimme():
...   for x in xrange(10):
...     yield x
...
>>> gimme()
<generator object at 0x28a1758>
>>> list(gimme())
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numpy.array(xrange(10))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> numpy.array(gimme())
array(<generator object at 0x28a1758>, dtype=object)
>>> numpy.array(list(gimme()))
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
Run Code Online (Sandbox Code Playgroud)

在这个例子中,gimme()是我想要变成数组的输出的生成器.但是,数组构造函数不会迭代生成器,它只是存储生成器本身.我想要的行为来自numpy.array(list(gimme())),但我不想支付同时在内存中使用中间列表和最终数组的内存开销.有更节省空间的方式吗?

python numpy generator

146
推荐指数
4
解决办法
5万
查看次数

如何在Vim中的多行重复编辑?

我知道在Vim我经常可以通过在它前面添加一个数字来重复命令.例如,可以通过以下方式删除5行:

5dd
Run Code Online (Sandbox Code Playgroud)

例如,通常还可以指定一系列行来应用命令

:10,20s:hello:goodbye:gc
Run Code Online (Sandbox Code Playgroud)

如何执行"垂直编辑"?例如,我想在给定的每一行的开头(跳过空格,即你在命令模式下按Shift-I键入逗号后得到的内容)中插入一个特殊的符号,比如一个逗号.范围.如何实现这一目标(不采用下行周期 - 下降期)?

vim

113
推荐指数
7
解决办法
8万
查看次数

我怎么告诉git总是选择我的本地版本来解决特定文件上的冲突合并?

假设我通过git存储库与某人合作,并且有一个特定的文件,我永远不想接受任何外部更改.

有没有办法让我设置我的本地仓库,以便每当我拉动时不抱怨冲突的合并?我想在合并此文件时始终选择我的本地版本.

git git-merge

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

如何防止Python中的KeyboardInterrupt中断代码块?

我正在编写一个程序,通过pickle模块缓存一些结果.此刻发生的情况是,如果我在dump操作发生时按下ctrl-c,则会dump中断并且生成的文件已损坏(即只是部分写入,因此无法load再次编辑.

有没有办法制作dump,或者通常是一段代码,不间断?我目前的解决方法看起来像这样:

try:
  file = open(path, 'w')
  dump(obj, file)
  file.close()
except KeyboardInterrupt:
  file.close()
  file.open(path,'w')
  dump(obj, file)
  file.close()
  raise
Run Code Online (Sandbox Code Playgroud)

如果它被中断,重启操作似乎很愚蠢,所以我正在寻找一种推迟中断的方法.我该怎么做呢?

python

51
推荐指数
5
解决办法
2万
查看次数

在打包Python项目时将zip_safe设置为True有什么好处?

setuptools文档仅指出:

为了获得最佳性能,最好将Python包安装为zip文件.但是,并非所有软件包都能够以压缩格式运行,因为它们可能希望能够像普通操作系统文件一样访问源代码或数据文件.因此,setuptools可以将您的项目安装为zipfile或目录,其默认选项由项目的zip_safe标志(引用)决定.

实际上,获得的性能优势是什么?是否值得调查我的项目是否是拉链安全的,或者这些好处通常是最小的?

python packaging setuptools

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

如何确定numpy数组是否包含整数?

我知道有一个简单的解决方案,但目前似乎无法找到它.

给定一个numpy数组,我需要知道数组是否包含整数.

检查dtype本身是不够的,因为有多个int dtypes(int8,int16,int32,int64 ...).

python numpy

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

在Python中从离散像素值绘制图像的最快方法是什么?

我希望基于计算的像素值绘制图像,作为可视化某些数据的手段.基本上,我希望采用二维矩阵颜色三元组并渲染它.

请注意,这不是图像处理,因为我没有变换现有图像,也没有进行任何形式的全图像变换,而且它也不是矢量图形,因为我正在渲染的图像没有预先确定的结构 - 我可能会一次生成一个像素的无定形色块.

我现在需要渲染大约1kx1k像素的图像,但是可扩展的东西会很有用.最终目标格式是PNG或任何其他无损格式.

我一直在通过ImageDraw的draw.point使用PIL,我想知道,鉴于我需要的非常具体和相对基本的功能,是否有更快的库可用?

python image python-imaging-library

36
推荐指数
3
解决办法
5万
查看次数

如何在lxml中使用带有find/findall的xml命名空间?

我正在尝试解析OpenOffice ODS电子表格中的内容.ods格式本质上只是一个包含许多文档的zipfile.电子表格的内容存储在'content.xml'中.

import zipfile
from lxml import etree

zf = zipfile.ZipFile('spreadsheet.ods')
root = etree.parse(zf.open('content.xml'))
Run Code Online (Sandbox Code Playgroud)

电子表格的内容位于单元格中:

table = root.find('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table')
Run Code Online (Sandbox Code Playgroud)

我们也可以直接寻找行:

rows = root.findall('.//{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table-row')
Run Code Online (Sandbox Code Playgroud)

各个元素知道命名空间:

>>> table.nsmap['table']
'urn:oasis:names:tc:opendocument:xmlns:table:1.0'
Run Code Online (Sandbox Code Playgroud)

如何在find/findall中直接使用命名空间?

显而易见的解决方案不起作用.

试图从表中获取行:

>>> root.findall('.//table:table')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "lxml.etree.pyx", line 1792, in lxml.etree._ElementTree.findall (src/lxml/lxml.etree.c:41770)
  File "lxml.etree.pyx", line 1297, in lxml.etree._Element.findall (src/lxml/lxml.etree.c:37027)
  File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 225, in findall
    return list(iterfind(elem, path))
  File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 200, in iterfind
    selector = _build_path_iterator(path)
  File "/usr/lib/python2.6/dist-packages/lxml/_elementpath.py", line 184, in _build_path_iterator …
Run Code Online (Sandbox Code Playgroud)

python xml lxml elementtree xml-namespaces

26
推荐指数
3
解决办法
2万
查看次数

在Python中将对象转换为子类?

假设我有一个库函数,我无法更改它产生类A的对象,我创建了一个继承自A的类B.

使用库函数生成B类对象最直接的方法是什么?

编辑 - 我在评论中被问到更多细节,所以这里有:

PyTables是一个在python中处理分层数据集的包.我最常用的是它能够管理部分在磁盘上的数据.它提供了一个'Array'类型,它只带有扩展切片,但我需要选择任意行.Numpy提供此功能 - 您可以通过提供与您选择的阵列长度相同的布尔数组来进行选择.因此,我想将Array子类化以添加此新功能.

从更抽象的意义上说,这是我之前考虑过的一个问题.通常的解决方案就像已经建议的那样 - 有一个B的构造函数,它接受一个A和另外的参数,然后拉出A的相关位以插入到B.因为它看起来像一个相当基本的问题,我问了一个问题看看是否有任何我不知道的标准解决方案.

python

25
推荐指数
3
解决办法
2万
查看次数