python 一行函数定义

Posted

技术标签:

【中文标题】python 一行函数定义【英文标题】:python one line function definition 【发布时间】:2013-05-21 07:21:35 【问题描述】:

这一定很简单,但作为一个偶尔使用的 python 用户,会遇到一些语法问题。 这有效:

def perms (xs):
    for x in itertools.permutations(xs): yield list(x) 

但这不会解析:

def perms (xs): for x in itertools.permutations(xs): yield list(x) 

单行函数语法有什么限制吗? 正文定义 (for...) 本身可以是两行或一行,而 def: 可以是带有简单正文的一或两行,但将两者结合起来会失败。 有没有排除这个的语法规则?

【问题讨论】:

Python 3.3 上的 FTR def perms (xs): yield from map(list, itertools.permutations(xs)) 作为偶尔使用 Python 的用户,您应该尝试并了解在 Python 中,布局很重要。可读性远比能够编写单行代码重要得多。如果有疑问,如果您必须维护它,请让它看起来像您希望看到的那样。 我知道布局很重要,因为第一个版本使用它并且有效。可读性是主观的,这种简单的东西的单行样式是我想要的,而且我想更好地理解语法问题。 【参考方案1】:

如果您必须有一行,只需将其设为lambda

perms = lambda xs: (list(x) for x in itertools.permutations(xs))

通常,当您有一个用于生成数据的短 for 循环时,您可以将其替换为列表推导式或生成器表达式,以在略小的空间内获得大致相同的易读性。

【讨论】:

谢谢 - 很好的答案,非常有帮助 - 但由于我只能检查一个作为“答案”并且正在寻找语法规则,所以我检查了上面的一个。 @guthrie - 完全没有问题 - 这绝对只是对 Lennart 出色答案的补充 :-) 你也可以使用一行命名函数为:def perms(xs): return (list(x) for x in itertools.permutations(xs)) pylint 会抱怨这个 - ***.com/questions/25010167/…【参考方案2】:

是的,有限制。不,你不能那样做。简而言之,您可以跳过一个换行符,但不能跳过两个。

见here。

这样做的原因是它可以让你这样做

if test1: if test2: print x
else:
    print y

这是模棱两可的。

【讨论】:

更不用说它只是看起来很糟糕。 谢谢 - 正是我想要的,参考规范中的正确规则。【参考方案3】:

在你的情况下,我不确定。但是对于某些功能,您可以通过使用分号来实现。

>>> def hey(ho): print(ho); print(ho*2); return ho*3
...
>>> hey('you ')
you
you you
'you you you '

【讨论】:

【参考方案4】:

def perms (xs):

for x in itertools.permutations(xs): yield list(x)

你可以使用exec()来解决这个问题

exec('def perms (xs):\n  for x in itertools.permutations(xs):\n   yield list(x)\n')

注意在 \n

之后插入缩进间距或 chr(9)

if Python 在一行中的示例

for i in range(10):
 if (i==1):
  print(i)

exec('for i in range(10)\n  if (i==1):\n   print(i)\n')

This is My project on GitHub 使用 exec 在交互式控制台模式下运行 Python 程序

*注意多行 exec 仅在以 '\n' 结尾时运行

【讨论】:

虽然这是一个有趣的解决方法,但它几乎是你所能得到的最不符合 Python 的。 看起来更像是 javascript 会做的事情 这是否意味着您可以exec("<do something" \n exec('<do more things>')")?因为这最终可能会变得非常混乱,尤其是如果您开始将其放入 lambda

以上是关于python 一行函数定义的主要内容,如果未能解决你的问题,请参考以下文章

python所有内置函数的定义详解

Python--Demo8--函数定义和函数调用

python怎么调用自定义函数

python学习6--函数定义及参数

基于当前行和上一行的用户定义函数

python中的@