36

这一定很简单,但作为一个偶尔的 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: 可以是带有简单正文的一或两行,但将两者结合起来会失败。有没有排除这个的语法规则?

4

4 回答 4

52

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

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

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

于 2013-05-26T04:19:39.207 回答
41

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

这里

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

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

这是模棱两可的。

于 2013-05-26T04:13:36.373 回答
6

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

>>> def hey(ho): print(ho); print(ho*2); return ho*3
...
>>> hey('you ')
you
you you
'you you you '
于 2020-11-26T08:28:23.067 回答
3

默认烫发(xs):

对于 itertools.permutations(xs) 中的 x:产量列表 (x)

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

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

注意在 \n 之后插入缩进间距或 chr(9)

如果 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')

这是我在 GitHub 上的项目,使用 exec 在交互式控制台模式下运行 Python 程序

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

于 2015-04-07T03:07:44.833 回答