第1月2周5天

  1. 基础数据类型补充
  2. 集合set
  3. 深浅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 + l2
print(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 set1
set1.discard() #与remove功能相同,删除元素不存在时不会抛出异常

关系测试

"交集"
set1 & set2
set1.intersection(set2)
"并集"
set1|set2
set1.union(set2)
"反交集" 
set1^set2
set1.symmetric_difference(set2)
"差集" #某一方独有的
set1 - set2 #子集 - 超集
set1.difference(set2)
"子集"
set1 < set2 #返回True 表示子集
set1.issubset(set2)
"超集"
set2 > set1 #返回True 表示超集
set2.issuperset(set1)

"冻集合"不可变数据类型,可以表示为字典的key
set1 = {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 copy
l1 = [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 copy
with open(str(copy.__file__), "r") as f:
    print(f.read())

猜你喜欢

转载自www.cnblogs.com/yonghuierming/p/9507662.html