迭代问题
列表迭代问题
- 列表内存自动管理:Python的列表会自动管理内存,当对列表插入元素或者删除元素时,列表会移动其中的元素以保证元素之间是连续的。
下面程序的输出结果是什么?
lst = [1, 2, 3]
for i in lst:
lst.remove(i)
print(lst)
为什么没有得到空列表?
如果原列表再内存中如下图
第一次循环,取下标为0的元素,即 i = 1,再执行循环体,删除元素1,此时因为列表的内存会自动管理,即后面的所有元素都会自动往前靠,如下图:
第二次循环,取下标为1的元素,因为第一次循环导致元素的位置发生了改变,所以此时下标为1的元素并不是2,而变成了3,再执行循环体,就会删除元素3。
第三次循环,取下标为2的元素,找不到这样的元素,for循环自动停止。
如何才能把元素删完呢?
- 思路:遍历一个元素和原列表一样新的可迭代对象即可
lst = [1, 2, 3]
new_iter = lst.copy()
# new_iter = lst[:]
# new_iter = list(lst)
# new_iter = tuple(lst)
for i in new_iter:
lst.remove(i)
print(lst)
字典迭代问题
- 字典、集合在迭代时,不允许改变原数据的size
d = {'name': 'Tom', 'age': 28, 'height': 177}
for k in d:
print(d.pop(k))
print(d)
s = {'a', 'b', 'c', 'd', 'f'}
for i in s:
s.remove(i)
print(s)
d = {'name': 'Tom', 'age': 28, 'height': 177}
new_iter = d.copy()
# new_iter = dict(d)
# new_iter = list(d)
# new_iter = tuple(d)
for k in new_iter:
print(d.pop(k))
print(d)
s = {'a', 'b', 'c', 'd', 'f'}
new_iter = s.copy()
# new_iter = set(s)
# new_iter = list(s)
# new_iter = tuple(s)
for i in new_iter:
s.remove(i)
print(s)
pass语句
- pass 是一个关键字,表示一个空语句,当它被执行时,不做任何操作,通常用作占位符,在语法上需要语句但实际上不需要执行任何操作的情况下使用。
score = float(input('你这次考试考了多少分? '))
if score >= 90:
print('厉害!')
elif score >= 80:
pass
elif score >= 70:
print('良好!')
elif score >= 60:
... #pass与...意义一样占位符不需要操作
else:
print('不及格!')