完全新手在这里玩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)
的print
和return
。
如果你这样做了,那么你的"更高层次的抽象"函数会更简单,只是委托给另外两个函数......
def distance_from_zero(d=None):
d = ensure_number(d)
return show_abs(d)
看看与关注点混为一谈的方法相比,它有多"干净"? 子单元的有意义的名称(此处为简单函数)ensure_number
和show_abs
有助于可读性和清晰度。
另外,如果你在程序的其他地方需要它们,你可以重用这些"构建块"中的一个或两个,只需再次调用这些较低级别的函数,避免"复制和粘贴编程的主要罪过",并尊重"DRY"的核心编程原则("不要重复自己")。
无论如何,这是你要考虑的。 我认为在一个人的编程学习(一生的努力)中养成好习惯永远不会太早!