3.26 python数据类型、copy、编码、and&or&no 学习笔记

1 列表的增删改查及其他

1)增

​ list.append(‘x’)

​ list.insert(索引, 值)

​ list.extend(‘abcd’) 将值这个需要增加的可迭代对象迭代着增加到list中

2)删

​ list.pop(索引) # 若无索引默认删掉最后一个,返回所删除的元素值

​ list.remove(元素) # 若有重名元素先删除第一个

​ clear(list) # 清空列表

​ del list[::步长] del list[::步长]

3)改

list[索引] = 值

4)查

​ for循环遍历

5)列表索引超范围

list = [1, 2, 3, 4, 5, 6]
print(list[10:])

此时打印出的值为 []

6)列表方法

​ list.count(val) # 返回列表中某个值出现的次数

​ list.index(val) # 返回第一个与val相等的元素在列表中的索引

​ list.sort() # 默认从小到大排序,参数reverse=True逆序

​ list.reverse() # 反转列表

​ ‘字符’.join(list) # 将str用’ '连接符(字符)连接起来

7) 列表运算

​ 列表可以进行相加和相乘运算

8)列表注

​ 循环列表时,尽量不要改变列表大小,可能会导致索引混乱,影响最终结果

​ **解决方法:**倒序循环

2 字符串的常用操作方法

常用方法:

​ str.upper() # 字符串改为大写, 产生新的字符串

​ str.lower() # 字符串改为小写

​ str.startswith(值) # 判断str是否以值开头

​ str.endswith(值) # 判断结尾

​ str.replace(‘旧元素’, ‘新元素’) # 替代,默认全部替换,替换部分再加参数,返回新字符串

​ str.strip() # 去除字符串首尾的空格、换行、Tab等空白符, 括号内加参数去除指定值

​ str.split() # 默认按照空格分隔,也可以指定分割参数

​ str.count(’ ‘) # 返回str内’ '元素的数量

​ str.format() # 格式化输出

​ str.isalnum() # 字符串是否只由字母或数字组成

​ str.isalpha() # 字符串是否只由字母组成

​ str.isdecimal() # 字符串是否只由十进制字符组成

其他方法:

​ str.capitalize() # 首字母大写,其他变小写

​ str.swapcase() # 大小写反转

​ str.title() # 每个单词的首字母大写

​ str.center(width, ’ ') # 将字符串扩充为width,并居中显示,‘ ’填充空白位置

​ str.find(’ ') # 通过元素找索引,找到第一个就返回,找不到返回-1

​ str.index(’ ') # 通过元素找索引,找到第一个就返回,找不到报错

3 数据类型的分类

4 字典的增删改查及其他

1)增

​ 直接增加 # 有则改之,无则增加

​ dic.setdefault(键,值) # 有这个键值对则键值均不变,没有就增加

重要方法:

dic.update(*) # 可以一次增加和修改多个键值对(或者一个字典),更新dict,有则覆盖,无则添加

dic.fromkeys(items, 值) # 以一个可迭代对象迭代生成键值对,值都是相同的,指向同一个数据,若值是可 变数据,若更改其中一个键值对的值,其他根据迭代所创键的值也会相应改变

2)删除

​ dic.pop(键,提示信息参数) # 按照键删除,返回键的值。键不存在返回提示信息参数

​ dic.clear() # 清空字典

​ del dic[键] # 按键删除

3)改

​ 直接改

4)查

​ dic[键]

​ dic.get(键,返回信息) # 查找不存在可以返回返回值参数

5)特殊

​ dic.keys()

​ dic.values()

​ dic.items() # 将每个键值对更换为元组放在列表中形成可迭代对象

6)字典的创建方式

​ 方式一:dic = dict(((键1,值1), (键2,值2), (键3,值3)))

​ 方式二:dic = dict(键1=值1, 键2=值2, 键3=值3)

​ 方式三:dic = dict({键1:值1, 键2:值2, 键3:值3})

7)字典注

​ 循环字典时,不要改变字典大小,会直接报错

​ **解决方法:**将字典的keys强制转换成列表(可变对象)当做索引对字典进行相关操作

​ list(dict.keys()) 可迭代可变对象

5 id is ==

​ id(变量) # 获取变量的内存地址

​ 变量1 is 变量2 # 判断1和2的变量地址是否相同

​ == # 判断两边的数值是否相等

6 代码块及其缓存机制

1)代码块

​ 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块。

​ 交互方式输入的每个命令都是一个代码块。

2)代码块缓存机制

前提条件:在同一个代码块内。

