一、基础数据类型汇总补充
int、str
s = ' ' print(s.isspace()) #判断字符串是否全部由空格组成
查看某个数据类型的全部方法:
list
l = [11,22,33,44]
for i in l:
del l[l.index(i)] #按照索引删除
print(l) #[22, 44],del会让元素个数减少,但是索引值是从0、1、2、3,没有按照元素的个数变化
l = [11,22,33,44]
for i in range(len(l)):
del l[i] #按照元素删除
print(l) #报错,数组超出范围
bool
转化为bool值为false为空的元素:0,'',[],(),{},set()
dict
dic = {'k1':'v1','k2':'v2','a1':'b1'}
for k in dic.keys(): #报错,在循环一个字典中不能删除键值对
if k.find('k') >= 0:
dic.pop(k)
print(dic)
#删除字典中键值包含'k'的键值对
#方法1
dic = {'k1':'v1','k2':'v2','a1':'b1'}
l = []
for k in dic.keys(): #报错,在循环一个字典中不能删除键值对
if 'k' in k:
l.append(k)
for i in l:
dic.pop(i)
print(dic)
#方法2
dic = {'k1':'v1','k2':'v2','a1':'b1'}
dic1 = {}
for k in dic.keys(): #报错,在循环一个字典中不能删除键值对
if 'k' not in k:
dic1.setdefault(k,dic[k])
dic = dic1
print(dic)
tuple
tu1 = (1) tu2 = (1,) print(tu1,type(tu1)) #1 <class 'int'>元组里面如果只有一个元素,且没有逗号,则其数据类型不为元组,同该元素的类型 print(tu2,type(tu2)) #(1,) <class 'tuple'>
二、集合set
1、集合是一个可变的数据类型,集合的元素必须是不可变的数据类型(str、int、bool、tuple)
2、集合几个是无序的,集合是不可重复的(列表转化为集合可去重)
3、集合的创建
set1 = set([2,3]) #集合可以通过set()的方法创建,且只能有一个参数,可以是列表/字典
set2 = set({'name':'jingjing','age':18})
set3 = {1,2,3,'sss'}
#set4 = {1,2,3,[2,3],{'name':'jingjing'}} #列表和字典是可变数据类型,不能作为集合的元素
print(set1,set2,set3)
4、集合的增删改查
#集合的增
set1 = {'alex','wusir',1,3}
set1.add('女神')
print(set1) #无可以多次打印查看无序的结果
set1.update('汪晓') #将参数的每个最小单元查分,插入集合
print(set1)
#集合的删
set1 = {'alex','wusir',1,3,(1,2)}
set1.pop() #随机删除一个元素
print(set1.pop()) #返回值为被删除的元素
#set1.pop('汪晓') #元素不存在会报错
print(set1)
set1 = {'alex','wusir',1,3,(1,2)}
set1.remove('alex') #按照元素删除,元素不存在或者没有参数则会报错
print(set1)
del set1 #删除整个集合
#集合的改,集合没有改
#集合的查
set1 = {'alex','wusir',1,3,(1,2)}
for i in set1:
print(i)
5、集合的其他方法
#求合集的交集、并集、反交集、差集、子集、超集
set1 = {1,2,3,4}
set2 = {3,4,5,6}
print(set1.intersection(set2)) #求合集的交集,{3, 4}
print(set1 & set2) #求合集的交集,{3, 4}
print(set1.union(set2)) #求合集的并集,{1, 2, 3, 4, 5, 6}
print(set1 ^ set2) #求合集的反交集,{1, 2, 5, 6}
print(set1 - set2) #求合集的差集,{1, 2},set1独有的
set1 = {3,4}
set2 = {3,4,5,6}
print(set1 < set2) #判断set1是否为set2的子集
print(set1 > set2) #判断set1是否为set2的超集
6、集合的特殊应用
#列表去重 #方法1 li = [1,2,33,33,2,1,4,5,6,6] print(list(set(li))) tu = (1,2,3) print(type(tu)) set1 = frozenset([1,2,3]) #将任意可变或不可变数据类型 转化为 不可变数据类型 print(set1,type(set1)) #<class 'frozenset'>,可查,可增加,不可修改
三、Python 直接赋值、浅拷贝和深度拷贝解析
http://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
1、直接赋值:其实就是对象的引用(别名)。a 和 b 都指向内存中的同一个对象,修改其一会修改该内存对象的值,此时会同步修改
#赋值
a = {1:[1,2,3]}
b = a
a[1].append(4)
print(a,b,a == b,a is b) #赋值,修改a,a、b值相等,对象相等
a = 1
b = a
a = 2
print(a,b,a == b,a is b) #赋值,修改a,a、b值不相等,对象不相等?????
2、浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。a 和 b 指向内存中不同的对象,但是两个对象指向的是同一个值(是引用)。此时如果修改a本身做操作,a会指向另外一个值,b不会同步修改;如果对a的某个元素做操作,则会更新内存中的该值,b会同步修改
#浅拷贝
a = {1:[1,2,3]}
b = a.copy() #int、str没有copy方法
a[1].append(4)
print(a,b,a == b,a is b) #浅拷贝,修改a,a、b值相等,对象不相等
3、深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象,两者对应的内存对象及其指向的值都是完全独立的
#深拷贝
import copy
a = {1:[1,2,3]}
b = copy.deepcopy(a) #int、str、list、dict
a[1].append(4)
print(a,b,a == b,a is b) #深拷贝,修改a,a、b值不相等,对象不相等
import copy
a = [1, 2, 3, 4, ['a', 'b']] # 原始对象
b = a # 赋值,传对象的引用
c = copy.copy(a) # 对象拷贝,浅拷贝--可同步对象的值,不能同步对象
d = copy.deepcopy(a) # 对象拷贝,深拷贝
a.append(5) # 修改对象a
a[4].append('c') # 修改对象a中的['a', 'b']数组对象
print('a = ', a) #a = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print('b = ', b) #b = [1, 2, 3, 4, ['a', 'b', 'c'], 5]
print('c = ', c) #c = [1, 2, 3, 4, ['a', 'b', 'c']]
print('d = ', d) #d = [1, 2, 3, 4, ['a', 'b']]