python - 函数返回多个值是pythonic吗?

在python中,您可以让函数返回多个值。 这是一个人为的例子:

def divide(x, y):

quotient = x/y

remainder = x % y

return quotient, remainder

(q, r) = divide(22, 7)

这似乎非常有用,但看起来它也可能被滥用(“嗯......功能X已经计算出我们需要的中间值。让我们让X返回那个值”)。

你什么时候画线并定义一个不同的方法?

9个解决方案

98 votes

绝对(就你提供的例子而言)。

元组是Python中的一等公民

内置函数(x, y)就是这样做的。

q, r = divmod(x, y) # ((x - x%y)/y, x%y) Invariant: div*y + mod == x

还有其他例子:(x, y),Point(x, y),dict.items。

for i, e in enumerate([1, 3, 3]):

print "index=%d, element=%s" % (i, e)

# reverse keys and values in a dictionary

d = dict((v, k) for k, v in adict.items()) # or

d = dict(zip(adict.values(), adict.keys()))

顺便说一下,括号在大多数情况下都不是必需的。Python库参考引文:

元组可以通过多种方式构建:

使用一对括号表示空元组:()

对单例元组使用尾随逗号:a或(a,)

用逗号分隔项目:a,b,c或(a,b,c)

使用内置的元组():tuple()或元组(可迭代)

功能应该用于单一目的

因此他们应该返回一个对象。 在你的情况下,这个对象是一个元组。 将元组视为ad-hoc复合数据结构。 有些语言几乎每个函数都返回多个值(Lisp中的列表)。

有时返回(x, y)而不是Point(x, y)就足够了。

命名为元组

通过在Python 2.6中引入命名元组,在许多情况下,最好返回命名元组而不是普通元组。

>>> import collections

>>> Point = collections.namedtuple('Point', 'x y')

>>> x, y = Point(0, 1)

>>> p = Point(x, y)

>>> x, y, p

(0, 1, Point(x=0, y=1))

>>> p.x, p.y, p[0], p[1]

(0, 1, 0, 1)

>>> for i in p:

... print(i)

...

0

1

jfs answered 2019-05-24T08:17:00Z

26 votes

首先,请注意Python允许以下内容(不需要括号):

q, r = divide(22, 7)

关于你的问题,任何方式都没有硬性规定。 对于简单(通常是人为的)示例,似乎给定函数始终可以具有单一目的,从而产生单个值。 但是,在将Python用于实际应用程序时,很快就会遇到需要返回多个值的许多情况,从而使代码更加清晰。

所以,我会说做任何有意义的事情,不要试图遵循一个人为的约定。 Python支持多个返回值,因此请在适当时使用它。

Jason Etheridge answered 2019-05-24T08:17:56Z

12 votes

你给出的例子实际上是一个python内置函数,名为divmod。所以有人在某个时间点认为它是pythonic足以包含在核心功能中。

对我而言,如果它使代码更清晰,它就是pythonic。 比较这两个代码块:

seconds = 1234

minutes, seconds = divmod(seconds, 60)

hours, minutes = divmod(minutes, 60)

seconds = 1234

minutes = seconds / 60

seconds = seconds % 60

hours = minutes / 60

minutes = minutes % 60

Nathan Jones answered 2019-05-24T08:18:33Z

3 votes

是的,返回多个值(即元组)肯定是pythonic。 正如其他人所指出的那样,Python标准库中有很多例子,以及备受推崇的Python项目。 另外两条评论:

返回多个值有时非常非常有用。 例如,采用可选地处理事件的方法(在执行此操作时返回一些值)并返回成功或失败。 这可能出现在一系列责任模式中。 在其他情况下,您希望返回多个紧密相连的数据 - 如给出的示例所示。 在此设置中,返回多个值类似于返回具有多个成员变量的匿名类的单个实例。

Python对方法参数的处理需要能够直接返回多个值。 例如,在C ++中,方法参数可以通过引用传递,因此除了正式的返回值之外,您还可以为它们分配输出值。 在Python中,参数是“通过引用”传递的(但在Java意义上,而不是C ++)。 您不能将新值分配给方法参数,并将其反映在方法范围之外。 例如:

// C++

void test(int& arg)

{

arg = 1;

}

int foo = 0;

test(foo); // foo is now 1!

与之比较:

# Python

def test(arg):

arg = 1

foo = 0

test(foo) # foo is still 0

zweiterlinde answered 2019-05-24T08:19:43Z

1 votes

它绝对是pythonic。 事实上,您可以使用C语言从函数中返回多个值,您需要为某些类型的组合定义结构。

但是,如果你达到了从单个函数返回10个值的疯狂点的地步,你应该认真考虑将它们捆绑在一个类中,因为那时它变得笨拙。

indentation answered 2019-05-24T08:20:24Z

1 votes