机制内容:Python在执行同一个代码块的初始化对象的命令时,会检查是否其值是否已经存在,如果存在, 会将其重用。换句话说:执行同一个代码块时,遇到初始化对象的命令时,他会将初始化的这个变量与值存 储在一个字典中,在遇到新的变量时,会先在字典中查询记录,如果有同样的记录那么它会重复使用这个字 典中的之前的这个值。所以在你给出的例子中,文件执行时(同一个代码块)会把i1、i2两个变量指向同一个 对象,满足缓存机制则他们在内存中只存在一个,即:id相同。

适用对象: int(float),str,bool。

​ **具体细则:**所有的数字、bool、几乎所有的字符串

​ **优点:**提升性能,节省内存

3)小数据池

​ **前提条件:**在不同一个代码块内。

机制内容:

小数据池就是不同代码块间的缓存机制

​ Python自动将**-5~256的整数进行了缓存**,当你将这些整数赋值给变量时,并不会重新创建对象,而是使 用已经创建好的缓存对象。

​ python会将一定规则的字符串在字符串驻留池中,创建一份,当你将这些字符串赋值给变量时,并不会 重新创建对象, 而是使用在字符串驻留池中创建好的对象。

其实,无论是缓存还是字符串驻留池,都是python做的一个优化,就是将~5-256的整数,和一定规则的 字符串,放在一个‘池’(容器,或者字典)中,无论程序中那些变量指向这些范围内的整数或者字符串,那么 他直接在这个‘池’中引用,言外之意,就是内存中之创建一个。

适用对象int(float),str,bool

具体细则:-5~256数字、bool、满足规则的字符串

​ **优点:**提升性能、节省内存

7 深浅copy

1)浅copy

浅copy实例

2)深copy

深copy实例
深浅copy详解

8 集合set

​ 1,集合的创建。

set1 = set({1,2,'barry'})
set2 = {1,2,'barry'}

​ 2、集合增

set1 = {'alex','wusir','ritian','egon','barry'}
set1.add('景女神')
#update:迭代着增加
set1.update('A')
set1.update('老师')
set1.update([1,2,3])

​ 3、集合删

set1 = {'alex','wusir','ritian','egon','barry'}

set1.remove('alex')  # 删除一个元素

set1.pop()  # 随机删除一个元素

set1.clear()  # 清空集合

del set1  # 删除集合

​ 4、集合其他操作

​ 交、并、差、反交、子、超集

# 交
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
print(set1 & set2)  # {4, 5}
print(set1.intersection(set2))  # {4, 5}

# 并
print(set1 | set2)  # {1, 2, 3, 4, 5, 6, 7,8}
print(set2.union(set1))  # {1, 2, 3, 4, 5, 6, 7,8}

# 差
print(set1 - set2)  # {1, 2, 3}
print(set1.difference(set2))  # {1, 2, 3}

# 反交
print(set1 ^ set2)  # {1, 2, 3, 6, 7, 8}
print(set1.symmetric_difference(set2))  # {1, 2, 3, 6, 7, 8}

# 子
set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
print(set1 < set2)
print(set1.issubset(set2))  # 这两个相同,都是说明set1是set2子集。

# 超
print(set2 > set1)
print(set2.issuperset(set1))  # 这两个相同,都是说明set2是set1超集。

​ 5、frozenset不可变集合,让集合变成不可变类型。

s = frozenset('barry')
print(s,type(s))  # frozenset({'a', 'y', 'b', 'r'}) <class 'frozenset'>

9 元组注

​ 元组中如果只有一个元素,并且没有逗号,那么他不是元组,与其中唯一元素的数据类型相同

方法

  • tuple.count(’ ')
  • tuple.index(’ ')

10 编码

1)初识编码

​ 计算机存储文件,存储数据,以及将一些数据信息通过网络发送出去,存储发送数据什么内容?底层都是 01010101

​ 最早起的密码本:

​ ASCII码:只包含:英文字母,数字,特殊字符。

​ 0000 0001 : a

​ 0000 0101 : ;

​ 8bit == 1byte

​ ‘hello123’: 8byte

​ gbk: 英文字母,数字,特殊字符和中文。国标

​ 一个英文字母: 0000 0001 : a

​ 一个中文 中: 0000 0001 0100 0001 : 中

​ Unicode: 万国码:把世界上所有的文字都记录到这个密码本。

​ 起初一个字符用2个字节表示:

​ 0000 0001 0000 0011: a

​ 0000 0001 0100 0001 : 中

​ 后来为了涵盖全部文字:

​ 0000 0001 0000 0011 0000 0001 0000 0011: a

​ 0000 0001 0100 0001 0000 0001 0000 0011 : 中

​ 浪费空间,浪费资源。

​ Utf-8:升级:最少用8bit1个字节表示一个字符。

​ 0000 0011: a 1字节

​ 0000 0011 0000 0011 欧洲 2个字节

​ 0000 0011 0000 0011 0000 0011 中: 3个字节。

重点:

​ ‘中国12he’ : GBK: 8个字节

​ ‘中国12he’ : UTF-8: 10个字节

8bit = 1byte
1024byte = 1KB
1024KB = 1MB
1024MB = 1GB
1024GB = 1TB
1024TB = 1PB
1024TB = 1EB
1024EB = 1ZB
1024ZB = 1YB
1024YB = 1NB
1024NB = 1DB    

2)编码进阶

  • ASCII码:包含英文字母,数字,特殊字符与01010101对应关系。

