Python习题
1.用算法判断某⼀一个字符串串是否是⼩小数
s17 = "-123.12" s17 = s17.replace("-", "") #替换掉负号 if s17.isdigit(): print("是整数") else: if s17.count(".") == 1 and not s17.startswith(".") and not s17.endswith("."): print("是⼩数") else: print("不不是⼩小数")
2.循环删除列列表中的每⼀一个元素
分析: for的运⾏行行过程. 会有⼀一个指针来记录当前循环的元素是哪⼀一个, ⼀一开始这个指针指向第0 个. 然后获取到第0个元素. 紧接着删除第0个. 这个时候. 原来是第⼀一个的元素会⾃自动的变成 第0个. 然后指针向后移动⼀一次, 指向1元素. 这时原来的1已经变成了了0, 也就不会被删除了;循环删除都不行. 不论是⽤用del还是⽤用remove.pop都不行.
li = [11, 22, 33, 44] for e in li: li.remove(e) print(li)
li = [11, 22, 33, 44] for el in li: li.pop() # pop也不不⾏行行 print(li)
li = [11, 22, 33, 44] for i in range(0, len(li)): del li[i] print(li) # i= 0, 1, 2 删除的时候li[0] 被删除之后. 后⾯面⼀一个就变成了了第0个. # 以此类推. 当i = 2的时候. list中只有⼀一个元素. 但是这个时候删除的是第2个 肯定报错啊
结果[22,44]
li = [11, 22, 33, 44] for i in range(0,len(li)): # 循环len(li)次, 然后从后往前删除 li.pop() print(li)
或者使用whlie循环,由于删除元素会导致元素的索引改变, 所以容易易出现问题. 尽量量不要再循环中直接去删 除元素. 可以把要删除的元素添加到另⼀一个集合中然后再批量量删除.
. count = len(li) while count > 0: count = count - 1 #倒着删除 del li[count] print(li)
3.fromkeys与append连续使用时的错误
分析:代码中只是更更改了了jay那个列列表. 但是由于jay和JJ⽤用的是同⼀一个列列表. 所以. 前⾯面那个改了了. 后 ⾯面那个也会跟着改
dic = dict.fromkeys(["jay", "JJ"], ["周杰伦", "麻花藤"]) print(dic) lst = dic.get('jay').append("湖大") print(dic) 结果: {'jay': ['周杰伦', '麻花藤'], 'JJ': ['周杰伦', '麻花藤']} {'jay': ['周杰伦', '麻花藤', '湖大'], 'JJ': ['周杰伦', '麻花藤', '湖大']}
假设开始定义了dic 则不会出现这个错误,
dic = {'jay': ['周杰伦', '麻花藤'], 'JJ': ['周杰伦', '麻花藤']} print(dic) lst = dic.get('jay').append("湖大") print(dic) 结果: {'jay': ['周杰伦', '麻花藤'], 'JJ': ['周杰伦', '麻花藤']} {'jay': ['周杰伦', '麻花藤', '湖大'], 'JJ': ['周杰伦', '麻花藤']}
4. 循环删除字典的元素
dict中的元素在迭代过程中是不允许进⾏行行删除的,把要删除的元素暂时先保存在⼀一个list中, 然后循环list, 再删除
dic = {'k1': 'alex', 'k2': 'wusir', 's1': '⾦金金⽼老老板'} # 删除key中带有'k'的元素 for k in dic: if 'k' in k: del dic[k] # 在循环迭 代的时候不不允许进⾏行行删除操作 print(dic)
把要删除的元素暂时先保存在⼀一个list中, 然后循环list, 再删除
dic = {'k1': 'alex', 'k2': 'wusir', 's1': '⾦金金⽼老老板'} dic_del_list = [] # 删除key中带有'k'的元素 for k in dic: if 'k' in k: dic_del_list.append(k) for el in dic_del_list: del dic[el] print(dic)
5. set 元素变更 无法直接修改,只能结合remove和add 使用
6 对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量量. 并不是复制⼀一份内容. 所以. lst1的内存指向和lst2是⼀一样的. lst1改变了了, lst2也发⽣生了了改变
lst1 = ["⾦金金⽑毛狮王", "紫衫⻰龙王", "⽩白眉鹰王", "⻘青翼蝠王"] lst2 = lst1 print(lst1) print(lst2) lst1.append("杨逍") print(lst1) print(lst2) dic1 = {"id": 123, "name": "谢逊"} dic2 = dic1 print(dic1) print(dic2) dic1['name'] = "范瑶" print(dic1) print(dic2) 结果如下: ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王'] ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王'] ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王', '杨逍'] ['⾦金金⽑毛狮王', '紫衫⻰龙王', '⽩白眉鹰王', '⻘青翼蝠王', '杨逍'] {'id': 123, 'name': '谢逊'} {'id': 123, 'name': '谢逊'} {'id': 123, 'name': '范瑶'} {'id': 123, 'name': '范瑶'}
尝试 copy[浅拷⻉. 只会拷贝第⼀层. 第⼆层(也就是嵌套的列表元素)的内容不会拷贝. 所以被称为浅拷⻉贝,简单说 嵌套的改变,那也会一起改变]和deepcopy[不会因任何改变而改变]
lst1 = ["何炅", "杜海海涛","周渝⺠民"] lst2 = lst1.copy() lst1.append("李李嘉诚") print(lst1) print(lst2) print(id(lst1),id(lst2)) 结果如下: ['何炅', '杜海海涛', '周渝⺠民', '李李嘉诚'] ['何炅', '杜海海涛', '周渝⺠民'] 1793001742920 1793001742984