返回一个元组很酷。 另请注意新的namedtuple这是在python 2.6中添加的,这可能会让你更适合你:[http://docs.python.org/dev/library/collections.html#collections.namedtuple]

pixelbeat answered 2019-05-24T08:20:58Z

1 votes

我对Python很新,但对我来说,元组技术看起来非常pythonic。 但是,我有另一个可能提高可读性的想法。 使用字典允许按名称而不是位置访问不同的值。 例如:

def divide(x, y):

return {'quotient': x/y, 'remainder':x%y }

answer = divide(22, 7)

print answer['quotient']

print answer['remainder']

Fred Larson answered 2019-05-24T08:21:27Z

1 votes

OT:RSRE的Algol68有一个好奇的“/:=”运算符。 例如。

INT quotient:=355, remainder;

remainder := (quotient /:= 113);

给出3的商,剩余的16。

注意:通常会丢弃“(x /:= y)”的值,因为商“x”是通过引用分配的,但在RSRE的情况下,返回的值是余数。

C.F. 整数算术 - Algol68

NevilleDNZ answered 2019-05-24T08:22:35Z

0 votes

对于像divmod这样的简单函数,使用元组返回多个值是很好的。如果它使代码可读,那就是Pythonic。

如果返回值开始变得混乱,请检查该函数是否执行过多,如果是,则将其拆分。 如果像对象一样使用大元组,则将其作为对象。 另外,请考虑使用命名元组,它将成为Python 2.6中标准库的一部分。

Will Harris answered 2019-05-24T08:23:14Z

python函数可以返回多个函数值吗_python - 函数返回多个值是pythonic吗?相关推荐

  1. python函数只有被调用才会执行_Python函数

    1.函数的定义 python内置了很多函数,可以直接调用,多数情况下,还需要自定义函数,自定义函数的主体,换行的缩进表示代码属于该函数.定义的函数只有被调用的时候才会执行.函数只有有返回值的情况下才可 ...

  2. python不允许使用关键字作为变量名_python函数变量_python不允许使用关键字作为变量名,允许使用内置函数名作为变量名,但这会改变函数 - 云+社区 - 腾讯云...

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建. 在python 中, ...

  3. python函数中可变参数的传递方式是_Python函数可变参数定义及其参数传递方式实例详解...

    本文实例讲述了Python函数可变参数定义及其参数传递方式.分享给大家供大家参考.具体分析如下: python中 函数不定参数的定义形式如下: 1.func(*args) 传入的参数为以元组形式存在a ...

  4. python在json文件中查找指定数据_Python中json的取值 如何使用python提取json中指定字段的数据...

    python中为什么用json有什么作用 如何用python读取json里面的值啊我爱你,所以我给了你伤害我的权力,只要我能忍受,我会一直陪伴着你,但你不能伤害我太多. 数据如下,我想要读取name. ...

  5. python中如何替换某列特定数值_python 怎么根据两列值,修改对应的某列值,其中一列的为需要修改的列标题...

    自己造了些数据,不知道是否符合题主的意思. 原始数据: no wrong_item 0 001 a 1 003 a 2 002 b 3 004 c 处理后结果: Out[1]: no a b c 0 ...

  6. python返回函数值并退出函数_Python函数的返回值和作用域

    函数的返回值和作用域 1.返回值 def guess(x): if x > 3: return "> 3" else: return "<= 3&quo ...

  7. python返回函数值并退出函数_python3函数中如何退出程序

    在定义python3函数时,以 def关键词开头,后接函数标识符名称和圆括号 (),可以无返回值,也可以有返回值.那么,python3函数中如何退出程序? 工具/原料 python pycharm 截 ...

  8. python函数实例解析_python支持返回函数的实例解析

    这篇文章主要介绍了python支持返回函数的实例解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近接触python,看到了python中返回函数的概念,以前只接触过 ...

  9. python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数返回浮点数

    python使用numpy的np.float_power函数计算numpy数组中每个数值的指定幂次(例如平方.立方).np.power函数默认返回整数格式.np.float_power函数默认返回浮点 ...

  10. python使用numpy的np.power函数计算numpy数组中每个数值的指定幂次(例如平方、立方)、np.power函数默认返回整数格式、np.float_power函数默认返回浮点数

    python使用numpy的np.power函数计算numpy数组中每个数值的指定幂次(例如平方.立方).np.power函数默认返回整数格式.np.float_power函数默认返回浮点数 目录

最新文章

  1. 阿里云rds mysql数据库数据恢复到ecs中
  2. Linux上新建用户及赋权操作
  3. Python 5种不为人知的高级特征
  4. Android之View绘制流程开胃菜---setContentView(...)详细分析
  5. 安装meme_我见过的最好JavaScript Meme,详细说明了
  6. 微信公众号模板消息 access_token missing
  7. 如何彻底卸载3dmax2020_3DMax如何才能彻底卸载干净啊?
  8. 线阵相机与面阵相机的区别在哪里?
  9. php 许愿墙 阶段案例_PHP+jQueryUI实现许愿墙功能、贴便签、贴标签功能(案例)...
  10. 斯坦福大学公开课 :Andrew Ng 机器学习课堂笔记之第一节(机器学习的动机与应用)
  11. oracle rman optimization,Oracle rman备份的使用(转)
  12. linux查看统计数据命令,查看,统计、正则表达式――Linux基本命令(9)
  13. Codesys电子凸轮功能的设计与可视化仿真
  14. C语言编程从键盘输入n
  15. 如何协助企业IT架构转型
  16. 产品读书《麦肯锡工作法:麦肯锡精英的39个工作习惯》
  17. 计算机网络自顶向下第一章读书笔记
  18. 【洞察人性】 理解行为背后的动机
  19. 计算机英语论文及翻译,计算机英语 论文翻译例子(初级)
  20. 数据结构算法设计题 (超详细)

热门文章

  1. AngularJS开发指南10:AngularJS依赖注入的详解
  2. CentOS上安装Git
  3. Grails 技巧 - View 篇
  4. HENXU-SOA的业务规划和建模方法之八——组件化业务模型(CBM)介绍
  5. 如何解决It's likely you're attempting to run Eclipse using the JRE instead of the JDK
  6. js高级学习笔记(b站尚硅谷)-6-IIFE
  7. nginx访问日志配置及访问日志切割实战
  8. Linux远程传输命令scp、rsync(tar打包归档并在系统之间传输文件)
  9. pe修改rpc服务器不可用,电脑rpc服务器不可用,教你电脑rpc服务器不可用怎么解决...
  10. python科赫曲线编程实现雪花下落的效果_基于python绘制科赫雪花