Loading

基础数据类型补充与编码进阶

一、tuple 补充方法

元组中如果只有一个元素并且没有逗号,那么它不是元组,它与改元素的数据类型一致。

tup = ([1, 2, 3])
print(type(tup))
tup = ('str')
print(type(tup))
tup = ('str',)    # 加了逗号
print(type(tup))
#输出
<class 'list'>
<class 'str'>
<class 'tuple'>		# 类型就变为元组

count():计数,获取某元素在列表中出现的次数

index():通过元素找索引

二、list补充方法

列表可以相加

l1 = [1, 2, 3]
l2 = ['a', 'b', 'c']
print(l1 + l2)
#输出
[1, 2, 3, 'a', 'b', 'c']

列表可以与数字相乘

l1 = [1, 'abc', 3]
print(l1*3)
# 输出
[1, 'abc', 3, 1, 'abc', 3, 1, 'abc', 3]

相关题:

l1 = [11, 22, 33, 44, 55]

索引为奇数对应的元素删除。[11, 33, 55]

正常思路:
先将所有的索引整出来。
加以判断,index % 2 != 0 :pop(index)

for index in range(len(l1)):
    if index % 2 != 0:
        l1.pop(index)
        print(index)
print(l1)
# 输出:
[11, 33, 44]    # 因为列表删除一个后面的会把前面的补齐,所以索引就变了。

最简单的

del l1[1::2]	# 以切片步长来删除
print(l1)
# 输出:
[11, 33, 55]

倒叙法删除

for index in range(len(l1)-1, -1, -1):   # 从后面删除就不会影响不到前面的索引
    if index % 2 != 0:
        l1.pop(index)
print(l1)
# 输出
[11, 33, 55]

思维置换: 取出所有的偶数位的值

new_l1 = []
for index in range(len(l1)):
    if index % 2 == 0:
        new_l1.append(l1[index])
l1 = new_l1
print(l1)
# 输出
[11, 33, 55]

循环一个列表时,最好不要改变列表的大小,这样会影响你最终的结果。

三、dict补充方法

update() 增加键值对,同时增加几个,有则增加无则修改,元组拆包

同时增加几个键值对。

dic = {'name': '小杨', 'age': 18}
dic.update(hobby='运动',hight='170')
print(dic)
# 输出
{'name': '小杨', 'age': 18, 'hobby': '运动', 'hight': '170'}

有则增加,无则修改****(更新)

dic = {'name': '小杨', 'age': 18}
dic.update(name='小红', hight='170')
print(dic)
# 输出
{'name': '小红', 'age': 18, 'hight': '170'}


dic = {'name': '小杨', 'age': 18}
dic2 = {'name': '小明', 'sex': '男'}
dic.update(dic2)
print(dic)
# 输出
{'name': '小明', 'age': 18, 'sex': '男'}

元组拆包

dic = {'name': '小杨', 'age': 18}
tup = [(1, 'a'), (2, 'b'), (3, 'c')]
dic.update(tup)
print(dic)
# 输出
{'name': '小杨', 'age': 18, 1: 'a', 2: 'b', 3: 'c'}

fromkeys:字典的键来自一个可迭代对象,值共用一个

dic = dict.fromkeys('abcd', 100)
print(dic)
# 输出
{'a': 100, 'b': 100, 'c': 100, 'd': 100}

坑!值共用一个。

dic = dict.fromkeys(['a', 'b', 'c', 'd'], [])
print(dic)
dic['a'].append(666)   # 给键 a 的值添加 666 其他的也会跟着添加
print(dic)
# 输出
{'a': [], 'b': [], 'c': [], 'd': []}
{'a': [666], 'b': [666], 'c': [666], 'd': [666]}

相关题:

dic = {'k1': '小杨', 'k2': 'barry', 'k3': '拜拜', 'age': 18}

将字典中key含有k元素的键值对删除

注意:循环一个字典时,如果改变这个这个字典的大小就会报错。

for key in dic:
    if 'k' in key:
        dic.pop(key)
print(dic)
# 输出报错
RuntimeError: dictionary changed size during iteration

但是可以把key中含有k元素的键单独拿出来在循环删除

dic = {'k1': '小杨', 'k2': 'barry', 'k3': '拜拜', 'age': 18}
# 将字典中key含有k元素的键值对删除
key = []
for i in dic.keys():
    if 'k' in i:
        key.append(i)
for n in key:
    dic.pop(n)
print(dic)
# 输出
{'age': 18}

或者:

for key in list(dic.keys()): #不加list是动态在字典中获取,还是和字典有交互会报错,加list强转列表
    if 'k' in key:
        dic.pop(key)
print(dic)
# 输出
{'age': 18}

四、编码的进阶

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'

bytes类型可以直接在网络上传输或者储存到硬盘中

# str ---> bytes  (Unicode---->非Unicode)
s1 = '中国'
b1 = s1.encode('utf-8')   # 编码成utf-8的中国-->’\xe4\xb8\xad\xe5\x9b\xbd‘,也可以是其他编码
print(b1, type(b1))
# 输出:
b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'> 

# bytes ---> str
b1 = b'\xe4\xb8\xad\xe5\x9b\xbd'
s2 = b1.decode('utf-8')	  # 解码,用什么进行编码的就用什么进行解码
print(s2)
# 输出:
中国

str(Unicode编码) 数据类型和 bytes(非Unicode编码) 数据类型的相互转换

str--->bytes

s1 = '中国'
# 将Unicode编码的‘中国’转换成utf-8编码
b1 = s1.encode('utf-8')   # encode编码,编码后类型为bytes
print(b1)
# 输出
b'\xe4\xb8\xad\xe5\x9b\xbd' <class 'bytes'>

bytes--->str

s1 = '中国'
# 将Unicode编码的‘中国’转换成utf-8编码
b1 = s1.encode('utf-8')   # encode编码,编码后类型为bytes
s2 = b1.decode('utf-8')   # decode解码,解码后类型为str
print(s2, type(s2))

bytes(gbk编码)和 bytes(utf-8编码的转换)

将gbk编码转换成utf-8编码流程
gbk--->Unicode--->utf-8
反之亦然
gbk = b'\xd6\xd0\xb9\xfa'     # gbk编码的中国,类型为bytes
str1 = gbk.decode('gbk')      # 先解码转换成Unicode,类型为str
utf_8 = str1.encode('utf-8')  # 在编码成utf-8,类型为bytes
print(utf_8)
# 输出
b'\xe4\xb8\xad\xe5\x9b\xbd'
posted @ 2021-04-11 10:25  Mr-Yang`  阅读(139)  评论(0编辑  收藏  举报