如何将多个语句放在一行中?

时间:2011-05-29 10:14:14

标签: python

我不确定在什么标题下完全考虑这个问题,编码高尔夫似乎是合适的,如果有点不明确。

我知道python中的一些理解,但它们似乎很难“阅读”。我看到它的方式,理解可能会像下面的代码一样完成:

for i in range(10): if i == 9: print('i equals 9')

这段代码比理解目前的工作方式更容易阅读,但我注意到你不能在一行中有两个':'......这也带给我了......

我的问题:

有什么方法可以让以下示例进入ONE LINE。

try:
    if sam[0] != 'harry':
        print('hello',  sam)
except:
    pass

这样的事情会很棒:

try: if sam[0] != 'harry': print('hellp',  sam)
except:pass

但我又遇到了相互冲突的':' 我也很想知道是否有办法运行尝试(或类似的东西),除非,我需要放置除了:传递在那里似乎完全没有意义。它浪费了一条线。

感谢您输入......这里有一个笑脸:D

12 个答案:

答案 0 :(得分:118)

不幸的是,Python不可能实现你想要的东西(这使Python对于命令行单行程序来说无用)。即使明确使用括号也不能避免语法异常。你可以使用一系列简单的语句,用分号分隔:

for i in range(10): print "foo"; print "bar"

但是只要添加引入缩进块的构造(如if),就需要换行符。此外,

for i in range(10): print "i equals 9" if i==9 else None

是合法的,可能接近你想要的。

至于try ... except的事情:如果没有 except,那将是完全无用的try说“我想运行此代码,但它可能会抛出异常”。如果您不关心异常,请放弃try。但是一旦你把它放入,你就说“我想处理一个潜在的例外”。然后pass表示您不希望具体处理它。但这意味着您的代码将继续运行,否则就不会运行。

答案 1 :(得分:49)

您可以使用内置的exec语句,例如:

exec("try: \n \t if sam[0] != 'harry': \n \t\t print('hello',  sam) \nexcept: pass")

其中\n是换行符,\t用作缩进(标签)。
此外,您应该计算您使用的空格,因此您的缩进完全匹配。

但是,正如所有其他答案已经说过的那样,当然只有当你 将它放在一行时才会使用。

exec是一个非常危险的声明(特别是在构建webapp时),因为它允许执行任意Python代码。

答案 2 :(得分:6)

我建议这样做......

你所描述的是理解。

推荐的

PEP 8 Style Guide for Python Code对复合语句有这样的说法:

  
      
  • 通常不鼓励使用复合语句(同一行上的多个语句)。
  •   
     

是:

      if foo == 'blah':
          do_blah_thing()
      do_one()
      do_two()
      do_three()
     

而不是:

      if foo == 'blah': do_blah_thing()
      do_one(); do_two(); do_three()

这是一个区分的样本理解:

>>> [i for i in xrange(10) if i == 9]
[9]

答案 3 :(得分:5)

我没有激励这一点,但是说你在命令行上,除了python你什么都没有,你真的需要一个单行,你可以这样做:

python -c "$(echo -e "a='True'\nif a : print 1")"

我们在这里做的是在评估python代码之前预处理\n

那太超级黑客了!不要写这样的代码。

答案 4 :(得分:4)

是的,这篇文章已有8年历史了,但是如果有人来这里寻找答案:您现在可以只使用分号了。但是,您不能使用if / elif / else语句,for / while循环,也不能定义函数。主要用途是在使用导入的模块时,您不必定义任何函数或使用任何if / elif / else / for / while语句/循环。

下面是一个示例,该示例采用歌曲的歌手,歌曲名称并在天才中搜索歌词:

import bs4, requests; song = input('Input artist then song name\n'); print(bs4.BeautifulSoup(requests.get(f'https://genius.com/{song.replace(" ", "-")}-lyrics').text,'html.parser').select('.lyrics')[0].text.strip())

答案 5 :(得分:2)

对于面向python -c的解决方案,并假设您使用Bash shell,可以的,您可以使用一个简单的单行语法,例如以下示例:

假设您想做这样的事情(非常类似于您的示例,包括except: pass指令):

python -c  "from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n" OUTPUT_VARIABLE __numpy_path

这将无法工作并产生此错误:

  File "<string>", line 1
    from __future__ import print_function\ntry: import numpy; print( numpy.get_include(), end='\n' )\nexcept:pass\n
                                                                                                                  ^
