【问题标题】:Maths with Ternary Boolean in PythonPython中的三元布尔数学
【发布时间】:2020-08-15 02:14:57
【问题描述】:

我写了这个小脚本来计算狗年。前两个狗年是人类年的 10.5 年,之后的所有其他年都值 4。

human_age = int(input("Enter the human age to convert it to doggy years: "))
    valid = (human_age <=2)
    def convert_to_dog_years(human_age):
        if valid:
            dog_years = human_age * 10.5
            print('Dog age is:', int(dog_years))
        elif not valid:
            dog_years = ((((human_age - 2) * 4) + 21))
            print('Dog age is:', int(dog_years))
    convert_to_dog_years(human_age)

我在想更多的事情: 我想指定数学运算,给它们两个名称,一个用于 0-2 的数字,另一个用于 2 及以上的数字。 然后我想用一个布尔值来决定我要应用哪个数学过程。

这在 python 中可行吗?

0-2    = dog_years = human_age * 10.5
>=2    = dog_years = ((((human_age - 2) * 4) + 21))

human_age = int(input("Enter the human age to convert it to doggy years: "))
valid = (human_age <=2)
def convert_to_dog_years(human_age):
    if valid 0-2 else 2&up
        print('Dog age is:', int(dog_years))
convert_to_dog_years(human_age)

【问题讨论】:

  • 编辑以将human_age 作为一行:human_age = int(input(....),为什么0-2 有更好的变量选择?第一选择有什么问题,在if 语句的帮助下,这两种情况都使用布尔值。

标签: python python-3.x python-2.7 boolean-logic conditional-operator


【解决方案1】:

虽然问题没有明确表达,但您似乎正在寻找存储函数并有条件地调用这些函数的方法。

好消息是,在 python 中,函数是第一类对象。

所以你可以做这样的事情 -

>>> handlers={
...  'valid':lambda human_age:human_age * 10.5,
...  'invalid': lambda human_age:((((human_age - 2) * 4) + 21))}
>>> handler_key = 'valid' if human_age <=2 else 'invalid'
>>> human_age=3 #In your case, take input here
>>> print(handlers[handler_key](human_age)) #call handler
25

为了进一步回应 OP 的评论,lambda 在这里无论如何都不是必需的。以下是具有简单功能的相同代码 -

>>> def invalid_handler(human_age): return ((((human_age - 2) * 4) + 21))
... 
>>> def valid_handler(human_age): return human_age * 10.5
... 
>>> handlers = {
...  'valid': valid_handler,
...  'invalid': invalid_handler}
>>> 
>>> print(handlers[handler_key](human_age))
25
>>> human_age=1
>>> print(handlers[handler_key](human_age))
17

我也想借此机会对 python 和几乎所有现代编程语言进行一次简短的咆哮 -

在现代编程语言中,为什么有这么多方法可以做同样的事情?

Python Zen,不。 13、状态——

应该有一种——最好只有一种——明显的方法。

然而,有多种方法可以达到相同的结果。我真的希望现代编程语言能够消除添加尽可能多的特性的诱惑,而是专注于更好地完成最重要的工作——速度、工具、更好的版本控制、框架。

我来自“C”背景,我相信它是迄今为止创造的最好的编程语言。

【讨论】:

  • 很抱歉问了这么愚蠢的问题,但你为什么要使用 lambda?提前致谢
  • @dev,这不是必需的,只是在这种情况下有助于缩短代码。我将更新代码以在没有 lambda 的情况下工作。
  • 非常感谢您的 cmets 风格。您是否介意告诉我,对于这个特定的迷你脚本,我是否最好按照最顶部的原始程序使用带有布尔值的 if else。什么时候最好使用 lambda 版本?
  • 几乎总是最好不使用 lambda。我自己很少在生产代码中使用这些。记住——简单胜于复杂。复杂胜于复杂。
猜你喜欢
  • 2019-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 2011-05-09
  • 2014-01-21
  • 2015-01-07
  • 2017-09-27
相关资源
最近更新 更多