day 07

元组内置方法

作用

只可取,不可更改的列表。当创建的时候就被写死了。

定义方式

()内用逗号隔开多个元素(可以为任意数据类型)

lt = list([1,2,3])
tup = tuple((1,2,3))
print(tup,type(tup))

如果元组只有一个元素,必须得加逗号

tup1 = (1,)
print(tup1,type(tup1))

使用方法

索引取值

print(tup[0])

索引切片

print(tup[0:3])

for循环

for i in tup:
    print(i)

成员运算

print(0 in tup)

len长度

print(len(tup))

index获取元素索引

print(tup.index(1))

count 计数

print(tup.count(2))

有序or无序

有序

可变or不可变

压根不存在

字典数据类型

作用

存储多个数据,对每个数据具有描述

定义方式

{}内用逗号隔开多个键key(具有描述意义,不能为可变数据类型)值value(任意数据类型)对 # 散列表(哈希表)

dic = {'name':1}
print(dic)

# 0001
dic = {0:'功能1','功能2'}
print(dic)

dic = {[1,2]:'a'}  # 可变==不可哈希 不可变==可哈希
print(dic)

dic = {(1,2):'a'}
print(dic)

使用方法

优先掌握

# 1.按key取值/按key修改值
dic = {'a':1,'b':2,'c':3}

print(dic['a'])

# 2.添加值,没有就添加,有就修改
dic['d'] = 4
print(dic)

# 3.for循环
for i in dic:
    print(i)

# 4.成员运算
print('a' in dic)

# 5.len长度
print(len(dic))

# 6.keys/values/items
print(dic.key())  # 看成列表
print(dic.value())  # 获取所有值

print(dic.item())
for i in dic.items():
    print(i)
for sksskkk,asasa in dic.items():  # 解压缩
   print(sksskkk,asasa)

需要掌握

# get:获取
s = 'e'
# print(dic[s])  # KeyError: Nonetype --> s是None,并不是你想象的e
print(dic.get('b', 1))  # 字典中没有返回None,可以给定一个默认值

# update : 更新,等同于list里的extend
dic1 = {'a': 1, 'c': 2}
dic2 = {'b': 1, 'd': 2}
dic1.update(dic2)
print(dic1)

# fromkeys
print(dict.fromkeys(dict.fromkeys([1, 2, 3, 4])))  # 默认给None

# setdefault  # 字典有这个key,就不修改,没有则增加
dic.setdefault('j', 2)
dic.setdefault('a', 2)
print(dic)

# 4. 有序or无序:无序

# 5. 可变or不可变:可变
dic = {'a': 1}
print(id(dic))
dic['b'] = 2
print(id(dic))

散列表(哈希表)

散列表/哈希表存储数据 --》相比较列表,插入/删除更快

# 1. 首先对key做了哈希处理(能对所有数据类型都可以哈希处理):梅森旋转算法(生成伪随机数)--> 通过哈希处理对于每个key他都可以生成一个序列(永不重复,相同的东西进入哈希处理,结果相同)


'''
import hashlib

m = hashlib.md5()
# m.update(b'a')  # 0cc175b9c0f1b6a831c399e269772661
# m.update(b'b')  # 92eb5ffee6ae2fec3ad71c777531578f
# m.update(b'c')  # 4a8a08f09d37b73795649038408b5f33
# m.update(b'd')  # 8277e0910d750195b448797616e091ad
m.update(b'a')  # 0cc175b9c0f1b6a831c399e269772661
print(m.hexdigest())
'''

# 2. 使用哈希函数对刚刚生成的序列(纯数字),对纯数字除9取余(0,1,2,3,4,5,6,7,8)

集合类型内置方法(set)

集合可以理解成一个集合体

作用

用于关系运算的集合体,由于集合内的元素无序且集合元素不可重复,因此集合可以去重,但是去重后的集合回打乱原来元素的顺序。

定义方式

{}内用逗号隔开多个元素,每个元素必须是不可变类型。

s = {1, 2, 1, 'a'}  # s = set({1,2,'a'})
print(f"s: {s}")

s: {1,2,'a'}
    
    
s = {1, 2, 1, 'a', 'c'}
for i in s:
    print(i)   
    
1
2
c
a

s = set('hello')
print(f"s: {s}")

s: {'e','c','h','l'}

使用方法

优先掌握

长度len
s = {1,2,'a'}
print(f'len(s):{len(s)}')

len(s):3
成员运算in和not in
s = {1,2,'a'}
print(f'l in s: {i in s}')

l in s: True
|并集、union
pythoners = {'jason', 'nick', 'tank', 'sean'}
linuxers = {'nick', 'egon', 'kevin'}

print(f"pythoners|linuxers: {pythoners|linuxers}")
print(f"pythoners.union(linuxers): {pythoners.union(linuxers)}")

pythoners|linuxers: {'egon', 'tank', 'kevin', 'jason', 'nick', 'sean'}
pythoners.union(linuxers): {'egon', 'tank', 'kevin', 'jason', 'nick', 'sean'}
&交集、intersection
pythoners = {'jason', 'nick', 'tank', 'sean'}
linuxers = {'nick', 'egon', 'kevin'}

print(f"pythoners&linuxers: {pythoners&linuxers}")
print(f"pythoners.intersection(linuxers): {pythoners.intersection(linuxers)}")

pythoners&linuxers: {'nick'}
pythoners.intersection(linuxers): {'nick'}
-差集、difference
pythoners = {'jason', 'nick', 'tank', 'sean'}
linuxers = {'nick', 'egon', 'kevin'}

print(f"pythoners-linuxers: {pythoners-linuxers}")
print(f"pythoners.difference(linuxers): {pythoners.difference(linuxers)}")

