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

我知道一些 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

但是我又一次遇到了相互冲突的 :

我还想知道是否有一种方法可以在没有 except的情况下运行 try(或类似的东西)。似乎完全没有意义,我需要把 except:pass放在那里。这是废话。

306846 次浏览

你把很多事情混在一起,所以很难回答你的问题。简短的回答是: 据我所知,您想要做的事情在 Python 中是不可能的——这是有充分理由的!

更长远的答案是,如果您想要在 Python 中开发,那么应该让自己更适应 Python。理解并不难读。您可能不习惯阅读它们,但是如果您想成为一名 Python 开发人员,就必须习惯它们。如果有一种语言更适合你的需要,选择那一种。如果您选择 Python,请准备好以 Python 的方式解决问题。你当然可以和巨蟒战斗,但是那可不好玩!;-)

如果你告诉我们你真正的问题是什么,你甚至可能会得到一个蟒蛇般的答案。“在一行中得到一些东西”通常不是一个编程问题。

我建议 没有这样做..。

你所描述的是一种理解。

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]

不幸的是,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说你希望不要特别处理它。但这意味着您的代码将继续运行,否则就不会运行。

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

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

其中 \n是换行符,\t用作缩进(制表符)。
此外,还应该计算所使用的空格,以便缩进完全匹配。

然而,正如所有其他答案已经说过的,这当然只有当你真正 把它放在一行时才会使用。

exec是一个相当危险的语句(特别是在构建 webapp 时) ,因为它允许执行任意的 Python 代码。

这实际上是可能的; -)

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

你可以在 Python 中做一些非常丑陋的事情,比如:

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

这是一个用于 ROT13凯撒加密的函数。

也许是“还有”或者“或者”。

在 false 之后,我们需要写“ or”。

在 true 之后我们需要写“ and”。

喜欢

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 中放入多条语句”来到这里的。它没有直接回答这个问题,但也许有人需要这个。

这里有一个例子:

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

我不鼓励这样做,但是假设你在命令行上,除了 Python 你什么都没有,而且你真的需要一行程序,你可以这样做:

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

在这里,我们在评估 Python 代码之前对 \n进行预处理。

这太恶心了! 不要写这样的代码。

现在可以只使用分号。但是,不能使用 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())

对于面向 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 Bash 解释 之前的 Python 语法。

为了让这个示例更具挑战性,我在 Python print 调用中添加了一个典型的 Python end=..\n..规范: 最后,您将能够从 Bash 和 Python 一起获得 都有 \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 空格和缩进,因为事实上我们在这里并不是严格的“一行”,但是在 bash 和 Python 之间对 \n转义序列进行适当的混合管理。这就是我们如何处理任何经典的多行 Python 程序的方法。解决方案示例也说明了这一点。

基于 托马斯的回答:

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

产出:

None
None
None
i equals 3

我建议更新如下:

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

产出:

i equals 3

注意,我在 Python3中,必须使用两个 print 命令。

如果你想要它而不去尝试,那么就有解决办法。

如果您试图在列表中打印“ hello”,如果是“ harry” 那么解决办法就是:

'hello' if 'harry' in sam else ''

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

if, else的解决方案

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

使用列表生成代替 if, else

我认为这可能是一个有用的技巧,汤玛斯评论已经说过了,所以这是一个严肃的解决方案。

try, except的解决方案

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

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

这个 强大一行代码(= w =)。虽然如果写在一行,它可能太长,以抵触 PEP 8 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 说,一行中的多个语句是不首选的(PEP 8E701)。因此,对于任何可能的 Python (PEP8)解决方案,一行代码可能必须避免显式的 if, elsetry, except

正如 托马什的另一个评论所说,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)

这可能是一个更严肃的解决方案。请注意,由于 PEP 8 E722,不推荐使用裸 except。尽管这一行强迫性的 except: pass看起来是在浪费时间(事实上我通常同意这个 T _ T) ,还是有一些代码风格的考虑。

sam = ['harry', 'john']


print('hello ' + sam[0] if sam[0] != 'harry' else '')