【问题标题】:python equivalent to perl's qw()python相当于perl的qw()
【发布时间】:2011-04-01 20:57:29
【问题描述】:

我在 Perl 中经常这样做:

printf "%8s %8s %8s\n", qw(date price ret);

但是,我在 Python 中能想到的最好的方法是

print '%8s %8s %8s' % (tuple("date price ret".split()))

我只是想知道是否有更优雅的方式来做到这一点?我很好,如果你告诉我就是这样,并且无法改进。

【问题讨论】:

  • 为什么这是一个社区维基?确实需要删除该“功能”。
  • 抱歉,我一定是误点击了 wiki 框。如何删除它? (当我尝试编辑时看不到这样的选项。)究竟应该将什么发布到社区 wiki?谢谢。
  • 无法删除,下次补课吧。社区 wiki 选项背后的想法可能在 meta.stackexchange.com/questions/11740/… 得到了最好的解释
  • tuple() 和额外的括号是多余的。这就是@masonk 写下他们的答案的原因,即,只需执行print '%8s %8s %8s' % "date price ret".split()
  • 不是一个完整的答案;但是您知道源代码不必由人类“键入”吗?它可以通过 perl 1line 脚本制作...

标签: python perl quotes


【解决方案1】:

"date price ret".split()

【讨论】:

  • 这就是 OP 已经建议的。因此没有真正的帮助。
【解决方案2】:

QW() 通常用于在 Perl 中使用 join() 打印列标题。现实世界中的列标题有时很长——这使得join("\t", qw()) 非常有用,因为它更易于阅读并有助于消除拼写错误(例如"x","y""x\ty")。以下是实际 Python 中的相关方法:

    print("\t".join('''PubChemId Column ESImode Library.mzmed
      Library.rtmed Metabolite newID Feature.mzmed Feature.rtmed
      Count ppmDiff rtDiff'''.split()))

三引号字符串很奇怪,因为它兼作注释。然而,在这种情况下,它是一个字符串,它让我们不必担心换行符(就像qw() 那样)。

感谢之前对这种方法的喜爱。

【讨论】:

    【解决方案3】:

    好吧,绝对没有办法完全按照您在 Perl 中的操作,因为 Python 会抱怨未定义的变量名和语法错误(可能是缺少逗号)。但我会这样写(在 Python 2.X 中):

    print '%8s %8s %8s' % ('date', 'price', 'ret')
    

    如果你真的很喜欢 Perl 的语法,我想你可以像这样定义一个函数 qw

    def qw(s):
        return tuple(s.split())
    

    然后你可以写

    print '%8s %8s %8s' % qw('date price ret')
    

    它基本上类似于 Perl,除了 qw 的参数上的一对引号。但我会犹豫是否推荐。至少,不要仅仅因为你错过 Perl 而这样做——它只会让你否认你现在正在使用一种新的编程语言;-) 这就像 Pascal 程序员切换到 C 并创建宏的老故事

    #define BEGIN {
    #define END   }
    

    【讨论】:

    • 可以肯定的是,我明确地试图绕过在每个单词周围输入引号。单词列表通常在 15-20 附近运行,因此首先需要 qw()。
    • 好吧,我认为通常的 Python 方法就是把它吸起来并输入引号 - 毕竟,你只需要做一次。但我不认为使用这个qw 函数真的有什么错误。这可能会使任何阅读您的源代码但不熟悉 Perl 的人感到困惑,但如果您能接受,那就继续吧。
    • “毕竟,你只需要做一次”——除了你只需要做一次,每次你必须做的时候。在我开始定期在 perl 中编码之前,我从未意识到我创建单个标记数组的频率,或者为键创建单个标记的散列(这是在 perl 中省略引号的另一个机会)。 “qw”并不重要,有一个常见的案例优化可以让您删除引号。
    • Blub 悖论是真实的。 :) paulgraham.com/avg.html(在我寻找其他语言的等价物时发现了这个。至少 ruby​​ 有它(%w)。)
    猜你喜欢
    • 2012-02-06
    • 2018-11-16
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多