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

时间:2015-01-24 17:24:37

标签: python function python-2.7 input user-input

在这里玩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"

2 个答案:

答案 0 :(得分:0)

使用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"

答案 1 :(得分:0)

你已经收到了答案,但在我看来,实际上并没有你所要求的答案。这是另一种可能更接近的可能性......:

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

这使用“goose typing” - 对抽象基类numbers.Real进行检查,包含除复杂数字之外的所有数字(如果您也喜欢复数,请改用numbers.Number)。它会循环零次或多次,直到最后d为可接受的数字(如果您也喜欢复数,请使用complex代替float),然后再开始工作。

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

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

这可能是您对编程掌握程度的过早关注,但实际上并不比将问题混为一谈更难。也就是说,您可能有一个def ensure_number(d):函数,它只是上面的while循环,然后当它是可接受的数字时返回d,并且单独 {{1} }函数只对show_abs的{​​{1}}和print进行。

如果你这样做了,那么你的“更高层次的抽象”功能会更简单,只需委托其他两个函数......:

return

与关注点混淆的方法相比,看看它有多“清洁”?子单元的有意义的名称(此处为简单函数)abs(d)def distance_from_zero(d=None): d = ensure_number(d) return show_abs(d) 有助于提高可读性和清晰度。

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

无论如何,那是你要考虑的。我认为在一个人的编程学习(终身努力)中获得良好的习惯永远不会太早! -