将 if-elif-else 语句放在一行上?[重复]

2025-02-20 09:22:00
admin
原创
25
摘要:问题描述:有没有更简单的方法可以编写 if-elif-else 语句,使其适合一行? 例如,if expression1: statement1 elif expression2: statement2 else: statement3 或者一个现实世界的例子:if i > 1...

问题描述:

有没有更简单的方法可以编写 if-elif-else 语句,使其适合一行?

例如,

if expression1:
    statement1
elif expression2:
    statement2
else:
    statement3

或者一个现实世界的例子:

if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

我只是觉得,如果上面的例子可以按以下方式写,它看起来会更简洁。

x = 2 if i>100 elif i<100 1 else 0   # [WRONG]

我已阅读下面的链接,但它并没有解答我的问题。

  • Python 有三元条件运算符吗?(问题是关于将 if-else 语句压缩为一行)


解决方案 1:

不,这是不可能的(至少对于任意语句来说是不可能的),也不可取。将所有内容放在一行中很可能违反PEP-8,其中规定行的长度不得超过 80 个字符。

这也违背了 Python 的“可读性至上”的原则。(import this在 Python 提示符下输入即可阅读全文)。

可以在 Python 中使用三元表达式,但只能用于表达式,不能用于语句:

>>> a = "Hello" if foo() else "Goodbye"

编辑:

现在,您修改后的问题表明,除了赋值之外,这三个语句是相同的。在这种情况下,链式三元运算符确实有效,但我仍然认为它的可读性较差:

>>> i = 100
>>> x = 2 if i>100 else 1 if i<100 else 0
>>> x
0
>>> i = 101
>>> x = 2 if i>100 else 1 if i<100 else 0
>>> x
2
>>> i = 99
>>> x = 2 if i>100 else 1 if i<100 else 0
>>> x
1

解决方案 2:

如果您只需要针对不同情况使用不同的表达方式,那么这可能适合您:

expr1 if condition1 else expr2 if condition2 else expr3

例如:

a = "neg" if b<0 else "pos" if b>0 else "zero"

解决方案 3:

尽管还有其他一些答案:是的,这是可能的

if expression1:
    statement1
elif expression2:
    statement2
else:
    statement3

翻译为以下一行:

statement1 if expression1 else (statement2 if expression2 else statement3)

事实上你可以将它们嵌套到无限远。尽情享受吧 ;)


更新:这就是“真实世界”示例的样子:

if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

翻译为:

x = 2 if i > 100 else (1 if i < 100 else 0)

所以我最初的回答不够精确,但这个解决方案可以满足 OP 的要求。

解决方案 4:

只需在 else 语句中嵌套另一个 if 子句即可。但这并不会让它看起来更漂亮。

>>> x=5
>>> x if x>0 else ("zero" if x==0 else "invalid value")
5
>>> x = 0
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'zero'
>>> x = -1
>>> x if x>0 else ("zero" if x==0 else "invalid value")
'invalid value'

解决方案 5:

在我看来,还有一种相当难以理解的替代方案,但出于好奇,我还是想分享一下:

x = (i>100 and 2) or (i<100 and 1) or 0

更多信息请访问:https://docs.python.org/3/library/stdtypes.html#boolean-operations-and-or-not

解决方案 6:

您可以选择实际使用get以下方法dict

x = {i<100: -1, -10<=i<=10: 0, i>100: 1}.get(True, 2)

get如果保证其中一个键的计算结果为,则不需要该方法True

x = {i<0: -1, i==0: 0, i>0: 1}[True]

理想情况下,最多应有一个键的值为True。如果多个键的值为True,则结果似乎不可预测。

解决方案 7:

是的,你可以这样做:

i = int(input('type your num here : '))

x = 2 if i > 100 else ( 1 if i < 100 else 0)
print (x)

解决方案 8:

if i > 100:
    x = 2
elif i < 100:
    x = 1
else:
    x = 0

如果要在一行中使用上述代码,可以使用以下命令:

x = 2 if i > 100 else 1 if i < 100 else 0

这样做时,如果 i > 100,则 x 将被分配 2;如果 i < 100,则 x 将被分配 1;如果 i = 100,则 x 将被分配 0

解决方案 9:

