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 上的 FTRdef 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 一行函数定义的主要内容,如果未能解决你的问题,请参考以下文章