import math # 导入Python的数学模块
# 字符串的编码转换
# 基础知识:python中有两种常用的字符串类型,包括str(Unicode编码)和bytes(二进制数据),两者之间可以通过encode()和decode()方法进行转换
# 1 使用encode()编码 encode()方法以指定的编码格式编码字符串。errors参数可以指定不同的错误处理方案。
'''
encode()方法语法:str.encode(encoding='UTF-8',errors='strict')
参数 encoding -- 要使用的编码,如: UTF-8,可以省略encoding=。 errors -- 设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 其他可能得值有 'ignore(忽略非法字符)', 'replace(用?替换非法字符)', 'xmlcharrefreplace(使用XML的字符引用)', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。
返回值:该方法返回编码后的字符串,它是一个 bytes 对象。
'''
str1 = "小桥流水人家"
bytes1 = str1.encode("GBK", errors="strict")
bytes2 = str1.encode("UTF-8", errors="strict")
print("str1=", str1)
print("bytes1=", bytes1) # 二进制数据: b'\xd0\xa1\xc7\xc5\xc1\xf7\xcb\xae\xc8\xcb\xbc\xd2'
print("bytes1=", bytes2)
# 2 使用decode()方法解码 decode()方法使用注册编码的编解码器的字符串进行解码。
'''
decode()方法的语法:str.decode(encoding='UTF-8',errors='strict')
参数:encoding -- 这是所使用的编码。对于所有的编码方案的列表,请访问:标准编码库
errors -- 这可能是给定一个不同的错误处理机制。默认的错误是“严格”,即编码错误提出UnicodeError。其他可能的值是ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 并通过codecs.register_error().注册的任何其他名称。
返回值;此方法返回的字符串的解码版本
'''
# 解码采用的字符编码,需要和编码采用的字符编码一样
print("bytes1:GBK()解码后:", bytes1.decode("GBK"))
print("bytes2:UTF-8()解码后:", bytes2.decode("UTF-8"))
# 字符串的常用操作
# 1 字符串的拼接 使用”+“可以实现两(多)个字符串的拼接,产生有一个字符串对象
str2 = "醉里挑灯看剑"
str3 = " 梦回吹角连营"
str4 = str2 + str3
print("拼接后:", str4)
# 2 计算字符串的长度 使用len()函数 语法:len(string)
str5 = "人生苦短,我要用Python!"
print(str5, "str5的长度:", len(str5)) # 注意:使用len()函数计算字符串长度时,不区分英文、数字和汉字
print("字符串GBK编码后长度:" + str(len(str5.encode("GBK"))))
# 3 字符串的截取(切片) 语法: string[start :end : step]
# start 要截取的第一个字符串的索引,可以不指定,默认为0
# end 要截取的最后一个字符串的索引,可以不指定,默认为字符串长
# step 可以不指定,默认为1.步长省略时 ,最后一个冒号可以省略
str5 = "012345678"
print(str5[0:5]) # 截取第一位到第五位的字符
print(str5[:]) # 截取字符串的全部字符
print(str5[6:]) # 截取第七个字符到结尾
print(str5[:-5]) # 截取从头开始到倒数第五个字符之前
print(str5[2]) # 截取第三个字符
print(str5[-1]) # 截取倒数第一个字符
print(str5[::-1]) # 创造一个与原字符串顺序相反的字符串
print(str5[-3:-1]) # 截取倒数第三位与倒数第一位之前的字符
print(str5[-3:]) # 截取倒数第三位到结尾
print(str5[:-6:-3]) # 逆序截取,截取倒数第六位数与倒数第一位数之间,步长是3 此处默认start是-1
try: # 如果指定的索引不存在,可以采用try ... except 语句捕获异常
obj1 = str5[21]
print(obj1)
except IndexError:
print("指定的索引不存在")
# 4 分割字符串 使用split()方法
'''
语法格式:str.split(str="", num=string.count(str)).
str -- 用于指定分隔符,可以指定多个字符,默认为所有的空字符None,包括空格、换行(\n)、制表符(\t)等。
num -- 分割次数。可选参数,默认为 -1, 即分隔所有,分割没有次数
返回值: 分割后的字符串列表。
'''
str6 = "未 来 科 技 >>> Line1-abcdef \nLine2-abc \nLine4-abcd \nwww.nihao.com"
print(str6)
print(str6.split()) # 以空格为分隔符,包含 \n。无论有几个空格或者空白符,都作为一个分割符使用
print(str6.split(">>>")) # 以多个字符进行分割
print(str6.split(".")) # 以多个字符进行分割
print(str6.split(' ', 1)) # 以空格为分隔符,分隔成两个
print(str6.split(' ', 4)) # 以空格为分隔符,分隔前四个
print(str6.split('>')) # 以>为分隔符.当指定的分隔符出现多次时,就会每分割一次,没有得到内容的,将产生一个空元素
# 5 合并字符串 使用join()方法
'''
描述:Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串。
语法 join()方法语法: strnew=string.join(sequence)
参数: sequence -- 要连接的元素序列,即可以迭代的对象,该对象中的所有元素(字符串表示)将被合并为一个新的字符串。
string--字符串类型,用于指定合并时的分隔符,作为边界点分割出来。
返回值:返回通过指定字符连接序列中元素后生成的新字符串。
'''
# 实例
str7 = ("a", "b", "c") # 字符串序列
str8 = ["a", "b", "c", "d"]
print("-".join(str7))
str9 = "@" + (" @".join(str8))
print(type(str9))
print(str9)
# 6 检索字符串 count()方法 find()方法 index()方法 startwith()方法 endwith()方法 in关键字
'''
find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。
find()方法语法: str.find(str1, beg=0, end=len(string))
python中还提供了rfind()方法,作用与find()方法类似,只是从右边开始查找
参数
str -- 指定检索的字符串
beg -- 开始索引,默认为0。
end -- 结束索引,默认为字符串的长度。
返回值:如果包含子字符串返回开始的索引值,否则返回-1。
count() 方法用于统计字符串里某个字符出现的次数,不存在返回0。可选参数为在字符串搜索的开始与结束位置。
count()方法语法:str.count(str1, beg=0, end=len(string))
返回值:该方法返回子字符串在字符串中出现的次数
index() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,该方法与 python find()方法一样,只不过如果str不在 string中会报一个异常。
index()方法语法:str.index(str, beg=0, end=len(string))
返回值:如果包含子字符串返回开始的索引值,否则抛出异常。
startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。
str.startswith(str, beg=0,end=len(string));
返回值:如果检测到字符串则返回True,否则返回False。
endswith() 方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数"start"与"end"为检索字符串的开始与结束位置。
endswith()方法语法:str.endswith(suffix[, start[, end]])
参数 suffix -- 该参数可以是一个字符串或者是一个元素。
返回值:如果字符串含有指定的后缀返回True,否则返回False。
'''
# 实例
str10 = "未 来 科 技 >>> Line1-abcdef \ Line2-abc Line4-abcd 未来科技 www.nihao.com"
print(str10, len(str10))
print(str10.find(">")) # 从下标0开始,查找在字符串里第一个出现的子串,返回结果:9
for i in range(0, 5): # 下标循环从0 开始到 5
print(str10.find("未", i)) # 还可以根据find()返回值是否大于-1来判断子字符串是否在字符串中
print(str10.find("ha9", 0)) # 不包含子字符串返回开始的索引值,返回-1
print(str10.count("Line", 0, 68)) # 从下标0开始,查找“Line”在字符串里出现的次数,返回结果:3
print(str10.count("Line8", 10, 68)) # 不存在返回0
print(str10.index("Line2", 0))
# print(str10.index("Line5", 0)) # 不包含子字符串,抛出异常
print(str10.startswith("Line2", 19)) # 返回False
print(str10.startswith("wei", 19, 30)) # 返回False
print(str10.startswith("未", 0, 2)) # 返回True
print(str10.startswith("Line2", 29)) # 返回True
print(str10.endswith("Line2", 2)) # 返回False
print(str10.endswith("com")) # 返回True
print(str10.endswith(".com", 29, 68)) # 返回True
# 7 字符串的大小写转换
'''
lower() 方法转换字符串中所有大写字符为小写。语法:str.lower()
返回值 : 返回将字符串中所有大写字符转换为小写后生成的字符串。
upper() 方法将字符串中的小写字母转为大写字母。语法:str.upper()
返回值 : 返回小写字母转为大写字母的字符串。
'''
str11 = "小明:My Name Is XiaoMing!!"
str12 = str11.lower()
print(str11, "\n", str12)
str13 = str12.upper()
print(str13)
# 实例 不区分大小写验证会员名是否唯一
username_1 = '|MingRi|mr|mingrsoft|WGH|MRSoft|' # 假设已经注册的会员名称保存在一个字符串中,以|进行分隔
username_2 = username_1.lower() # 将会员名称字符串转换为全部小写
regname_1 = input('输入要注册的会员名称:')
regname_2 = '|' + regname_1.lower() + '|' # 将要注册的会员名称也转换为全部小写
if regname_2 in username_2: # 判断输入的会员名称是否存在
print('会员名', regname_1, '已经存在!')
else:
print('会员名', regname_1, '可以注册!')
# 8 去除字符串中的空格和特殊字符 strip()函数 lstrip()函数 rstrip()函数
'''
strip([chars]) 方法用于移除字符串头尾指定的字符或字符序列。注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符。
strip()方法语法:str.strip([chars]);
参数: chars -- 移除字符串头尾指定的字符序列, 可以指定多个。如果不指定参数,则默认将去除空格、制表符\t、换行符\n、回车符\r)。
返回值:返回移除字符串头尾指定的字符生成的新字符串。
lstrip() 方法用于截掉字符串左边的空格或指定字符。
lstrip()方法语法:str.lstrip([chars])
返回值:返回截掉字符串左边的空格或指定字符后生成的新字符串。
rstrip() 删除 string 字符串末尾的指定字符(默认为空格).
rstrip()方法语法:str.rstrip([chars])
返回值 : 返回删除 string 字符串末尾的指定字符后生成的新字符串。
'''
# 实例
str14 = "00000003210Runoob01230000000"
print(str14.strip("0")) # 去除首尾字符 '0'
print(str14.lstrip("0")) # 去除首部字符 '0'
print(str14.rstrip("0")) # 去除尾部字符 '0'
str15 = " \n Runoob\t \r " # 去除首尾空格
print(str15.strip()) # 默认参数为 空格、制表符\t、换行符\n、回车符\r
str18 = " \n Runoob 00 "
print(str18.lstrip()) # 默认参数为 空格、制表符\t、换行符\n、回车符\r
str19 = " Runoob 00 \n \t "
print(str19.rstrip()) # 默认参数为 空格、制表符\t、换行符\n、回车符\r
str16 = "@.你好吗,思锐...@."
print(str16.strip("@.")) # 去除字符串首尾的“@”或者“.”
print(str16.lstrip("@.")) # 去除字符串首部的“@”或者“.”
print(str16.rstrip("@.")) # 去除字符串尾部的“@”或者“.”
str17 = "12i3abcru12noob3241"
print(str17.strip("12")) # 去除字符串首尾的“1”或者“2”
print(str17.lstrip("12")) # 去除字符串首部的“1”或者“2”
print(str17.rstrip("12")) # 去除字符串尾部的“1”或者“2”
# 9 格式化字符串 两种方法:使用%操作符 使用format()函数
'''
1 使用%操作符
语法格式:%[(name)][flags][width].[precision]typecode % exp
参数:(name) 为命名
flags 可以有 +,-,' '或 0。+ 表示右对齐。- 表示左对齐。' ' 为一个空格,表示在正数的左侧填充一个空格,从而与负数对齐。0 表示使用 0 填充。
width 表示显示宽度 precision 表示小数点后精度 exp;要转换的项
2 str.format(),用与字符串的格式化,增强了字符串格式化的功能。
基本语法:str.format(args)
arges用于指定要转换的项:{[index][:[[fill]align][sign][#][width][.precision][type]]},是通过 {} 和 : 来代替以前的 % 。
fill:可选参数,用于指定空白处填充的字符 align:可选参数,只当对齐方式 sign:用于指定有无符号参数
format 函数可以接受不限个参数,位置可以不按顺序
'''
print("%6.3f" % 2.3)
# 第一个 % 后面的内容为显示的格式说明,6 为显示宽度,3 为小数点位数,f 为浮点数类型
# 第二个 % 后面为显示的内容来源,输出结果右对齐,2.300 长度为 5,故前面有一空格
print("%+10x" % 10) # x 为表示 16 进制,显示宽度为 10,前面有 8 个空格
print("%-5x" % -10) # %-5x 负号为左对齐,显示宽度为 5,故 -a 后面有 3 个空格
pi = 3.1415
print("pi的值是%s" % pi)
print("pi的值是%.8f" % pi)
print(".*f" % (4, 1.2)) # width, precision 为两个整数,可以利用 *,来动态代入这两个量
# 实例 格式化不同数据类型
print('1251+3950的结果是(以货币形式显示):¥{:,.2f}元'.format(1251 + 3950)) # 以货币形式显示
print('{0:.1f}用科学计数法表示:{0:E}'.format(120000.1)) # 用科学计数法表示
print('π取5位小数点:{:.5f}'.format(math.pi)) # 输出小数点后五位
print('{0:d}的16进制结果是:{0:#x}'.format(100)) # 输出十六进制数
print('天才是由 {:.0%} 的灵感,加上 {:.0%} 的汗水 。'.format(0.01, 0.99)) # 输出百分比,并且不带小数