文章目录
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 数据类型的分类
-
可变(不可哈希)的数据类型:list dict set
-
不可变(可哈希)的数据类型:str bool int tuple
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
2)深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 亚洲文字;一个字符三个字节表示。
-
不同的密码本之间能否互相识别?不能。
-
数据在内存中全部是以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’)