Python中文
首页
教程
问答
标签
搜索
登录
注册
从函数返回多个值的最佳方法?
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<div> </div> <p>在支持它的语言中,返回多个值的规范方法通常是<a href="https://stackoverflow.com/questions/38508/whats-the-best-way-to-return-multiple-values-from-a-function-in-python">tupling</a></p> <h3>选项:使用元组</h3> <P>考虑这个平凡的例子:</P> <pre><code>def f(x): y0 = x + 1 y1 = x * 3 y2 = y0 ** y3 return (y0, y1, y2) </code></pre> <p>但是,随着返回的值数量的增加,这很快就会出现问题。如果要返回四个或五个值,该怎么办?当然,您可以继续对它们进行元组化,但很容易忘记哪个值在哪里。无论你想在哪里收到它们,把它们拆开也是相当难看的</p> <h3>选项:使用字典</h3> <p>下一个合乎逻辑的步骤似乎是引入某种“记录符号”。在Python中,实现这一点的明显方法是使用<code>dict</code></p> <P>考虑如下:</P> <pre><code>def g(x): y0 = x + 1 y1 = x * 3 y2 = y0 ** y3 return {'y0': y0, 'y1': y1 ,'y2': y2} </code></pre> <p>(需要明确的是,y0、y1和y2只是作为抽象标识符。正如所指出的,在实践中,您将使用有意义的标识符。)</p> <p>现在,我们有了一种机制,可以通过它投射出返回对象的特定成员。比如说,</p> <pre><code>result['y0'] </code></pre> <h3>选项:使用类</h3> <p>然而,还有另一种选择。我们可以返回一个专门的结构。我已经在Python的上下文中构建了这个框架,但我确信它也适用于其他语言。事实上,如果你在C语言中工作,这很可能是你唯一的选择。下面是:</p> <pre><code>class ReturnValue: def __init__(self, y0, y1, y2): self.y0 = y0 self.y1 = y1 self.y2 = y2 def g(x): y0 = x + 1 y1 = x * 3 y2 = y0 ** y3 return ReturnValue(y0, y1, y2) </code></pre> <p>在Python中,前两个在管道方面可能非常相似-毕竟<code>{ y0, y1, y2 }</code>只是最终成为<code>ReturnValue</code>的内部<code>__dict__</code>中的条目</p> <p>Python为微小对象提供了一个额外的特性,即<code>__slots__</code>属性。该类可表示为:</p> <pre><code>class ReturnValue(object): __slots__ = ["y0", "y1", "y2"] def __init__(self, y0, y1, y2): self.y0 = y0 self.y1 = y1 self.y2 = y2 </code></pre> <p>从<a href="http://www.network-theory.co.uk/docs/pylang/__slots__.html" rel="noreferrer">Python Reference Manual</a>开始:</p> <blockquote> <p>The <code>__slots__</code> declaration takes a sequence of instance variables and reserves just enough space in each instance to hold a value for each variable. Space is saved because <code>__dict__</code> is not created for each instance.</p> </blockquote> <h3>选项:使用<a href="https://docs.python.org/3/library/dataclasses.html" rel="noreferrer">dataclass</a>(Python 3.7+)</h3> <p>使用Python 3.7的新数据类,返回一个包含自动添加的特殊方法、键入和其他有用工具的类:</p> <pre><code>@dataclass class Returnvalue: y0: int y1: float y3: int def total_cost(x): y0 = x + 1 y1 = x * 3 y2 = y0 ** y3 return ReturnValue(y0, y1, y2) </code></pre> <h3>选项:使用列表</h3> <p>我忽略的另一个建议来自蜥蜴比尔:</p> <pre><code>def h(x): result = [x + 1] result.append(x * 3) result.append(y0 ** y3) return result </code></pre> <p>这是我最不喜欢的方法。我想我受到了哈斯克尔的影响,但是混合类型列表的想法总是让我感到不舒服。在这个特定的示例中,列表不是混合类型,但可以想象它是混合类型</p> <p>据我所知,以这种方式使用的列表实际上对元组没有任何好处。Python中列表和元组之间唯一的真正区别是列表是<a href="http://docs.python.org/library/stdtypes.html#typesseq-mutable" rel="noreferrer">mutable</a>,而元组不是</p> <p>我个人倾向于继承函数式编程的惯例:对任意数量的相同类型的元素使用列表,对固定数量的预定类型的元素使用元组</p> <h2>问题:</h2> <p>在冗长的序言之后,出现了一个不可避免的问题。你认为哪种方法最好</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>许多答案表明您需要返回某种类型的集合,如字典或列表。您可以省去额外的语法,只需写出返回值,以逗号分隔。注意:这在技术上返回一个元组</p> <pre><code>def f(): return True, False x, y = f() print(x) print(y) </code></pre> <p>给出:</p> <pre><code>True False </code></pre>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
Python中两个字典的交集
2 回答
python中两个字符串上的异或操作数?
6 回答
Python中两个字符串中的类似句子
1 回答
Python中两个字符串之间的Hamming距离
5 回答
python中两个字符串之间的匹配模式
10 回答
python中两个字符串之间的按位或
2 回答
python中两个字符串之间的数据(字节)切片
8 回答
python中两个字符串之间的模式
1 回答
python中两个字符串作为子字符串的区别
8 回答
Python中两个字符串元组的比较
1 回答
Python中两个字符串列表中的公共字符串
1 回答
python中两个字符串的Anagram测试
2 回答
Python中两个字符串的正则匹配
5 回答
python中两个字符串的笛卡尔乘积
4 回答
Python中两个字符串相似性的比较
10 回答
python中两个字符串语义相似度的求法
3 回答
Python中两个字符置换成固定长度的字符串,每个字符的数目相等
5 回答
Python中两个对数方程之间的插值和平滑数据
9 回答
Python中两个对象之间的And/Or运算符
8 回答
python中两个嵌套字典中相似键的和值
9 回答