字符串的使用
3、转义字符:以\开头,用来表示不能直接输入的特殊符号(如换行,制表符),相当于文字的特殊指令
前面其实已经在print函数接触过\n换行
1、常用转义字符
| |
| |
| |
| 显示单引号/双引号(避免和字符串界定符冲突)?界定符是什么 |
示例:
# 制表符\t
print("\t xing")
print(" xing ") # 写在前面的\t占用了4个空格位置
print("\t xing") # \t并不影响正常空格使用
print("xing\tyuan") # 写在后面的\t占用了4个空格位置
print("\txing\tyuan") # 不管写在前后,\t都占用了4个空格位置
# 换行符\n
print("diyihang\ndierhang\ndisanhuang") # 相对简单的转义字符
# 单个反斜杠\\
print("D:\360zip\tools\kantu") # 其实还是输出了结果,但是\T被识别为两个空格位置(这里有疑问,为什么之前的\t都是4个空格位置,但是这里是两个),\360被识别为ð特殊符号,\k虽然报错,但是还是输出了才报错的
print("D:\\360zip\\tools\\kantu") # \\直接代表反斜杠,我感觉更大的最用是直接切断了\+某个字符的转义字符格式
print("D:\2\34\567\17\27\37\47\367\127\277\77\66\377\0\7\07\70\077") # 从测试情况来看,\+数字可以组成特殊符号,个位数可以是0-7,十位数可以是0-7,但是三位数时,第一位最高是3,第二位最高是7,第三位最高是7,虽然会报错但是还是会输出结果,且大部分特殊符号都是乱码(好像没什么意义,能够使用的基本都是规定好的)
# 单引号或双引号
print("xing'yuan") # 字符串界定符(原来就是包裹字符串的单双引号)是单引号,里面可以用双引号,界定符是双引号,里面可以用单引号
print('xing"yuan')
print("xing"yuan") # 字符串界定符与内部使用的引号一致时就会报错
print('xing'yuan')
print('xing\'yuan\"') # 但是界定符与字符串内需要使用的引号相同就需要用\单引号或双引号
2、原始字符串:(r""):取消转义
作用:字符串前加r,里面的\会被当做普通字符,不用手动转义(适合文件目录、正则表达式)
示例:
# 原始字符串r
print(r"D:\360zip\tools\kantu") # r代表原始字符串,原始字符串中的所有字符都会被原样输出,不会被转义
print(r"D:\360zip\tools\kantu"") # 但是好像不能最后用"结束,这里报错了,注释也被当做代码的一部分
4、格式化字符串:优雅拼接变量和文字
1、作用:把变量、数字或运算结果嵌入到字符串中,让输出更整齐(不用反复用 + 拼接,避免报错)
2、实现方式
Python提供了多种方法来实现格式化输出,包括旧式的%格式化、str.format()以及较新的f-strings(Python3.6及以上版本,推荐使用)
3、f-strings(Python3.6+,最简单直观)
用法f""
示例:
# 输出我的姓名:xingyuan,我的年龄:18
# 格式化字符串
# 输出我的姓名:xingyuan,我的年龄:18岁。
name = "xingyuan"
age = 18
# 使用之前学过的知识,*args
print("我的姓名:", name, ",我的年龄:", age, "岁。") # 能正常输出,但是链接点都有一个空格,使用sep调整一下
print("我的姓名:", name, ",我的年龄:", age, "岁。", sep="") # 这样可以正常输出,但是需要调整的地方很多
# 使用拼接字符串
print("我的姓名:" + name + ",我的年龄:" + str(age) + "岁。") # 也可以正常输出,但是还是需要转age的类型
# 使用格式化字符串,f/F不区分大小写,用{}包裹变量
print(f"我的姓名:{name},我的年龄:{age}岁。") # 不需要刻意转换每个变量的格式为str,也不需要调整多个字符串之间的连接符,相对而言比较简洁
print(F"我的姓名:{name},我的年龄:{age}岁。") # 不需要刻意转换每个变量的格式为str,也不需要调整多个字符串之间的连接符,相对而言比较简洁
# 支持表达式,试着输出 3 * 5 = 15
num1 = 3
num2 = 5
print(num1, "*", num2, "=", num1 * num2, sep="")
print(f"{num1}*{num2}={num1 * num2}")
# 同时输出num1的格式
print(f"{num1}*{num2}={num1 * num2},{type(num1)}")
# 支持数字格式化:占位或者补0,用法:{变量名:宽度.精度}
sid = 1
# 输出sid为00001,{05}分别代表(0)填充字符和(5)宽度
print(f"{sid:05}")
# 输出pi的后4位{pi:.4f}分别代表(.)小数,(4)后四位,(f)浮点数
pi = 3.1415926535
print(f"{pi:.4f}") # 这里可以看出小数精度遵循四舍五入原则
print(f"{pi:.20f}") # 可以看出小数中默认的填充字符就是0,这里出现了一个额外知识,浮点数的精度上限为16位,超过16位就会出现误差数值,就像这里的5412
# 对齐与填充
a = "123abc"
print(f"{a:<11}") # < 表示左对齐,如果不指定特殊填充字符,那么默认填充字符为空格,可以省略
print(f"{a:11}") # 可以看出默认左对齐,填充字符为空格,往右边填充。
print(f"{a:->11}") # > 表示右对齐
print(f"{a:-^11}") # ^ 居中对齐,这里不能平均分的时候,左2右3
# 填充时只能用一个字符
print(f"{a:--^11}") # 使用多个字符会直接报错
print(f"{a:T^11.5}") # 使用小数的时候,c不见了是为什么?
# 这里产生了新的疑问:c不见了是因为11.5中11是宽度,5是精度,对于字符串来说,截取前5位,所以c被截掉
print(f"{a:T^11.6}") # 这里C就出现了
# 但是对于小数来说,{.5f}代表的是小数点后5位,那{.5}代表的是什么?
pi = 3.1415926535
print(f"{pi:.5}") # 结果是3.1416,即5位数字。那就说明对于小数来说,.并不算一个有效字符。
练习:将《静夜思》整首诗在一个print中输出,且需要包含标题且标题居中,每半句为1行和每1句为一行分别输出。
思路:每半句为一行时,加上标点共6个字符,如果想要居中,直接对“静夜思”进行居中(由于汉字和数字、标点等占用宽度不同,根据实际调整居中时的宽度设置)
print(f"{"静夜思":^7}\n床前明月光,\n疑是地上霜。\n举头望明月,\n低头思故乡。") # 6个字符宽度本来应该是6,但是实际写完后看到偏左,用7更好一点
print(f"{"静夜思":^16}\n床前明月光,疑是地上霜。\n举头望明月,低头思故乡。")
# 两种都正常输出了。这里的问题在于,判断实际中的文字宽度,并不是直接数汉字和标点个数来决定字符整体宽度,暂时只是用眼睛判断,慢慢调整。