pythoners-linuxers: {'tank', 'jason', 'sean'}
pythoners.difference(linuxers): {'tank', 'jason', 'sean'}
^对称差集、symmetric_difference
pythoners = {'jason', 'nick', 'tank', 'sean'}
linuxers = {'nick', 'egon', 'kevin'}

print(f"pythoners^linuxers: {pythoners^linuxers}")
print(
    f"pythoners.symmetric_difference(linuxers): {pythoners.symmetric_difference(linuxers)}")

pythoners^linuxers: {'egon', 'tank', 'kevin', 'jason', 'sean'}
pythoners.symmetric_difference(linuxers): {'egon', 'tank', 'kevin', 'jason', 'sean'}
==
pythoners = {'jason', 'nick', 'tank', 'sean'}
linuxers = {'nick', 'egon', 'kevin'}
javers = {'nick', 'egon', 'kevin'}

print(f"pythoners==linuxers: {pythoners==linuxers}")
print(f"javers==linuxers: {javers==linuxers}")

pythoners==linuxers: False
javers==linuxers: True
父集:>、>= 、issuperset
pythoners = {'jason', 'nick', 'tank', 'sean'}
linuxers = {'nick', 'egon', 'kevin'}
javaers = {'jason', 'nick'}

print(f"pythoners>linuxers: {pythoners>linuxers}")
print(f"pythoners>=linuxers: {pythoners>=linuxers}")
print(f"pythoners>=javaers: {pythoners>=javaers}")
print(f"pythoners.issuperset(javaers): {pythoners.issuperset(javaers)}")


pythoners>linuxers: False
pythoners>=linuxers: False
pythoners>=javaers: True
pythoners.issuperset(javaers): True
子集:<、<=、issubset
pythoners = {'jason', 'nick', 'tank', 'sean'}
linuxers = {'nick', 'egon', 'kevin'}
javaers = {'jason', 'nick'}

print(f"pythoners<linuxers: {pythoners<linuxers}")
print(f"pythoners<=linuxers: {pythoners<=linuxers}")
print(f"javaers.issubset(javaers): {javaers.issubset(javaers)}")


pythoners<linuxers: False
pythoners<=linuxers: False
javaers.issubset(javaers): True

需要掌握

add
s = {1,2.,'a'}
s.add(3)

print(s)

{1,2,3,'a'}
remove
s = {1,2,'a'}
s.remove(1)

print(s)

{2,'a'}
difference_update
pythoners = {'jason', 'nick', 'tank', 'sean'}
linuxers = {'nick', 'egon', 'kevin'}
pythoners.difference_update(linuxers)

print(f"pythoners.difference_update(linuxers): {pythoners}")

pythoners.difference_update(linuxers): {'tank', 'jason', 'sean'}
discard
s = {1, 2, 'a'}
# s.remove(3)  # 报错
s.discard(3)

print(s)

{1, 2, 'a'}
isdisjoint
pythoners = {'jason', 'nick', 'tank', 'sean'}
linuxers = {'nick', 'egon', 'kevin'}
pythoners.isdisjoint(linuxers)

print(f"pythoners.isdisjoint(linuxers): {pythoners.isdisjoint(linuxers)}")

pythoners.isdisjoint(linuxers): False

数据类型总结

按存值个数区分

存值个数数据类型
单个值数字、字符串
多个值(容器)列表、元组、字典、集合

按可变不可变区分

可变or不可变数据类型
可变列表、字典、集合
不可变数字、字符串、元组

有序无序区分

有序or无序数据类型
有序(可按索引取值)字符串、列表、元组
无序字典、集合

按访问类型区分

直接访问数字
顺序访问(序列类型)字符串、列表、元组
key值访问(映射类型)字典

深浅拷贝

拷贝/浅拷贝/深拷贝都是针对可变类型数据而言的

可变or不可变

id不变值可变,即在原值的基础上修改,则为可变数据类型;值变id也变,即重新申请一个空间放入新值,则为不可变数据类型

age = 19
print(f'first:{id(age)}')
age = 20
print(f'second:{id(age)}')

拷贝(赋值)

如果l2是l1的拷贝对象,则l1内部的任何数据类型的元素变化,则l2内部的元素也会跟着改变,因为可变类型值变id不变。

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = l1

l1.append('g')
print(l1)

['a', 'b', 'c', ['d', 'e', 'f'], 'g']

print(l2)
['a', 'b', 'c', ['d', 'e', 'f'], 'g']

浅拷贝

如果l2是l1的浅拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,则l2会跟着改变。

import copy

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.copy(l1)

l1.append('g')
print(l1)

['a', 'b', 'c', ['d', 'e', 'f'], 'g']

print(l2)

['a', 'b', 'c', ['d', 'e', 'f']]

l1[3].append('g')
print(l1)

['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']

print(l2)

['a', 'b', 'c', ['d', 'e', 'f', 'g']]

深拷贝

如果l2是l1的深拷贝对象,则l1内的不可变元素发生了改变,l2不变;如果l1内的可变元素发生了改变,l2也不会变,即l2永远不会因为l1的变化而变化。

import copy

l1 = ['a', 'b', 'c', ['d', 'e', 'f']]
l2 = copy.deepcopy(l1)

l1.append('g')
print(l1)
['a', 'b', 'c', ['d', 'e', 'f'], 'g']

print(l2)
['a', 'b', 'c', ['d', 'e', 'f']]

l1[3].append('g')
print(l1)
['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g']

print(l2)
['a', 'b', 'c', ['d', 'e', 'f']]

内置方法中的copy方法都是浅拷贝的copy,也就是说如果你的列表里面有可变数据类型,那就不要使用.copy方法。

转载于:https://www.cnblogs.com/colacheng0930/p/11529210.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值