我怎样才能将多个语句放在一行中?

2025-02-12 10:03:00
admin
原创
65
摘要:问题描述:我对 Python 中的推导式略知一二,但它们似乎很难“读懂”。在我看来,推导式可能实现与以下代码相同的功能:for i in range(10): if i == 9: print('i equals 9') 这段代码比目前的推导式更容易阅读,但我注意到你不能:在一行中有两个 s。这让我想到:有什...

问题描述:

我对 Python 中的推导式略知一二,但它们似乎很难“读懂”。在我看来,推导式可能实现与以下代码相同的功能:

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

这段代码比目前的推导式更容易阅读,但我注意到你不能:在一行中有两个 s。这让我想到:

有什么方法可以将以下示例合并为一行吗?

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

像这样的事情就很棒了:

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

但我再次遇到了矛盾的情况:

我也想知道是否有办法try不运行(或类似的东西)except。我把 放在那里似乎毫无意义except:pass。这是一条浪费的线。


解决方案 1:

不幸的是,你想要的东西在 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

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

如果您仍然决心使用单行命令,请参阅eprovst 的回答。

至于问题:如果没有. ,try ... except它将完全没用,表示“我想运行此代码,但它可能会引发异常”。如果您不关心异常,请省略。但是一旦您将其放入,您就会说“我想处理潜在的异常”。然后表示您不希望专门处理它。但这意味着您的代码将继续运行,否则它不会运行。except`trytrypass`

解决方案 2:

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

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

其中`
是换行符, `用作缩进(制表符)。

此外,您还应该计算所使用的空格,以便缩进完全匹配。

但是,正如所有其他答案已经说过的那样,这当然只能在您确实必须将其放在一行上时使用。

exec是一个非常危险的语句(特别是在构建 web 应用程序时),因为它允许执行任意 Python 代码。

解决方案 3:

现在,您可以只使用分号。但是,您不能使用 if/elif/else 语句、for/while 循环,也不能定义函数。这主要用在使用导入模块时,您不必定义任何函数或使用任何 if/elif/else/for/while 语句/循环。

下面是一个示例,它获取歌曲的艺术家、歌曲名称,并搜索歌词:

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

解决方案 4:

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

python -c "$(echo -e "a=True
if a : print(1)")"

`
`在这里我们在评估 Python 代码之前进行预处理。

这太坑爹了!不要写这样的代码。

解决方案 5:

对于python -c面向解决方案,并且如果您使用 Bash shell,那么您可以使用像本例中简单的单行语法:

假设您想做这样的事情(与您的示例非常相似,包括except: pass说明):

python -c  "from __future__ import print_function
try: import numpy; print( numpy.get_include(), end='
' )
except:pass
" OUTPUT_VARIABLE __numpy_path

这将不起作用并产生此错误

  File "<string>", line 1
    from __future__ import print_function
try: import numpy; print( numpy.get_include(), end='
' )
except:pass

                                                                                                                  ^
SyntaxError: unexpected character after line continuation character `

这是因为 Bash 和 Python对转义序列的解释存在竞争`
。为了解决这个问题,可以使用$'string'Bash 语法强制
`Bash先于Python 进行解释。

为了使示例更具挑战性,我`end=..
..在 Python 打印调用中添加了一个典型的 Python 规范:最后,您将能够从 Bash 和 Python 中获得*两种*
`解释,每种解释都针对其关注的文本部分。因此,最终正确的解决方案是这样的:

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

这会导致正确的清洁输出而没有错误:

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

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

`
注 2:人们可以通过用某些替换某些来解决这个问题;`,但它并非随时都有效(取决于 Python 构造),而我的解决方案允许始终将任何一段经典的多行 Python 程序“单行化”。

注 3:当然,使用单行代码时,必须始终注意 Python 空格和缩进,因为实际上我们这里并不是严格意义上的“单行代码”,而是在 bash 和 Python 之间进行适当的转义序列混合管理`
`。这就是我们处理任何经典多行 Python 程序的方法。解决方案示例也说明了这一点。

解决方案 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]

解决方案 7:

这确实是可能的 ;-)

# 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和凯撒加密的函数。

解决方案 8:

也许用“和”或者“或”。

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

我通过 Google 搜索“如何在 Python 的一行中放入多个语句”找到了这里。它没有直接回答这个问题,但也许其他人需要这个。

解决方案 9:

如果您想要不经过 try 和 except 即可,那么就有解决方案。

如果您尝试在列表中打印“harry”时的“hello”,那么解决方案是:

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

解决方案 10:

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

解决方案if, else

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

使用列表生成而不是if, else

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

解决方案try, except

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

尝试expect通过内联if语句来处理将如何表现。这行代码专门用于处理 的存在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 8 E701)。因此,对于任何可能的 Pythonic(PEP 8)解决方案,单行代码可能必须避免显式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)

这可能是一个更严肃的解决方案。请注意,由于PEP 8E722 ,except不建议使用bare 。虽然这行强迫性的东西似乎是在浪费时间(而且我实际上通常也同意这一点 T_T),但其中还是存在一些代码风格的考虑。 except: pass

解决方案 11:

这个解决方案可能很复杂,但Ubuntu

一行Python脚本可以

  • 进口 yaml和系統库

  • lambda 函数首先使用以下方法读取 yaml 文件系统参数

  • 从回报中获得预期价值嵌套字典来自 lambda 函数系统参数v2 系统参数

  • print yaml_as_dict 将加载 test_var 作为变量

  • 检查 test_varecho $test_var

`

$
$ test_var=$(python3 -c $"import yaml,sys; yaml_as_dict=(lambda :yaml.safe_load(open(f'{sys.argv[1]}','r').read()))()[sys.argv[2]][sys.argv[3]]; print(yaml_as_dict)" <argv1> <argv2> <argv3>)
$
$ echo $test_var
$ 

如何从 bash 脚本执行多行 python 代码?

如何使用 python 在终端中编写多行代码?

如何从 python EOF 定义 bash 变量

解决方案 12:

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

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

如果你告诉我们你真正的问题是什么,你甚至可能会得到一个 Python 式的答案。“一行代码就能得到一些东西”通常不是一个编程问题。

解决方案 13:

根据ThomasH 的回答:

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

注意,我使用的是 Python 3,必须使用两个打印命令。afterpass不起作用else

解决方案 14:

sam = ['harry', 'john']

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

解决方案 15:

以下是一个例子:

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
>>>
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用