三元运算符是获得简洁表达式的最佳方式。语法是variable = value_1 if condition else value_2。因此,对于您的示例,您必须应用三元运算符两次:

i = 23 # set any value for i
x = 2 if i > 100 else 1 if i < 100 else 0

解决方案 10:

人们已经提到了三元表达式。有时以简单的条件赋值为例,可以使用数学表达式来执行条件赋值。这可能不会使您的代码非常易读,但它确实可以在一行相当短的时间内完成。您的示例可以这样写:

x = 2*(i>100) | 1*(i<100)

比较结果为 True 或 False,与数字相乘时结果为 1 或 0。可以在中间使用 + 代替 |。

解决方案 11:

嵌套三元运算符是最好的解决方案——

示例案例 -

4 = 1

3 = 2

2 = 3

1 = 4
a = 4

prio = 4 if a == 1 else (3 if a == 2 else (2 if a == 3 else 1))

解决方案 12:

这也取决于你的表达方式。其他答案中“不要这样做”的一般建议对于通用语句和通用表达非常有效。

但是如果您需要的只是一个“调度”表,比如根据给定选项的值调用不同的函数,您可以将要调用的函数放在字典中。

类似于:

def save(): 
   ...
def edit():
   ...
options = {"save": save, "edit": edit, "remove": lambda : "Not Implemented"}

option = get_input()
result = options[option]()

而不是 if-else:

if option=="save":
    save()
...

解决方案 13:

您可以使用嵌套的三元 if 语句。

# if-else ternary construct
country_code = 'USA'
is_USA = True if country_code == 'USA' else False
print('is_USA:', is_USA)

# if-elif-else ternary construct
# Create function to avoid repeating code.
def get_age_category_name(age):
    age_category_name = 'Young' if age <= 40 else ('Middle Aged' if age > 40 and age <= 65 else 'Senior')
    return age_category_name

print(get_age_category_name(25))
print(get_age_category_name(50))
print(get_age_category_name(75))

解决方案 14:

MESSAGELENGHT = 39
"A normal function call using if elif and else."
if MESSAGELENGHT == 16:
    Datapacket = "word"
elif MESSAGELENGHT == 8:
     Datapacket = 'byte'
else:
     Datapacket = 'bit'

#similarly for a oneliner expresion:
    

Datapacket = "word" if MESSAGELENGHT == 16 else 'byte' if MESSAGELENGHT == 8 else 'bit'
print(Datapacket)

谢谢

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1343  
  信创产业的蓬勃发展推动着各行业数字化转型加速,数据库迁移作为其中关键一环,面临诸多挑战。信创数据库迁移旨在将传统数据库平稳过渡到信创环境,以满足自主可控、安全可靠的需求。这一过程涉及技术、业务等多方面因素,稍有不慎就可能出现各种问题,影响业务的正常运行。深入探讨信创数据库迁移过程中的常见问题及解决方案,对于保障迁移工作...
2027年信创国产化   41  
  随着信息技术的飞速发展,信创国产化成为了国家战略的重要组成部分。国产化信创产品名录涵盖了众多领域,其在各个关键应用场景中发挥着重要作用。而信创国产化操作系统作为其中的核心环节,具备五大核心优势,为我国信息技术产业的自主可控发展提供了坚实支撑。关键应用场景之办公领域在办公领域,国产化信创产品有着广泛且深入的应用。如今,越...
国产信创系统   37  
  随着信息技术的飞速发展,信创国产化操作系统在政府部门的推广应用具有重要的战略意义。它不仅关乎国家信息安全,更是推动国内信息技术产业自主创新、实现科技自立自强的关键举措。在当前复杂的国际形势下,政府部门积极推广信创国产化操作系统,对于保障国家政务信息的安全稳定运行,提升信息技术的自主可控能力,具有不可替代的重要作用。推广...
信创产品有哪些   28  
  在企业数字化转型的进程中,信创数据库解决方案的选择至关重要。它不仅关乎企业数据的安全存储与管理,更影响着企业业务的稳定运行与未来发展。合适的信创数据库能够助力企业在复杂多变的市场环境中提升竞争力,保障数据主权与安全。然而,面对市场上众多的信创数据库产品和解决方案,企业往往感到困惑,不知如何做出正确的选择。接下来,我们将...
信创电脑   24  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用