SyntaxError: unexpected character after line continuation character `

这是因为Bash和\n转义序列的Python解释之间的竞争。要解决该问题,可以在Python版本之前使用$'string' Bash语法强制执行\n Bash解释。为了使示例更具挑战性,我在Python打印调用中添加了一个典型的Python end=..\n..规范:最后,您将能够从bash和Python一起获得BOTH \n的解释,每个解释都是关注的文本。这样最终正确的解决方案是这样的:

python -c  $'from __future__ import print_function\ntry:\n import numpy;\n print( numpy.get_include(), end="\\n" )\n print( "Hello" )\nexcept:pass\n' OUTPUT_VARIABLE __numpy_path

这将导致正确的干净输出而没有错误:

/Softs/anaconda/lib/python3.7/site-packages/numpy/core/include
Hello

注意:这对于面向exec的解决方案也应适用,因为问题仍然存在(Bash和Python解释器的竞争)。

注2:可以通过将某些\n替换为某些;来解决该问题,但是它随时都无法工作(取决于Python构造),而我的解决方案允许始终“单行”处理任何问题经典的多行Python程序。

注3:当然,当使用单行代码时,必须始终注意Python空间和缩进,因为实际上我们在这里并不是严格意义上的“单行代码”,但要进行{{1 }} bash和Python之间的转义序列。这就是我们可以处理任何经典的多行Python程序的方式。解决方案示例也对此进行了说明。

答案 6 :(得分:1)

你混合了很多东西,这很难回答你的问题。简短的回答是:据我所知,你想做的事情在Python中是不可能的 - 这是有充分理由的!

更长的答案是,如果你想用Python开发,你应该让自己更熟悉Python。理解不难阅读。您可能不习惯阅读它们,但如果您想成为Python开发人员,则必须习惯它。如果有更适合您需求的语言,请选择该语言。如果选择Python,请准备以pythonic方式解决问题。当然你可以自由地对抗Python,但它不会很有趣! ; - )

如果您告诉我们您的真正问题是什么,您甚至可能会得到一个pythonic答案。 “在一行中获取”我们通常不是编程问题。

答案 7 :(得分:1)

也许是&#34;和&#34;或&#34;或&#34;

在错误地需要写&#34;或&#34;

之后

真正需要写&#34;和&#34;

喜欢

n=0
def returnsfalse():
    global n
    n=n+1
    print ("false %d" % (n))
    return False
def returnstrue():
    global n
    n=n+1
    print ("true %d" % (n))
    return True
n=0
returnsfalse() or  returnsfalse() or returnsfalse() or returnstrue() and returnsfalse()

结果:

false 1
false 2
false 3
true 4
false 5

或者喜欢

(returnsfalse() or true) and (returnstrue() or true) and ...

通过搜索谷歌&#34来到这里;如何将多个语句放在一行python&#34;中,不直接回答问题,也许其他人需要这个。

答案 8 :(得分:0)

实际上可能; - )

# not pep8 compatible^
sam = ['Sam',]
try: print('hello',sam) if sam[0] != 'harry' else rais
except: pass

你可以在python中做很丑陋的事情,如:

def o(s):return''.join([chr(ord(n)+(13if'Z'<n<'n'or'N'>n else-13))if n.isalpha()else n for n in s])

这是rot13 / caesar加密功能,一行99个字符。

答案 9 :(得分:0)

我知道我来晚了,但是陷入了疑问,并且基于ThomasH的回答:

for i in range(4): print "i equals 3" if i==3 else None

输出: 没有 没有 没有 我等于3

我建议更新为:

for i in range(4): print("i equals 3") if i==3 else print('', end='')

输出: 我等于3

注意,我在python3中,不得不使用两个打印命令。通过否则将无法正常工作。只想评论ThomasH的答案,但不能,因为我还没有足够的声誉。

答案 10 :(得分:0)

有一个可能的 PEP8 兼容解决方案。

if, else 的解决方案

[print("i equals 9") for i in range(10) if i == 9]

使用列表生成代替 if, else

我认为这可能是一个有用的技巧,ThomasH 已经在评论中说明了这一点。所以这是一个严肃的解决方案。

try, except 的解决方案

print("hello", sam) \
    if "sam" in locals() \
    and hasattr(sam, "__getitem__") \
    and 0 < len(sam) \
    and sam[0] != "harry" \
    else None

尝试通过内联 expect 语句处理 if 的行为。这行代码专门处理sam[0]的存在,因此无法解决其他一般的try, except情况。

这个 IS 一行代码 (=w=) 虽然如果只用一行代码,它可能太长而无法与 PEP8 E501 矛盾。所以这是一个有趣的解决方案

  • "sam" in locals 检查 sam 是否是当前环境中的有效变量;
  • hasattr(sam, "__getitem__") 检查变量 sam 是否可以被 sam[n] 索引;
  • 0 < len(sam) 检查 sam 是否有超过零个项目;
  • 然后检查 sam[0] != "harry"
  • 警告:这在 type(sam) == list 时应该有效。其他情况未测试。如果您确定 sam 是一个列表,那么代码不会太长:
    print("hello", sam) if 0 < len(sam) and sam[0] != "harry" else None
    

附加内容

正如其他答案(例如 Johnsyweb)所述,不建议在一行中使用多个语句 (PEP8 E701)。因此,对于任何可能的 pythonic (PEP8) 解决方案,单行代码可能必须避免显式 if, elsetry, except

正如 Thomash 的另一条评论所述,try, except 的更好解决方案应该使用包装函数。这增加了另一行代码;但是,调用该函数不仅可以检查sam,还可以检查其他变量:

def check_harry(name):
    try:
        print("hello", name) if name[0] != "harry" else None
    except (NameError, TypeError, IndexError):
        pass

check_harry(uncle)
check_harry(sam)

这可能是一个更严肃的解决方案。请注意,由于 PEP8 E722,不建议使用裸 except。虽然这行强制 except: pass 似乎是在浪费时间(实际上我通常同意 T_T),但其中有一些代码风格的考虑。

答案 11 :(得分:-1)

以下是一个例子:

for i in range(80,90):print(i,end =“”)if(i!= 89)else print(i)

输出: 80 81 82 83 84 85 86 87 88 89

  
    

&GT;