获取用户输入而不是函数的参数



完全新手在这里玩Codeacademy。我只是想知道如果我想调整这个函数以允许用户输入代替"d",我将如何去做?

def distance_from_zero(d):
    if type(d) == int or type(d) == float:
      print abs(d)
      return abs(d)

    else:
      print "please enter a number"
      return "please enter a number"

使用 try/except 并d=raw_input

def distance_from_zero(d=raw_input):
        try:
           d = abs(float(d("Enter a number")))  # if it can be a float it can an int
           return d
        except ValueError:
            return "please enter a number"

In [10]: distance_from_zero()
-444
Out[10]: 444.0
In [11]: distance_from_zero()
foo
Out[11]: 'please enter a number'

如果您希望从您的问题似乎想要的用户输入d这确实有效,但我不建议使用它,我会使用以下方法来输入:

def distance_from_zero():
    while True:
        try:
            d = abs(float(raw_input("Enter a number")))
            return d
        except ValueError:
            print "please enter a number"

要处理可能将数字作为输入或未设置 d=None 并尝试转换用户传入的任何内容,或者在未提供 arg 时从用户那里获取输入:

def distance_from_zero(d=None):
    try:
        d = abs(float(raw_input("Enter a number"))) if d is  None else abs(float(d))
        return d
    except ValueError:
        return "please enter a number"

你已经收到了答案,但在我看来,没有一个能真正做到你的要求。 这是另一种可能更接近的可能性...:

import numbers
def distance_from_zero(d=None):
    while not isinstance(d, numbers.Real):
        try: d = float(raw_input('please enter a number'))
        except ValueError: print('{!r} is not a number'.format(d))
    print(abs(d))
    return abs(d)

[添加:d的非数字默认值,以防万一您希望能够在没有参数的情况下调用函数来强制用户输入,而不是像下面所说的 Q 那样只允许它;同上。

(如果是 Python 3,请使用 input 而不是 raw_input )。

这使用"鹅类型" - 检查抽象基类numbers.Real,包括除复数以外的所有数字(如果你也喜欢复数,请使用numbers.Number代替)。 它循环零次或多次,直到最后d是一个可接受的数字(如果你也喜欢复数,请使用complex而不是float),然后完成工作。

这种对抽象基类[又名ABC]的检查,称为"鹅类型",通常(但并不总是)比我也提倡的更通用的"鸭子类型"方法更可取 - 粗略地说,当ABC已经存在时,鹅比鸭子更好,完全符合您的需求,但不是其他)。

这可能不是最好的架构,因为它混淆了两个问题:确保d是一个数字,然后对它做一些事情(在这种情况下,打印并返回其绝对值)。 特别是在大规模编程中,"关注点分离"是一个好主意——使用单独的单元(函数、类、模块等)来处理单独的关注点,将它们放在调用/使用单元的"编排"级别。

这可能是对你的编程掌握水平的一个过早的担忧,但它并不比将这些问题混为一谈更难。 也就是说,你可能有一个 def ensure_number(d): 函数,它只执行上面的while循环,然后在它是可接受的数字时返回d,还有一个单独的 show_abs 函数,它只执行abs(d)printreturn

如果你这样做了,那么你的"更高层次的抽象"函数会更简单,只是委托给另外两个函数......

def distance_from_zero(d=None):
    d = ensure_number(d)
    return show_abs(d)

看看与关注点混为一谈的方法相比,它有多"干净"? 子单元的有意义的名称(此处为简单函数)ensure_numbershow_abs有助于可读性和清晰度。

另外,如果你在程序的其他地方需要它们,你可以重用这些"构建块"中的一个或两个,只需再次调用这些较低级别的函数,避免"复制和粘贴编程的主要罪过",并尊重"DRY"的核心编程原则("不要重复自己")。

无论如何,这是你要考虑的。 我认为在一个人的编程学习(一生的努力)中养成好习惯永远不会太早!

相关内容

  • 没有找到相关文章

最新更新