我刚刚开始学习Python(2.x),请接受我的新手问题。 我正在尝试运行一个脚本,用户可以输入任何数字(例如整数或浮点数),预期输出将是该输入数字的总数字数。
然而,我遇到了以下问题,并想知道你是否可以帮助指导我解决它们。非常感谢!! :)
(问题)
在打印输出消息中,n值始终为0;而我希望用户打印出原始输入数字。
我希望它也能处理浮点数。现在,只要输入了一个浮点数,就会返回一个'ValueError'并停止脚本。
如果用户输入任何字符串或空白字符,脚本应忽略输入并再次重复询问用户输入,直到输入格式正确的数字(即整数或浮点数)。
def num_digits(n):
count = 0
while n:
count = count + 1
n = n/10
print 'The total digits for this number, ', n, ', are: ', count
return count
user_input = abs(int(raw_input('Enter a number:\n')))
num_digits(user_input)
答案 0 :(得分:1)
由于您还希望能够计算浮点数,只需执行n/10
就不够了。使用浮点值,你的循环将最终变为无限,因为它将执行浮点除法而不是int除法。 (例如16.3 / 10 = 1.63
- > 1.63 / 10 = .163
等 - 它永远不会到达0
)
为避免此问题,我建议将数字视为字符串,并计算字符串中数字的字符数。
def num_digits(n):
count = 0
curr = n # remaining string you're currently evaluating
while (curr != ''):
digit = curr[len(curr)-1] # get final char
curr = curr[:len(curr)-1] # trim last char off the string
if (not digit.isdigit()):
# ignore things like decimal points or negative signs
continue
count += 1
return count
while True:
value = raw_input('Enter a number:\n') # keep it in string form
try:
convert = float(value) # if it's a valid float, then it's also a valid int
break
except:
print "not a number. enter a valid number"
nd = num_digits(value)
print('{} has {} digits'.format(value, nd))
示例输出:
# float number, ignores negative sign and decimal point
$ python script.py
Enter a number:
-16.3
-16.3 has 3 digits
# asks for input until it has a valid number
$ python script.py
Enter a number:
foo
not a number. enter a valid number
Enter a number:
blah3
not a number. enter a valid number
Enter a number:
89
89 has 2 digits
答案 1 :(得分:1)
另一个答案已经解释了你的错误。无论如何,这里有几个其他的选项供你观看&理解:
def num_digits1(n):
return len(str(n).replace(".", "").replace("-", ""))
def num_digits2(n):
return sum(c.isdigit() for c in str(n))
for v in [-1.0, 0, 00, 000, 1.0, 1e2, 1e-2]:
print v, num_digits1(v), num_digits2(v)
答案 2 :(得分:0)
n
总是为零,因为你有这一行:
while n:
如果不成为False-y值,它永远不会退出该循环。如果要保留原始值,请对副本进行操作,或存储原始值:
def num_digits(n):
original = n
... # the rest of your code
对于浮点数,您需要将输入转换为浮点数,即
user_input = abs(float(raw_input('Enter a number:\n')))
最后,如果你想要一个号码,你可以这样做:
invalid_input = True
while invalid_input:
user_input = raw_input('Enter a number:\n')
try:
number = abs(float(user_input))
except ValueError:
print('***ERROR*** Please enter a number.')
else:
num_digits(number)
当然,你可以让自己的生活变得更轻松,并将其他内容更改为:
else:
print(len(user_input.split('.')[0]))
(split('.')[0]
用于处理浮点数)
<强>更新强>:
您似乎想要浮点数的实际长度,而不是使用您正在使用的精确算法。在这种情况下,忘记.split
部分,print(len(user_input))
应该做你想做的事。
答案 3 :(得分:0)
这应该做你要求的一切。随意评论任何问题
def num_digits():
while True:
n = raw_input('Enter a number:\n')
try:
float(n)
if '.' and '-' in n:
print len(n) - 2
elif '.' in n or '-' in n:
print len(n) - 1
else:
print len(n)
break
except:
print 'Invalid Input\n'
continue
num_digits()