【问题标题】:python one line function definitionpython 一行函数定义
【发布时间】: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 中,布局很重要。可读性远比能够编写单行代码重要得多。如果有疑问,如果您必须维护它,请让它看起来像您希望看到的那样。
  • 我知道布局很重要,因为第一个版本使用它并且有效。可读性是主观的,这种简单的东西的单行样式是我想要的,而且我想更好地理解语法问题。

标签: 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 会抱怨这个 - stackoverflow.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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-20
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    相关资源
    最近更新 更多