- 基础数据类型补充
- 集合set
- 深浅copy
七步记忆法
预习(20min) 听课 课间(课堂代码多敲) 下午晚上练习 网上睡觉前回忆 第二天早上 每周总结(默写这周学习的东西,然后对照) 每月总结
!!!error 疑问
在同一个代码块,是先从小数据池去找还是去代码块去找? !!!如果b1:gbk的bytes类型---->utf-8的bytes类型怎么办?
先将gbk解码成unicode,再将unicode编码成utf-8
英文字母,数字,特殊字符可以互相转换,因为他们引用的都是ASCII
s1 = "alex"b1 = s1.encode("gbk")s2 = b1.decode("utf-8"e)print(s2)
enumerate
enumerate(iterable,int)
需要可迭代对象,返回元组(索引,值)。 默认初始索引从0开始。
基础数据类型(三)(坑篇)
如何看源码?
元组
"元组中只有一个数据,且没有逗号,则该元组与里面数据的数据类型相同"
tu = (1) 数字类型tu2 = ("alex")字符串类型tu3 =(1,)元组类型
列表
"列表与列表可能相加"l1 = [1,2,3]l2 = ["alex","wusir"]l3 = l1 + l2print(l3)l1
!!!error 强调
在循环一个列表时,不能对列表进行改变大小操作,会对索引改变,产生改变
!!!
"""删除列表索引的奇数位的值"""l1 = [11,22,33,44,55,66,77] #错误for i in range(1,len(l1)-2,2): l1.pop(i) #删除之后列表改变了,再次循环的下一个元素都变了。再去判断索引,和最开始的预期是不符的。列表不会动态测试。#删除动作不仅是删除还是改变列表的大小。 print(l1)"从后删除"for i in range(len(l1)-2,-1,-2): l1.pop(i)print(l1)"切片"print(l1[0::2])"取出偶数"l = [l1[i] for i in range(len(l1)) if i % 2 == 0]print(l)
字典
dict.fromkeys() 创建字典的方式创建字典的方式dic={}dic={a:b for a in l1 for b in l2 }dic = dict({"name":"alex"})dic = dict.fromkeys([1,2,3],"alex")"陷阱"dic1 = dict.fromkeys([1,2,3],[])print(dic1)dic1[1].append("alex")print(dic1)print(id(dic[1])) #添加的同一个列表容器print(id(dic[2]))print(id(dic[3]))
!!!error 强调
字典在迭代过程中,不能改变字典的大小,例如增加字典或者删除同一个字典.直接报错。 !!!dic = {"k1":"1","k2":"2","na":"1"}ll = []for i in dic.keys(): if "k" in i: ll.append(i)for i in ll: dic.pop(i)print(dic)"方式一"dic = {"k1":"1","k2":"2","na":"1"}dic1 = {}for i in dic.keys(): if not "k" in i: dic1.setdefault(i,dic[i])"方式二"dic = {"k1":"1","k2":"2","na":"1"}dic1 = {i:dic[i] for i in dic.keys() if not "k" in i} print(dic1)
int str bool bytes
str -> list
s1 = " alex wusir taibai"l1 = s1.split()print(l1)
list -> str 此list种的元素必须是str类型
list = ["sfs","sfs","qeqw"]"".join(list)
dict.keys() dict.values() dict.items() --> list
list --> tuple
tuple --> list
tu2 = (1,)l1 = list(t2)
dic-->list 默认是将keys都转过去
li = list(dic)
list --> dic 不能直接转
0,{ },[ ],( )," " --> bool False
集合 set
与大数据有关用的多一些
集合要求里面的元素必须是不可变的数据类型,> 元素需要可哈希的。
集合本身是可变的数据类型 集合里面的元素不重复(天然去重),无序。 主要用途:去重,关系测试。
set1 = {"wusir","alex",1,2,3}set2 = set({"alex","wusir"})
list --> set
list去重,用set效率最高
l1 = [1,2,3,4,5,6,4] #3.7集合为元素自动排序set1 = set(l1)
增
set1 = {"alex","wusir"}set1.add("女神")set1.update("abc") 迭代加入 类似列表extend
删
set1.remove("alex") set1.pop() 随机删除set1.clear() #set()表示空集合del set1set1.discard() #与remove功能相同,删除元素不存在时不会抛出异常
关系测试
"交集"set1 & set2set1.intersection(set2)"并集"set1|set2set1.union(set2)"反交集" set1^set2set1.symmetric_difference(set2)"差集" #某一方独有的set1 - set2 #子集 - 超集set1.difference(set2)"子集"set1 < set2 #返回True 表示子集set1.issubset(set2)"超集"set2 > set1 #返回True 表示超集set2.issuperset(set1)"冻集合"不可变数据类型,可以表示为字典的keyset1 = {1,2,3}set3 = frozenset(set1)
"冻集合"不可变数据类型,可以表示为字典的key
深浅拷贝copy
浅拷贝
l1 = [1,2,3]l2 = l1.copy()l1.append(666)print(id(l1))print(id(l2))l1 = [1,2,3,[22,]]l2 = l1.copy() #浅拷贝执行时,开辟一个内存空间赋给新变量,再将元素的地址复制到这个空间中。print(id(l1))print(id(l2))l2[-1].append(33)print(l1)print(l2)
深拷贝
import copyl1 = [1,2,3,[22,]]l2 = copy.deepcopy(l1) #完全独立的copy一个数据print(l1,l2)l1[-1].append("太白")print(l1,l2)
!!!note copy
完全独立的copy一份数据,与原数据无关 深copy 如果一份数据(列表)第二层时,你想与原数据进行共用 浅copy !!!面试题 切片是深拷贝还是浅拷贝.
切片是浅拷贝第二层时共用的
l1 = [1,2,3[22,33]]l2 = l1[:]l1.append(66) print(l2)# [1, 2, 3, [22, 33]]l1[-2].append(666) print(l2)#[1, 2, 3, [22, 33, 666]]
查看python 源码
import copywith open(str(copy.__file__), "r") as f: print(f.read())