Python学习的第n天:字符串的深入
字符串
字符串的操作
1. 对于字符串,我们可以对其做位置变换
# 定义字符串
a = 'hello, world'
# 居中
print(a.center(80, '='))
# 右对齐
print(a.rjust(80, '='))
# 左对齐
print(a.ljust(80, '='))
b = '123'
# 零填充(在左边补0)
print(b.zfill(6))
c = 1234
d = 3456
print('%d + %d = %d' % (c, d, c + d))
# Python 3.6引入的格式化字符串的便捷语法
print(f'{c} * {d} = {c * d:,}')
# 和上面的写法等价的语法
print('{} * {} = {:.2e}'.format(c, d, c * d))
print('{2} / {1} = {0:.2%}'.format(c / d, d, c))
- 对字符串前后多余的空格进行删减,替换字符串中的字符
email = ' 2277078243@qq.com '
content = ' 无敌风火轮 '
# 修剪字符串左右两端的空格
print(email.strip())
print(content.strip())
# 修剪字符串左端的空格
print(email.lstrip())
# 修剪字符串右端的空格
print(email.rstrip())
# 将指定的字符串替换为新的内容
print(content.strip().replace('无敌', '*').replace('轮', '*'))
"""
example07 - 字符串的拆分和合并
split ---> 把字符串进行拆分,变成一个列表
join ---> 把列表元素进行合并,变成一个字符串
Author: 悾格
Date: 2021/7/29
"""
content = 'You go your way, I will go mine.'
content2 = content.replace(',', '').replace('.', '')
# 用空格拆分字符串得到一个列表
words = content2.split()
print(words, len(words))
for word in words:
print(word)
# 用空格拆分字符串,最多允许拆分3次
words = content2.split(' ', maxsplit=3)
print(words, len(words))
# 从右向左进行字符串拆分,做多允许拆分3次
words = content2.rsplit(' ', maxsplit=3)
print(words, len(words))
# 用逗号拆分字符串
items = content.split(',')
for item in items:
print(item)
contents = [
'请不要相信我的美丽',
'更不要相信我的爱情',
'因为在涂满油彩的面孔下',
'有着一颗戏子的心'
]
# 将列表中的元素用指定的字符串连接起来
print(' '.join(contents))
"""
example08 - 字符串的操作
str(字符串) ----> encode() ----> bytes(字节串)
bytes(字节串)----> decode() ----> str(字符串)
要点:
1. 选择字符集(编码)的时候,最佳的选择(也是默认的)是UTF-8编码。
2. 编码和解码的字符集要保持一致,否则就会出现乱码现象。
3. 不能用ISO-8859-1编码保存中文,否则会出现编码黑洞,中文变成?。
4. UTF-8是Unicode的一种实现方案,也一种变长的编码,
最少1个字节(英文和数字),最多4个字节(Emoji),表示中文用3个字节。
Author: 悾格
Date: 2021/7/29
"""
# a = '我爱你中国'
# # GBK <--- GB2312 <---- ASCII
# b = a.encode('gbk')
# print(type(b))
# print(b, len(b))
# c = b'\xce\xd2\xb0\xae\xc4\xe3\xd6\xd0\xb9\xfa\xb0\xa1'
# print(c.decode('gbk'))
a = '我爱你中国亲爱的母亲'
# GBK <--- GB2312 <---- ASCII
# UTF-8编码是Unicode(万国码)的一种实现方案
b = a.encode('utf-8')
print(type(b))
print(b, len(b))
c = b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0\xe4\xb8\xad\xe5\x9b\xbd\xe4\xba\xb2\xe7\x88\xb1\xe7\x9a\x84\xe6\xaf\x8d\xe4\xba\xb2'
# 如果编码和解码的方式不一致,Python中可能会产生UnicodeDecodeError异常
# 也有可能会出现乱码现象
# 鎴戠埍浣犱腑鍥戒翰鐖辩殑姣嶄翰
print(c.decode('gbk'))
print(c.decode('utf-8'))
# a = '我爱你中国亲爱的母亲'
# # UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-9
# # latin-1编码不能够用来处理中文字符(因为会产生编码黑洞,中文全部变成?,想解码都没有机会)
# # b = a.encode('iso-8859-1')
# # print(b, len(b))
# # UTF-8是一种变长编码
# # 表示数字和英文字母的时候,只需要1个字节
# # 表示中文的时候,需要3个字节
# # 表示Emoji字符的时候,需要4个字节
# # 有些字符是占用2个字节
# a = '🧣🌂好'
# b = a.encode()
# print(b, len(b))
# print(b.decode())
"""
example09 - 字符串的操作
凯撒密码 - 通过对应字符的替换,实现对明文进行加密的一种方式。
abcdefghijklmnopqrstuvwxyz
defghijklmnopqrstuvwxyzabc
明文:attack at dawn.
密文:dwwdfn dw gdzq.
对称加密:加密和解密使用了相同的密钥 ---> AES。
非对称加密:加密和解密使用不同的密钥(公钥、私钥)---> RSA ---> 适合互联网应用。
Author: 悾格
Date: 2021/7/29
"""
message = 'attack at dawn.'
# 生成字符串转换的对照表
table = str.maketrans(
'abcdefghijklmnopqrstuvwxyz',
'defghijklmnopqrstuvwxyzabc'
)
# 通过字符串的translate方法实现字符串转译
print(message.translate(table))
集合
定义
把一定范围的、确定的、可以区别的事物当作一个整体来看待
集合应该满足以下特性:
- 无序性:一个集合中,每个元素的地位都是相同的,元素之间是无序的。
- 互异性:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次。
- 确定性:给定一个集合,任给一个元素,该元素或者属于或者不属于该集合,二者必居其一,不允许有模棱两可的情况出现。
set1 = {1, 1, 2, 3, 1, 1, 2}
# 互异性(没有重复元素)
print(type(set1), len(set1))
print(set1)
# 遍历集合中的元素
for elem in set1:
print(elem)
# 无序性
# TypeError: 'set' object is not subscriptable
# print(set1[0])
set2 = set()
print(type(set2))
print(set2)
集合的运算
"""
example02 - 集合的运算
Author: 悾格
Date: 2021/7/29
"""
set1 = {1, 2, 3, 4, 5}
set2 = {2, 4, 6, 8}
# 成员运算 - 确定性(元素要么在集合中,要么不在集合中)
# 集合的成员运算在效率上是远远高于列表的成员运算
print(1 in set1) # True
print(1 not in set1) # False
# 交集
print(set1 & set2) # {2, 4}
print(set1.intersection(set2)) # {2, 4}
# 并集
print(set1 | set2) # {1, 2, 3, 4, 5, 6, 8}
print(set1.union(set2)) # {1, 2, 3, 4, 5, 6, 8}
# 差集
print(set1 - set2) # {1, 3, 5}
print(set1.difference(set2)) # {1, 3, 5}
print(set2 - set1) # {8, 6}
print(set2.difference(set1)) # {8, 6}
# 对称差
print(set1 ^ set2) # {1, 3, 5, 6, 8}
print((set1 | set2) - (set1 & set2))# {1, 3, 5, 6, 8}
print(set1.symmetric_difference(set2))# {1, 3, 5, 6, 8}
set3 = {1, 2, 3, 4, 5, 6, 7, 8, 9}
# 判断真子集
print(set1 < set3) # True
print(set1.issubset(set3)) # True
# 判断子集
print(set1 <= set3) # True
# 判断超集
print(set3 > set2) # True
print(set3.issuperset(set2)) # True
集合的操作(方法)
"""
example03 - 集合的操作(方法)
集合底层使用的是哈希存储,通过计算元素的哈希码来决定元素存储的位置,这是一种高效率的存储方案。
哈希存储的关键是设计一个好的哈希函数,尽量保证不同的对象能够计算出不同的哈希码。
可变容器(列表、集合、字典)都无法计算哈希码,因此都不能放到集合中,作为集合的元素。
Author: 悾格
Date: 2021/7/29
"""
set1 = {'apple', 'banana', 'pitaya', 'apple'}
# 添加元素
set1.add('grape')
set1.add('durian')
print(set1)
# 删除元素
set1.discard('pitaya')
print(set1.pop())
print(set1.pop())
print(set1)
# 清空元素
set1.clear()
print(set1)
nums = [1, 1, 10, 10, 10, 5, 3, 9, 9]
set2 = set(nums)
print(set2)
list3 = list(set2)
print(list3)
tuple4 = tuple(list3)
print(tuple4)
set5 = set('hello')
print(set5)
# set2 = {True, False, True, True, False}
# print(set1)
# print(set2)
# set3 = {(1, 2, 3), (4, 5, 6)}
# print(set3)
# list4 = [set1, set2]
# print(list4)
总结
- 学习了字符串的定义与操作,粗略的了解字符串的函数用法
- 今天头有点痛,课上没怎么认真听,周末要将它补回来