基础之你容易忽略的细节

1.while...else和for...else,废话不多说,直接看代码,不知道结果的可以自行实验。

1 for i in range(1,6):
2     if i==3:
3         break
4     print(i)
5 else:
6     print(777)
加break就不执行else
1 for i in range(1,6):
2     print(i)
3 else:
4     print(777)
不加break执行else

2.常见的数据类型转换

#数字转字符串PS:能看懂这波俩个i的同学恭喜你,装饰器的重点你可能一下就理解了
i=123
i=str(i)
print(i,type(i))
#数字转bool值
i=123
i=bool(i)
print(i,type(i))
#举个特殊的0
b=0
b=bool(b)
print(b,type(b))
#万能的字符串除了字典不能直接转,都可以,骚的不行!为什么这么骚,因为人是可迭代对象
s1='123'
#字符串转数字,前提是字符串为数字
s_int=int(s1)
print(s_int,type(s_int))
#字符串转列表
s2='123hjs'
s_list=list(s2)
print(s_list,type(s_list))
#字符串转元组
s_tuple=tuple(s2)
print(s_tuple,type(s_tuple))
#字符串转集合
s_set=set(s2)
print(s_set,type(s_set))
#下面演示一波特殊的空字符串转bool值
s3=''
s_bool=bool(s3)
print(s_bool,type(type))
#列表转字符串
lst=['alex','wusir','taibai']
s_lst=str(lst)
print(s_lst,type(s_lst))
#列表转元组
tuple_lst=tuple(lst)
print(tuple_lst,type(tuple_lst))
#列表转集合
set_lst=set(lst)
print(set_lst,type(set_lst))
#特殊的空列表转换bool值
lst1=[]
lst2=[None]  # 列表括号里换成'',(),[],类似结果一样还是True
bool_lst1=bool(lst1)
bool_lst2=bool(lst2)
print(bool_lst1,type(bool_lst1))
print(bool_lst2,type(bool_lst2))
#元组转列表
tu=('a',1,None)
list_tu=list(tu)
print(list_tu,type(list_tu))
#元组转集合
set_tu=set(tu)
print(set_tu,type(set_tu))
#元组转字符串
str_tu=str(tu)
print(str_tu,type(str_tu))
#空元组转换bool值依旧是False
tu1=()
bool_tu=bool(tu1)
print(bool_tu,type(bool_tu))
#集合转列表
set1={1,'taibai','alex'}
list_set=list(set1)
print(list_set,type(list_set))
#集合转元组
tuple_set=tuple(set1)
print(tuple_set,type(tuple_set))
#集合转字符串
str_set=str(set1)
print(str_set,type(str_set))
#空集合转换bool值
set2=set()
bool_set=bool(set2)
print(bool_set,type(bool_set))
# 字典转字符串
dic = {'name': 'taibai', 'age': '18'}
str_dic = str(dic)
print(str_dic, type(str_dic))
# 字典转列表有搞头,因为字典有keys、values、items三个好玩的
list_dic1 = list(dic.keys())  # 和直接list这个字典一样
print(list_dic1, type(list_dic1))
list_dic2 = list(dic.values())
print(list_dic2, type(list_dic2))
list_dic3 = list(dic.items())
print(list_dic3, type(list_dic3))  # 每个键值对生成一个元组组成的列表
# 字典转元组与转列表一样的,就不一一举例了
tuple_dic = tuple(dic)
print(tuple_dic, type(tuple_dic))
# 字典转集合同楼上
set_dic = set(dic)
print(set_dic, type(set_dic))
# 空字典转bool值
dic1 = {}
bool_dic = bool(dic1)
print(bool_dic, type(bool_dic))

终于捋完了,但是感觉还差点什么,whatever,先就这些吧,总结一下:字符串是最强的数据类型,能和各个数据类型进行转换;字典因为是键值对形式的数据类型,所以转换起来需要通过调用自己的items方法才能完美转换成和原来一样形态的数据类型(个人理解,有点绕);列表、集合、元组这三个数据类型应该是三个很默契的合伙人,只要是可迭代对象他们就能带你飞;数字就不做赘述了 。

3.列表、字典的循环操作问题

列表在循环中,如果进行增删的操作,会改变其索引;与字典在循环中进行增删的操作会改变其大小一个道理,为了解决该问题的方案(字典的例子可以自行实验):

s = '老男孩都是大佬'
lst = []
# s1='_'.join(s)
# lst=s1.split('_')
lst.extend(s)  # 先构建一个列表,用一波迭代添加回忆下
print(lst)
# 利用新的列表将旧列表的每个元素删除
lst2 = []
for i in lst:
    lst2.append(i)
print(lst)
for i in lst2:
    lst.remove(i)
print(lst)
利用新的列表将旧列表的每个元素删除
s = '老男孩都是大佬'
lst=list(s)
print(lst)
for i in range(0, len(lst)):
    lst.pop()
print(lst)
利用pop()倒序

4.fromkeys是个蛇精病

# 把第一个参数中的每一个元素拿出来和第二个参数组成一个键值对
# 生成出来的键指向的value是同一个对象. 改变其中一个的时候. 另一个也会跟着改变
dic = dict.fromkeys(["jay", "jj"], ["周杰伦", "林俊杰"])
dic['jay'].append("蔡依林")
print(dic)
dic = {}
dic.fromkeys(["葫芦娃", "蛇精"], ["冯提莫", "陈一发"])
print(dic) # 什么都不打印.此处涉及的静态方法的概念,后面面向对象会讲到

5.深浅copy

赋值运算俩个内存地址完全一样;

lst1 = ["金⽑狮王", "紫衫龙王", "⽩眉鹰王", "⻘翼蝠王"]
lst2 = lst1
print(lst1,id(lst1))
print(lst2,id(lst2))
lst1.append("杨逍")
print(lst1,id(lst1))
print(lst2,id(lst2))

浅copy只能使外层的内存地址变为新的,里层的内存地址还是一样;

lst1 = ["何炅", "杜海涛", "周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
lst2 = lst1.copy()
lst1[3].append("⽆敌是多磨寂寞")
print(lst1,id(lst1))
print(lst2,id(lst2))
print(id(lst1[3]), id(lst2[3]))

深copy所有层都是独立的内存地址。

import copy

lst1 = ["何炅", "杜海涛", "周渝⺠", ["麻花藤", "⻢芸", "周笔畅"]]
lst2 = copy.deepcopy(lst1)
lst1[3].append("⽆敌是多磨寂寞")
print(lst1)
print(lst2)
print(id(lst1[3]), id(lst2[3]))
原文地址:https://www.cnblogs.com/changwentao/p/9152451.html