a 01000001 一个字符一个字节表示。

  • GBK:只包含本国文字(以及英文字母,数字,特殊字符)与0101010对应关系。

a 01000001 ascii码中的字符:一个字符一个字节表示。

中 01001001 01000010 中文:一个字符两个字节表示。

  • Unicode包含全世界所有的文字与二进制0101001的对应关系。

a 01000001 01000010 01000011 00000001

b 01000001 01000010 01100011 00000001

中 01001001 01000010 01100011 00000001

  • UTF-8:包含全世界所有的文字与二进制0101001的对应关系(最少用8位一个字节表示一个字符)。

a 01000001 ascii码中的字符:一个字符一个字节表示。

To 01000001 01000010 (欧洲文字:葡萄牙,西班牙等)一个字符两个字节表示。

中 01001001 01000010 01100011 亚洲文字;一个字符三个字节表示。

  1. 不同的密码本之间能否互相识别?不能。

  2. 数据在内存中全部是以Unicode编码的,但是当你的数据用于网络传输或者存储到硬盘中,必须是以非Unicode编码(utf-8,gbk等等)。

英文:

​ str: 'hello ’

​ 内存中的编码方式: Unicode

​ 表现形式: ‘hello’

​ bytes :

​ 内存中的编码方式: 非Unicode

​ 表现形式:b’hello’

中文:

​ str:

​ 内存中的编码方式: Unicode

​ 表现形式:‘中国’

​ bytes :

​ 内存中的编码方式: 非Unicode # Utf-8

​ 表现形式:b’\xe4\xb8\xad\xe5\x9b\xbd’

# str ---> bytes\
s1 = '中国'
b1 = s1.encode('utf-8')  # 编码
print(b1,type(b1))  # b'\xe4\xb8\xad\xe5\x9b\xbd'
b1 = s1.encode('gbk')  # 编码  # b'\xd6\xd0\xb9\xfa' <class 'bytes'>
# bytes---->str
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
s2 = b1.decode('utf-8')  # 解码
print(s2)
# gbk ---> utf-8
b1 = b'\xd6\xd0\xb9\xfa'
s = b1.decode('gbk')
# print(s)
b2 = s.encode('utf-8')
print(b2)  # b'\xe4\xb8\xad\xe5\x9b\xbd'

编码参考

11 and or not 运算符

​ 在没有()的情况下,优先级:not > and > or,同一优先级从左至右依次计算

  • 情况1:两边都是比较运算
print(2 > 1 and 3 < 4 or 4 > 5 and 2 < 1)
print(True or False)
  • 情况2:两边都是整数
'''
x or y , x为真,值就是x,x为假,值是y
'''

12 bytes

1)str与bytes类型的区别和联系

类名str类型bytes类型标注
名称str,字符串,文本文字bytes,字节文字不同,可以通过文本文字或者字节文字加以区分
组成单位字符字节不同
组成形式‘’ 或者 “” 或者 ‘’’ ‘’’ 或者 “”" “”"b’’ 或者 b"" 或者 b’’’ ‘’’ 或者 b""" “”"不同,bytes类型就是在引号前面+b(B)大小写都可以
表现形式英文: ‘alex’ 中文: ‘中国’英文:b’alex’ 中文:b’\xe4\xb8\xad\xe5\x9b\xbd’字节文字对于ascii中的元素是可以直接显示的,但是非ascii码中的元素是以十六进制的形式表示的,不易看出。
编码方式Unicode可指定编码(除Unicode之外)比如UTF-8,GBK 等不同
相应功能upper lower spllit 等等upper lower spllit 等等几乎相同
转译可在最前面加r进行转译可在最前面加r进行转译相同
重要用途python基础数据类型,用于存储少量的常用的数据负责以二进制字节序列的形式记录所需记录的对象,至于该对象到底表示什么(比如到底是什么字符)则由相应的编码格式解码所决定。Python3中,bytes通常用于网络数据传输、二进制图片和文件的保存等等bytes就是用于数据存储和网络传输数据

4)str和bytes的相互转换

  • str–>bytes
    • bytes(‘字符串’,encoding=‘utf-8’)
    • (‘字符串’).encode(‘utf-8’)
  • bytes–>str
    • str(‘字节’, encoding=‘utf-8’)
    • b’字节’.decode(encoding=‘utf-8’)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值