首页 > 技术文章 > python全栈-Day 7

txbbkk 2018-07-14 20:19 原文

一、基础数据类型汇总补充

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']]

 

推荐阅读