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


143

我不确定要确切地考虑这个问题的标题,如果不太明确,编码高尔夫似乎是合适的。

我对python有一点了解,但似乎很难“阅读”。我的理解方式可能与以下代码相同:

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

这段代码比当前的理解方法更容易阅读,但是我注意到您不能在一行中包含两个“:”……这也给我带来了……

我的问题:

有什么办法可以使下面的示例进入一行。

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

这样的事情会很棒:

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

但是我又遇到了冲突的':',我也很想知道是否有一种方法可以不加尝试地运行try(或类似的东西),我似乎完全没有意义,我只需要在其中放入else:pass即可。它是一条浪费的线路。

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


为什么会抛出异常?
伊格纳西奥·巴斯克斯

1
sam [2]可能不存在。这是一个假设的例子。谢谢
Rhys

4
理解在Python中有所不同。将所有内容放在一行中并不是理解力。
菲利克斯·克林

我知道这是肯定的。谢谢。我只是在说明我认为理解可能会更好,但由于冒号是我的问题/问题的根源,所以无法理解
Rhys

只需使用\ns并将空格用于缩进即可。

Answers:


144

不幸的是,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事情:没有,那将完全没有excepttry说“我想运行此代码,但可能会引发异常”。如果您不在乎该异常,请不要使用try。但是,一旦输入,您就说“我想处理潜在的异常”。该pass那么说,你要没有特别处理。但这意味着您的代码将继续运行,否则就不会继续运行。


1
有趣的是,我认为您后面的示例最接近我在寻找的答案。谢谢
Rhys

关于“ try”问题……如果,我知道在某个时候会抛出异常,但是我只是想让代码继续运行……例如,检查字符串是否可以是整数?尝试:int(string)...如果不能,则继续下一行,不需要例外。我明白您的意思,但是还有其他方法可以适应这种检查/错误处理吗?
Rhys

4
Re try::Python语法规则根本不允许您在没有随附“ except”子句的情况下仅使用“ try”子句。我要做的是将try-except包装在自己的函数中,然后调用它。喜欢if (checkint(s))...def checkint(s): try: int(s)\nreturn True\nexcept: return False
ThomasH

ThomasH,希望您的评论对某个地方的问题有所解答,以便我予以支持。优秀的。
伊万X

5
@ThomasH“ (这使Python几乎对命令行一线程序毫无用处) ”:不会妨碍我。95%的案例不需要换行。其余的通过\ n: python -c "exec\"print 'A' \nfor i in 1,2,3: print i \""
kxr

52

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

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

哪里\n是换行符,\t用作缩进(选项卡)。
另外,您应该计算使用的空间,以便缩进完全匹配。

但是,正如所有其他答案已经说过的那样,这仅在您确实需要将其放在一行上时才使用。

exec 这是一个非常危险的声明(尤其是在构建Web应用程序时),因为它允许执行任意Python代码。


4
谢谢!应将其标记为正确答案,因为它实际上是有效的,与其他方法不同。但是,当然,除非必须这样做,否则绝对不要这样做!但是,实际上我需要这种语法,因为我必须将脚本输入到固定的单行文本框中。
Sanjay Manohar 2014年

谢谢 !救命!我没有在脚本中使用它,但是在交互式外壳中,这对于调试很有用...我通常只是退出交互式外壳,然后重新启动它以获得一个干净的环境,然后我必须重复某些步骤,即导入一个模块,运行一些功能,然后对特定功能进行一些测试。Soooo,我一直在寻找一种将“导入模块,运行某些功能”放在一个单行中的方法,因此我可以从历史记录中快速调用它并运行它(而不必从历史记录中调用5个不同的项) +1
oneindelijk

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

谢谢kxr :)(我用您的想法来改善答案)
elecprog

6

我建议要这样做...

您所描述的不是理解力。

强烈建议使用PEP 8 Python代码样式指南在复合语句中这样说:

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

是:

      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]

6

是的,这篇文章已有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())

6

我不会对此进行激励,但是说您在命令行上,除了Python之外什么都没有,并且您确实需要一个衬套,您可以这样做:

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

我们在这里所做的是\n在评估Python代码之前进行预处理。

超级骇客!不要写这样的代码。


1

可能带有“和”或“或”

错误后需要写“或”

确实需要写“和”之后

喜欢

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 ...

通过搜索谷歌“如何在一行python中放置多个语句”到达此处,而不是直接回答问题,也许其他人需要这个。


1

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

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的空格和缩进,因为实际上我们并不是严格意义上的“单行代码”,但是\n在bash和Python之间进行适当的转义序列混合管理。这就是我们可以处理任何经典的多行Python程序的方式。解决方案示例也对此进行了说明。


0

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

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

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


我爱蟒蛇!我只是在说明我认为如何更好地理解结构,但由于冒号是我的问题/问题的根源而无法解决……我从您的回答中看到,冒号分隔了多语句,例如try:if sam [ 0]!='harry':不可能进行print('hellp',sam)...这是正确的吗?谢谢...我只是将其用于一些调试目的,所以我正在寻找可以轻松删除并且不占用大量空间的小型简单代码,大声笑
Rhys

是的,据我所知这是不可能的。但是正如有人已经指出的那样:您所做的与理解不同。如果您希望能够轻松删除代码,请将其放入函数中。关于“ except:pass”问题,考虑一个忽略异常或类似东西的装饰器。再次:始终尝试描述您的实际问题,而不是描述您已经想到的解决方案的问题。;-)
Achim

3
人们为什么要以诸如“您正在混合很多东西”之类的挑衅性言论来开始回答?如果可以的话,请投下反对票。
约翰·姜

“获得在一行中的东西”我们通常不是一个规划问题“ - >但是,往往是一个系统管理员的问题,所以这个问题仍然是在这方面有关。
亚历˚F

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])

这是用于以99个字符为一行的rot13 / cesa加密的功能。


-2

这是一个例子:

对于范围在(80,90)中的i:如果(i!= 89)则print(i,end =“”)否则print(i)

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

>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.