常见问题和错误
错误代码:
def Wrong():
print(f'Function runing');
mm = input("please input the number you wanner delete:\n")
num = list(range(98, 122))
for i in num:
m = i
while m != 0:
x = m% 10
if x == int(mm): #注意input的返回值是字符串类型,即使输入的是数字,也无法直接和数字比较
num.remove(i)
break
m = int(m/10) #此处必须取整否则会出现小数情况,而导致%运算混乱
print(num)
if __name__ == "__main__":
Wrong()
运行结果:
Function runing
please input the number you wanner delete:
1
[99, 101, 103, 105, 107, 109, 111, 113, 115, 117, 119, 121]
Process finished with exit code 0
以上代码在执行时会由于列表发生变化,从而导致循环混乱,此处想具体观察列表变化和调试可以通过将列表调小,加入一些print语句来显示特定值或列表的方式。
测试代码:
def Wrong():
print(f'Function runing');
mm = input("please input the number you wanner delete:\n")
num = list(range(9, 12))
for i in num:
m = i
while m != 0:
x = m % 10
if x == int(mm):
num.remove(i)
break
m = int(m/10);
print(num)
if __name__ == "__main__":
Wrong()
输出结果:
Function runing
please input the number you wanner delete:
1
[9, 11]
Process finished with exit code 0
分析:
使用print语句看清具体值,以及列表的变化
def Wrong():
print(f'Function runing');
mm = input("please input the number you wanner delete:\n")
num = list(range(9, 12))
for i in num:
m = i
print(f'The start {num}')
print(f'The start {m}')
while m != 0:
x = m % 10
if x == int(mm):
num.remove(i)
break
m = int(m/10);
print(f'm= {m}')
print(f'The last {num}')
print(num)
if __name__ == "__main__":
Wrong()
结果显示:
Function runing
please input the number you wanner delete:
1
The start [9, 10, 11]
The start 9
m= 0
The last [9, 10, 11]
The start [9, 10, 11]
The start 10
m= 1
The last [9, 11]
[9, 11]
Process finished with exit code 0
由此可见当删除第一个元素后,由于for 循环还保持着原先顺序,但是列表已经改变,从而导致循环无法进行,就以上代码而言,当i=10时,列表中删除之后,循环本应进行到原本10的后面的数,但10被删除后,后一个数就相当于向前移动了一位,可以把列表看做座位的集合,而for循环中i就相当于访问每一个座位,10被删除后,本来最后一个座位上的是11,但由于前一位上的数被删除了,所以自然就成了那个位上的数。当for走到11的位子上时,则会显示此位上无数,因此停止循环。
正解
for循环思路
def num_list():
num = list(range(98,122))
figure = [] #一个空列表,来装除删除元素之外的所有数
mm = input("please input the number you wanner delete:\n")
for i in num:
m = i
flag = 0 #作为标记作用
while m != 0:
x = m % 10
if x != int(mm):
flag += 1
else:
flag = 0 #一旦出现要求删除的数,马上标记清零,然后退出循环。
break
m = int(m / 10)
if flag != 0: #由于前面else语句,如果是要删除的数,flag一定为0
figure.append(i)
print(figure)
运行结果
please input the number you wanner delete:
1
[98, 99]
Process finished with exit code 0;
具体原理:
由于for循环的删除效果不行,所以采取另外一个思想,就是不对列表本身采取任何措施,把有用的取出来,放到其他地方。
如果该数符合我的条件,就会进入另外列表,若不符则留在原来列表,而题目要求删除包含某个值的数,而我采用把不包含某个值的数放入另一个列表了。
while 循环思路
def while_list():
mm = input("please input the number you wanner delete:\n")
num = list(range(99, 122))
i = 0
while i <= len(num) -1:
m = num[i]
print('j') #单独一个分隔标记
print(num)
while m != 0:
x = m % 10
if x == int(mm):
num.remove(num[i])
i = i-1
break
m = int(m / 10) #此处必须取整,否则出现小数会导致循环混乱,同时此处语句主要作用是取出其除开x的其他数字
i += 1
print(f'The last is {num}')
运行结果:
please input the number you wanner delete:
1
j
[99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 113, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 114, 115, 116, 117, 118, 119, 120, 121]
j
[99, 115, 116, 117, 118, 119, 120, 121]
j
[99, 116, 117, 118, 119, 120, 121]
j
[99, 117, 118, 119, 120, 121]
j
[99, 118, 119, 120, 121]
j
[99, 119, 120, 121]
j
[99, 120, 121]
j
[99, 121]
The last is [99]
此处更能看清列表中内存变化和数字变化,当然在for 循环中也可嵌入while种处理方式。此处就不细说了,想了解的小伙伴,也可结合以上两个方式,去敲敲代码
简单比较for 与 while
while方便对列表中每一位元素的处理,而for 循环处理时,由于本身特性,相当于遍历所有元素。
平常运用中for 循环更适用于已经明确个数的列表等集合。while也可用于明确个数的列表,但更多时候用于不明个数列表,或者变化的列表。
以上均为个人见解,多有不周之处,敬请见谅