在这里玩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"
答案 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”的核心编程原则(“不要重复自己”)。
无论如何,那是你要考虑的。我认为在一个人的编程学习(终身努力)中获得良好的习惯永远不会太早! -