功能如下。我想为此使用while循环而没有方法,因为我想使用while循环和if语句进行更多练习。
def remove_leading_zeros(s):
'''(str) -> str
Return s, but without any extra leading zeros
e.g. given "007", return "7"
Precondition: Each character of s is a number.
'''
i = 0
r = ''
while i < len(s):
if s[i] != '0':
r = r + s[i]
i += 1
return r
因此,当我输入remove_leading_zeros('0001950')
时,我希望输出为'1950'
。
但是,通过上面的功能,我似乎省略了所有的零。我应该修改什么才能创建一个只省略前导零的函数?
我也试过r = r + s[i:]
,所以只要遇到非零,它就会在之后返回所有内容,但我不知道如何以此结束循环。
解决。感谢所有帮助!
答案 0 :(得分:2)
当你发现非零时,只需返回其余的字符串:
i = 0
r = ''
while i < len(s):
if s[i] != '0':
return s[i:]
i += 1
return r
甚至更简单:
i = 0
while i < len(s) and s[i] == '0':
i += 1
return s[i:]
为了完整起见,它有一个功能:
s.lstrip('0')
答案 1 :(得分:1)
你的循环正在做的是跳过所有的零。您没有逻辑可以记住您是否已经拥有非零数字。您可以通过用以下代码替换循环来修复它:
nonZeroEncountered = False
while i < len(s):
if nonZeroEncountered:
r = r + s[i]
elif s[i] != '0':
nonZeroEncountered = True;
r = r + s[i]
i += 1
return r
基本上,你想要第一个非零数字后面的所有数字。此循环将跳过零,直到它达到非零数字,此后它将不再跳过任何字符。
答案 2 :(得分:1)
您可以更新它,以便在遇到第一个非零值后停止检查该字符是否为零(当前您甚至在找到非零数字后仍在检查)。例如,您可以这样做:
def remove_leading_zeros(s):
i = 0
while i < len(s):
if s[i] == '0':
# do nothing
i += 1
else:
return s[i:]
我测试了它,它似乎工作。沿着这些方向的东西应该可以解决问题。这个想法是,在你点击你的第一个非零数字后,你就停止检查任何东西,只返回剩下的东西。
编辑:修复了原始答案中的几个错误。
答案 3 :(得分:1)
您可以添加一个布尔变量来指示是否还遇到了第一个非零数字,并且只从那里附加到r
:
def remove_leading_zeros(s):
i = 0
r = ''
started = False
while i < len(s):
if started or s[i] != '0' or i + 1 == len(s):
started = True
r = r + s[i]
i += 1
return r
i + 1 == len(s)
是对remove_leading_zeros('000')
边缘情况的额外检查,以确保它返回'0'
而不是''
。
答案 4 :(得分:0)
没有人提到的一件事是如何在你尚未准备好从函数返回时提前结束循环:使用break
语句。像这样:
while True: # A common way to write an "infinite" loop
print("Doing some work...")
result = do_something()
if result is None: # Or whatever other signal means "we're finished here"
break # The next thing printed will be "We're done!"
print("Going through the loop again...")
print("We're done!")
看看它是如何工作的? break
语句中断循环并在循环后的下一个语句处恢复程序流,在本例中是print("We're done!")
函数调用。
还有continue
语句,它会再次直接跳到循环的顶部,跳过任何剩余的语句。如果上述循环中的break
代替continue
,那么获得None
结果会导致跳过print("Going through the loop again...")
调用并直接返回print("Doing some work...")
}。当然,那么就没有办法退出循环了,它真的将成为一个无限循环,这将是一件坏事。
关于continue
的另一件事:如果你使用的是for
循环,它会(顾名思义)继续循环中的 next 项目:
for i in range(10):
if (i % 2) == 0:
continue
print(i) # Will print 1, 3, 5, 7 and 9
这两个工具continue
和break
将使循环处理变得更加容易。