1 字符串的表示
文本序列类型 -- 字符串(str)
由 Unicode 码点 构成的不可变序列对象(不可在原处修改),用于文本处理。
通过字符串字面量或 str 构造函数可以创建字符串对象。
字符串对象支持表达式操作(合并,切片,索引)和字符串对象的方法和 str 类方法调用方法返回的字符串是新建的字符串。
Python 无字符类型
字符串的创建
'Python'
"python"
"""Python"""
r'C:\python' # 原始字符串,将 \ 看成普通字符,不进行转译
u'python' # Unicode 字面量
f'python' # 格式串字面量
字节字面量(b' ',B' ',b" ",B" ",)
用于创建 bytes 对象,而不是 str 对象
不论编码声明制定何种编码,Bytes 对象仅包含 ASCll 字符,数值大于 127 的字节必须用转义字符表示
创建字符串
Class str(object = ‘’)
将对象转换为字符串;若没有给定 object ,则返回空串;
否则,返回 object.__str__(),即对象的可打印串表示,若 object 指定一个串,则返回串本身;否则返回repr(object)
Class str(object = b' ', encoding = 'utf-8', errors = 'strict')
给定 encoding 或 errors,则 object 属于字节类型对象(bytes 或 bytearray),调用等价于 bytes.decode(encoding,errors)
print(str(b'Zoot!'))
print(type(b'Zoot!'))
print(str(1/3))
ASCll 编码
标准 ASCll 码:使用7位二进制表示128个字符,包括英语大,小写,数字0-9,标点符号,特殊控制字符。
GB2312 编码:兼容ASCll
收录简化汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文 字母、汉语拼音符号、汉语注音字母,共 7445 个字符。 两字节、区位码。进行“分区”处理,每区含有94个汉字/符号。 GBK、CP936 均采用两字节表示中文
Unicode 通过多八位编码字符集的简称,支持现今世界各种不同语言的字面文本的交换,处理及显示:
所有字符都分配了一个唯一的数字编号,称为码位 / 码点
可采用UTF-8,UTF-16,UTF-32(4字节)编码规则进行
Unicode 码表
print(ord('知'))
print(chr(30693))
print('知'.encode('utf8'))
s = 'Python Project'
print(len(s))
print(len(s.encode('utf8')))
print(len(s.encode('utf16')))
Python2 默认采用ASCll编码
Python3 默认采用 UTF-8 编码,可以不加声明
2. 字符串格式化
str.format
f''
字符串格式化参数比较多,建议使用 jupyter 输入如下代码,可一次输出多行的值。
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
方法 1 :str.format(*args,**kwargs)
https://docs.python.org/3/library/string.html#formatstrings
格式串语法:由{}引起的替换域和字面量文本构成,每个替换域包括位置参数的数字索引或关键字参数的关键字名;
返回值:替换域被对应参数的串值代替后的原串的拷贝;若要输出引号,则通过{{和}}输出
格式串 { [ field name] [!conversion] [:format_spec] }
[field name]: 以参数名arg_name开始,可以是数字或关键字
对应参数的标识符
数字,对应参数的编号
标识符.属性
标识符[index]
[! conversion ]
!s 调用str() 返回对象的可打印串表示
!a 调用ascii() 返回 \x \u 或 \U 跳过repe() 返回非 ASCII 字符
!r 调用 repr() 返回包含对象可打印表示的串
字符串{}.format()
大括号中包含数字索引
point = dict(x=2.5,y=3.5)
# 大括号中包含数字索引
"Abscisa value:{0},coordinate value:{1}".format(point['x'],point['y'])
"Abscisa value:{},coordinate value:{}".format(point['x'],point['y'])
大括号中包含关键字
point1 = dict(x=2.5,y=3.5)
point2 = dict(x=5,y=7)
'Abscisa value: {0[x]}, coordinate value:{0[y]}'.format(point1)
"Abscisa value:{[x]}, coordinate value:{[y]}".format(point1,point2)
"Abscisa value: {x}, coordinate value:{y}".format(**point1)
将字典的 key 作为位置参数
point = dict(x=2.5,y=3.5)
# 将字典的 key 作为位置参数
"Abscisa value:{0}, coordinate value:{1}".format(*point)
[[ fill ] align ] [sign] [#] [0] [ width] [ grouping_option] [.precision] [type]
填充 对齐 符号 宽度 , .精度 类型
字符串中{ 参数序号 : 格式控制 }
填充:在固定宽度的情况下填空的东西,默认为空格,fill 为你给定的填充类型。
对齐:在填充中选择左对齐(<),右对齐(>),居中(^)。
符号:
+:正数前加 + ,负数前加 - 。
- :正数前不加,负数前加 - 。
(空格):正数前加空格,负数前加负号。
# :符号说明
在二进制整数前,增加 0b
在八进制整数前,增加 0o
在十进制整数前,不添加
在十六进制整数前,增加 0x (小写)
在十六进制整数前,增加 0X (大写)
宽度.精度:
width 即填充的尺寸,在复数和非数值类型不可使用;
width.precision 在浮点数时,precision 决定浮点数小数点后位数;
在字符串时,precision 决定使用字符串前 precision 位。
分组选项: ,(整数) _(任意) 用于显示数字的千位分隔符。
类型:
对于整数
b 输出整数的二进制
c 输出整数对应的 Unicode 字符
d 输出整数的十进制
o 输出整数的八进制
x 输出整数的十六进制(小写)
X 输出整数的十六进制(大写)
对于浮点数
e 输出浮点数的e的指数形式(小写)
E 输出浮点数的E的指数形式(大写)
f 输出浮点数
% 输出浮点数的百分数类型
当不给定类型(默认为整数时),可使用 width (宽度) 加 [[ fill ] align ] (填充对齐)
当给定类型(如 f,e),使用 width.precision(宽度.精度),先由精度决定输出,当精度的宽度大于指定宽度时,按照精度给出的宽度输出,当精度的宽度小于指定的宽度时,按照宽度加填充的方式到达指定宽度后,输出。
point = (2,-3.5)
"Abscisa value:{0[0]}, coordinate value:{0[1]}".format(point)
"Abscisa value:{0}, coordinate value:{1}".format(*point)
# {位置参数:填充元素 对齐 宽度}
"Abscisa value:{0:X<5}, coordinate value:{1:Y>8}".format(*point)
print()
# {位置参数:填充元素 对齐 宽度.精度 类型}
"Abscisa value:{0:<.3f}, coordinate value:{1:>.3f}".format(*point)
"Abscisa value:{0:<4.3f}, coordinate value:{1:>4.3f}".format(*point)
print()
"Abscisa value:{0:X<8.3f}, coordinate value:{1:Y>8.3f}".format(*point)
"Abscisa value:{0:X^10.3e}, coordinate value:{1:Y>10.3e}".format(*point)
加入分组选项 (整数格式说明符不允许设置精度)
,只能用于 d (十进制) 当类型为b ( 二进制) o (八进制) x (十六进制)时报错
point = (20,-3000)
# {位置参数:填充元素 对齐 符号 # 宽度 分组选项 类型}
"Abscisa value:{0:X<+#10_b}, coordinate value:{1:Y>-#10,}".format(*point)
方法2
f-string 中的替换域(replacement_field)
name = 'Fred'
f"He said his name is {name}."
f"He said his name is {name!a}."
f"He said his name is {name!r}."
f"He said his name is {name!s}."
import decimal
width = 10
precision = 5
value = decimal.Decimal("12.34567")
f'result:{value:{width}.{precision}}'