目录
二类型和运算
程序由模块构成,模块包含语句,语句包含表达式,表达式建立并处理对象
4介绍python的对象类型
4.1为什么使用内置类型
内置对象使程序更容易编写
内置对象是扩展的组件
内置对象往往比定制的数据结构更有效率
内置对象是语言的标准的一部分
4.2python的核心数据类型
python中没有类型声明,运行的表达式的语法决定了创建和使用的对象的类型
一旦创建了一个对象,它就和操作集合绑定了——对列表只能进行列表相关的操作
4.3字符串
字符串是单个字符的字符串的序列
作为序列,字符串支持假设其中各个元素包含位置顺序的操作
len函数可以获取其长度,索引操作可以得到其各个元素
索引是按照从最前面的偏移量进行编码的,也就是从0开始
可以使用反向索引,-1表示最后一个元素的索引
可以进行分片操作,一般形式为X[I:J],表示取出在X中从偏移量为I,知道但不包括偏移量为J的内容
支持加号进行合并和乘号进行重复
4.4不可变性
字符串在python中具有不可变性——在创建后不能就地改变
可以通过建立一个新的字符串并以同一变量名对其进行赋值,这是因为python在运行过程中会清理旧的对象
在核心类型中,数字、字符和元组是不可变的。列表和字典是可变的
4.5字符串类型特定的操作
字符串find方法是一个基本的子字符串查找的操作(返回一个传入子字符串的偏移量,没有的话返回-1)
字符串的replace方法将会对全局进行搜索和替换
通过分隔符将字符串分为子字符串,大小写变换,测试字符串的内容,去掉字符串后的空格字符
字符串支持一个叫格式化的高级替代操作,可以以一个表达式的形式或者一个字符串方法调用
序列操作时通用的,但方法不通用
一条简明的法则是:可作用于多种类型的通用型操作都是以内置函数或表达式的形式出现的(len(x),x[0]),但是类型特定的操作是以方法调用的形式出现的(aString.upper())
python允许字符串包括在单引号或双引号中,也允许在三个引号(单或双)中包括多行字符串常量
4.6寻求帮助
可以调用dir函数,将会返回一个列表,其中包含了对象的所有属性
以双下划线开头并结尾的变量名是用来表示python实现细节的命名模式
dir函数简单地给出了方法的名称,查询他们做什么,可以传递给help函数
help(S.replace)
4.7模式匹配
字符串对象的方法能够支持基于模式的文本处理
与模式中括号包含的部分匹配的子字符串的对应部分保存为组
4.8列表
列表是一个任意类型的对象的位置相关的有序集合,它没有固定的大小。
列表支持所有对字符串所讨论过的序列操作
列表的append方法扩充了列表的大小并在列表的尾部插入一项
pop方法移除给定偏移量的一项
可以在任意位置插入(insert)元素
按照值移除(remove)元素
sort方法默认按照升序对列表进行排序
reverse对列表进行翻转
4.9嵌套
python核心数据类型的一个优秀的特性就是它们支持任意的嵌套。能够以任意的组合对其进行嵌套,并可以多个层次进行嵌套,可以实现矩阵或者多维数组
获取方法如下:
4.10列表解析
列表解析是一种通过对序列中的每一项运行一个表达式来创建一个新列表的方法,每次一个,从左至右
列表解析创建了新的列表作为结果,但是能够在任何可迭代的对象上进行迭代
4.11字典
字典不是序列,而是一种映射,是通过键而不是相对位置来存储的
字典编写在大括号中,并包含一系列的“键:值”对
也可以每次以一个键来填写进行字典创建
嵌套
python具有一种叫做垃圾收集的特性,在程序运行时可以清理不再使用的内存。一旦一个对象的最后一次引用被移除,空间将会立即回收
4.12键的排序:for循环
因为字典不是序列,并不包含任何可靠的从左至右的顺序。所以打印时无顺序
一种解决方法是通过字典的keys方法收集一个键的列表,使用列表sort方法进行排序,然后使用for循环
另一种是使用sorted自动对字典的键排序
4.13元组
元组对象就像一个不可以改变的列表,元组是序列,具有不可变性,编写在圆括号中,支持任意类型、任意嵌套以及常见的序列操作
由于不可变性,元组在实际中并不常用,如果在程序中以列表的形式传递一个对象的集合,它可能在任何地方改变;如果使用元组的话,则不能。元组提供了一种完整性约束,对于编写的更大型程序来说是方便的
4.14文件
打开文件,需要调用内置的open函数以字符串的形式传递个它一个外部文件名以及一个处理模式的字符串
f=open(‘data.txt’,’w’) f.write(‘hello’)写文件
f=open(‘data.txt’,’r’) text=f.read()读文件
5数字
5.1python的数字类型
整数和浮点数,复数,固定精度的十进制数,有理分数,集合,布尔类型,无穷的整数精度,各种数字内置函数和模块
5.2数字常量
整数和浮点数常量:整数以十进制数字的字符串写法出现,浮点数带一个小数点,也可以加上一个科学计数标志e或E
十六进制数、八进制和二进制常量:十六进制数以0x或0X开头,八进制常量以数字0o或0O(0和小写或大写的字母‘o’),二进制常量以0b或0B开头
hex(I)、oct(I)和bin(I)把一个整数转换为这3中进制表示的字符串
int(str,base)根据每个给定的进制把一个运行时字符串转换为一个整数
复数:复数常量写成实部+虚部,虚部以j或J结尾,也可以通过内置函数complex(real,imag)来创建复数
5.3内置数学工具和扩展
表达式操作符:+、-、*、/、>>、**、&等
内置数学函数:pow、abs、round、int、hex、bin等
公用模块:random、math等
is_integer方法测试数字是否是一个整数
bit_length方法给出表示对象的值所必需的位数
集合像一些集合一样也像一些数字一样,支持这两者的方法和表达式
5.4Python表达式操作符
列举python所有的操作符表达式
is操作符测试对象身份(也就是内存地址,严格意义上的相等)
混合操作遵循的操作符优先级:
上表中操作符越靠后的优先级越高,这决定了先做哪步操作
括号分组的子表达式:如果用括号将表达式各部分进行分组的话,就可以完全忘掉优先级的事情了,就会超越python的优先级规则
混合类型自动升级:在混合类型的表达式中,python首先将被操作的对象转换成其中最复杂的操作对象的类型,然后再对相同类型的操作对象进行数学运算
所有这些混合类型转换仅仅在将数字类型混合到一个表达式中的时候才适用;python不会在其他类型之间进行转换,例如字符串和整数相加
运算符重载:多态这个术语指操作的意义取决于所操作的对象的类型
5.5变量和基本的表达式
变量在它第一次赋值时创建
变量在表达式中使用将被替换为它们的值
变量在表达式中使用以前必须已赋值
变量像对象一样不需要在一开始进行声明
变量并不需要预声明,但是在使用之前,至少要赋一次值
5.6比较:一般的和连续的
一般的比较就像我们所期待的那样对数字起作用,它们比较操作数的相对大小,并且返回一个布尔类型的结果
str和repr显示格式
默认的交互模式回显和打印的区别就相当于内置repr和str函数的区别
repr产生的结果看起来就好像它们是代码
str转变为一种通常对用户更加友好的格式
str用于一般用途,repr用于额外细节
python允许我们把大小比较测试连接起来,称为诸如范围测试的连续比较
True和False只不过是定制为1和0
5.7除法:传统除法、Floor除法和真除法
python3.0中,/现在总是执行真除法,不管操作数的类型,都返回包含任何余数的一个浮点结果;//执行Floor除法,它截除掉余数并且针对整数操作数返回一个整数,如果有任何一个操作数是浮点类型,则返回一个浮点数
python2.6中,/表示传统除法,如果两个操作数都是整数的话,执行截断的整数除法,否则,执行浮点除法(保留余数);//执行Floor除法,和python3.0一样
注意,python3.0中,//的结果的数据类型总是依赖于操作数的类型
5.8十六进制、八进制和二进制记数
oct函数会将十进制数转换为八进制
hex函数会将十进制数转换为十六进制数
bin函数会将十进制数转换为二进制
int函数会将一个数字的字符串变换为一个整数,通过定义的第二个参数来确定变换后的数字的进制
eval函数将会把字符串作为python代码
使用字符串格式化方法调用和表达式将一个整数转换成八进制数和十六进制数的字符串
5.9位操作
可以把整数当作二进制位串对待,实现位移以及布尔操作
左移,右移,与,或,异或等等
5.10其他的内置数学工具
删除一个浮点数的小数位,截断和floor方法
round舍入一个浮点数但是仍然在内存中产生一个浮点数
而字符串格式化产生一个字符串并且不会得到一个修改后的数字
在python中有3中方法计算平方根:使用一个模块函数、一个表达式或一个内置函数
使用random模块时必须导入
可以选出一个在0和1之间的任意浮点数、选择在两个数字之间的任意整数、在一个序列汇中任意挑选一项等:
5.11小数数字
小数对象是通过一个导入的模块调用函数后创建的,而不是通过运行常量表达式创建的。
小数对象就像浮点数,只不过它们有固定的位数和小数点,因此小数是有固定的精度的浮点值
注意,通过decimal.Decimal.from_float(1.25)将能够从一个浮点对象创建一个小数对象
设置全局精度:decimal模块可以用来设置所有小数数值的精度、设置错误处理等
这个模块中的一个上下文对象允许指定精度和舍入模式,该精度全局性适用于调用线程中创建的所有小数
小数上下文管理器:可使用上下文管理器语句来重新设置临时精度。在语句退出后,精度又重新设置为初始值
5.12分数类型
分数实现了一个有理数对象,明确地保留一个分子和一个分母,从而避免了浮点数学的某些不精确性和局限性
分数对象也可以从浮点数字符串来创建,这和小数很相似
分数保持精确性,并且自动简化结果
转换和混合类型:为了支持分数转换,浮点数对象有一个办法,能够产生它们的分子和分母;分数有一个from_float方法,并且float接收一个Fraction作为参数
*是一种特殊的语法,它把一个元组扩展到单个的参数中
混合类型运算
尽管可以把浮点数转换为分数,在某些情况下,这么做的时候会有不可避免的精度损失,因为这个数字在其最初的浮点形式下是不精确的。当需要的时候,可以通过限制最大分母值来简化这样的结果
limit_denominator(max_denominator):max_denominator默认值是1000000,这个函数用于返回一个分母不大于max_denominator且最接近原值的分数
5.13集合
集合是一些唯一的、不可变的对象的一个无序集合,这些对象支持数学集合理论相对应的操作,一个项在集合中只能出现一次,不管将它添加了多少次
它是其他对象的集合,因此,具有列表和字典的某些共同行为
5.13.1python2.6集合基础知识,python3也适用
创建集合,向内置set函数传递一个序列或其他的可迭代的对象
集合通过表达式操作符支持一般的数学集合运算
除了表达式,还提供了对应这些操作的方法
add插入一个项目,update是按位置求并集,remove根据值删除一个项目
作为可迭代的容器,可以使用len和for,但不支持索引和分片
前面表达式操作需要两个集合,但是基于方法的对应形式也可以
issubset()方法用于判断集合的所有元素是否都包含在指定集合中,是返回True,否则返回False
5.13.2python3中的集合常量
增加了新的方式构建集合,使用{}
支持先前的计算
注意,在python中{}仍然是一个字典,空的集合必须通过内置函数set来创建
用常量创建的集合支持表达式所不支持的通用可迭代操作数
5.13.3不可变限制和冻结集合
集合只能包含不可变的对象类型
列表和字典不能嵌入到集合中,元组时可以嵌入的
集合本身也是不可改变的,不能直接嵌入到其他集合中,如果需要在另一个集合中存储一个集合,可以像调用set一样来调用frozenset
5.13.4集合解析
集合解析构造类似于列表解析的形式,编写在花括号中而不是方括号中,并且作用于集合而不是列表
5.13.5为什么使用集合
集合(set)可以用来把重复项从其他集合(collection)中过滤掉,直接把集合(set)转换为一个集合(collection),然后在转换回来即可
在遍历图形或其他的回环结构的时候,集合可以用来记录已经访问过的位置
在处理较大的数据集合的时候(例如数据库查询结果),两个集合的交集包含了两个领域中共有的对象
5.14布尔型
布尔型数据类型bool,其值为True和False,是预先定义的内置的变量名,新的变量名True和False是bool的实例,是整数类型int的子类
True和False能够看作是预定义的设置为整数为1和0的变量
5.15数字扩展
扩展python的核心数字类型
NumPy:矩阵数据类型,向量处理和高级计算库
SciPy包
6动态类型简介
6.1缺少类型声明语句的情况
在python中,类型是在运行过程中自动决定的,而不是通过代码声明
6.2变量、对象和引用
变量的创建:一个变量,当代码第一次给它赋值时就创建了它,之后的赋值将会改变已创建的变量名的值
变量的类型:变量永远不会有任何的和它关联的类型信息或约束。类型的概念是存在于对象中而不是变量名中。变量原本是通用的,它只是在一个特定的时间点,简单地引用了一个特定的对象而已
变量的使用:当变量出现在表达式中时,会马上被当前引用的对象所代替,无论这个对象是什么类型。所有的变量必须在其使用前明确地赋值,使用未赋值的变量会产生错误
变量在赋值的时候才创建,它可以引用任何类型的对象,并且必须在引用之前赋值
a=3
1创建了一个对象来代表3
2创建了一个变量a,如果它还没有创建的话
3将变量与新的对象3相连接
内部结构如下,变量和对象保存在内存中的不同部分,并通过连接相关联
从变量到对象的连接称作引用,引用是一种关系,以内存中的指针的形式实现
1变量是一个系统表的元素,拥有指向对象的连接空间
2对象是分配的一块内存,有足够的空间去表示它们所代表的值
3引用是自动形成的从变量到对象的指针
从内部看,作为一种优化,python缓存了不变的对象并对其进行复用(小的整数和字符串等)
每一个对象都有两个标准的头部信息:一个类型标志符去标识这个对象的类型,以及一个引用的计数器,用来决定是不是可以回收这个对象
6.3类型属于对象,而不是变量
可以把python的引用想成C的void指针
变量名没有类型,类型属于对象,而不是对象名
因为变量没有类型,我们实际上并没有改变变量的类型,只是让变量引用了不同类型的对象而已。实际上,python的变量就是在特定的时间引用了一个特定的对象
类型是与对象相关联的,而不是和变量关联
对象知道自己的类型,每个对象都包含了一个头部信息,其中标记了这个对象的类型
6.4对象的垃圾收集
在python中,每当一个变量名被赋予了一个新的对象,之前的那个对象占用的空间就会被回收
在内部,python是这样实现这一功能的:它在每个对象中保持一个计数器,计数器记录了当前指向该对象的引用的数目。一旦这个计数器被设置为零,这个对象的内存空间就会被自动回收。
6.5共享引用
a=3,b=a
这在python中叫做共享引用:多个变量名引用了同一个对象
在python中,变量总是一个指向对象的指针,而不是可改变的内存区域的标签:给一个变量赋一个新的值,并不是替换了原始的对象,而不是让这个变量去引用完全不同的一个对象
6.6共享引用和在原处修改
有一些对象和操作确实会在原处改变对象
在一个列表中对一个偏移进行赋值确实会改变这个列表对象,而不是生成一个新的列表对象
没有改变L1,改变了L1所引用的对象的一个元素。这类修改会覆盖列表对象的某部分
如果不想这样的现象发生,需要python拷贝对象,而不是创建引用
分片拷贝对象
分片技术不会应用在其他可变的核心类型中,复制一个字典或集合应该使用X.copy()方法调用
copy模块有一个通用的复制任意对象类型的调用,也有一个拷贝嵌套对象结构的调用
6.7共享引用和相等
python缓存并复用了小的整数和小的字符串
由于python的引用模型,在python程序中有两种不同的方法去检查是否相等
==操作符:测试两个被引用的对象是否有相同的值
is操作符:是在检查对象的同一性,是否指向同一个对象
对小的数字采用同样的操作时
因为小的整数和字符串被缓存并复用了,所以is告诉我们X和Y是引用了一个相同的对象
能够向python查询一个对象引用的次数:在sys模块中的getrefcount函数会返回对象的引用次数
7字符串
一个有序的字符的集合,用来存储和表现基于文本的信息
没有单个字符的这种类型,可以使用一个字符的字符串
字符串被划分为不可变序列这一类别,意味着这些字符串所包含的字符存在从左至右的位置顺序,并且它们不可以在原处修改,是序列
常见字符串常量和表达式如下:
python3.0中,有3中字符串类型:str用于Unicode文本(ASCII或其他),bytes用于二进制数据(包括编码的文本),bytearray是bytes的一种可变的变体
7.1单双引号字符串是一样的
字符串常量表达式可以用两个单引号或两个双引号来表示
python自动在任意的表达式中合并相邻的字符串常量
在这些字符串之间增加逗号会创建一个元组,而不是一个字符串
7.2用转义序列代表特殊字节
反斜杠用来引入特殊的字节编码,是转义序列
转义的这个字符通过转义序列定义了一个二进制值
可以使用内置的len函数,可以返回字符串中到底有多少字节
字符串反斜杠字符
一个转义序列允许一个字符串的字节中嵌入绝对的二进制值,嵌入两个二进制零字符(将八进制编码转义为一个数字)
零(空)字符不会去结束一个字符串,python没有字符会结束一个字符串,这里有一个完全由绝对的二进制转义字符编码的字符串:一个二进制1和2(以八进制编码)以及一个二进制3(以十六进制编码)
python以十六进制显示非打印的字符,不管如何指定它们
要常量反斜杠,重复两个反斜杠,或使用raw字符串
7.3raw字符串抑制转义
如果字母r(大写或小写)出现在字符串的第一引号的前面,它将会关闭转义机制,这样会将反斜杠作为常量来保持
注意:一个raw字符串不能以单个的反斜杠结尾,因为反斜杠会转义后续引用的字符。r’...\’不是一个有效的字符串常量,一个raw字符串不能以奇数个反斜杠结束。
如果需要单个的反斜杠结束一个raw字符串:
1使用两个反斜杠并分片掉第二个反斜杠(r’1\nb\tc\\’[:-1])
2手动添加一个反斜杠(r’1\nb\tc’+’\\’)
3忽略raw字符串语法在常规字符串中把反斜杠改为双反斜杠(’1\\nb\\tc\\’)
7.4三重引号编写多行字符串块
三重引号内的字符串常量格式称为块字符串
三重引号字符串常用于文档字符串,出现在文件的特定地点时,被当作注释一样的字符串常量,用作多行注释
7.5字符串基本操作
字符串可以通过+进行合并,*进行重复
可以使用for语句在一个字符串进行循环迭代,并使用in表达式对字符和子字符串进行成员关系的测试,实际上是一种搜索,返回的是布尔值,跟str.find()方法很像,但返回的是子字符串的位置
for循环指派了一个变量去获取一个序列其中的元素,并对每一个元素执行一个或多个语句
7.6索引和分片
可以通过其位置获得他们的元素,为索引使用方括号,提供一个元素的数字偏移量
在字符串中使用负偏移从序列中获取元素,一个负偏移与这个字符串的长度相加后得到这个字符串的正的偏移值,能够将负偏移看作是从结束处反向计数
偏移和分片的网络示意图
偏移和分片:位置偏移从左至右(0为第一个元素),负偏移是由末端右侧开始计算(-1为最后一个元素)
分片能够从一整个字符串中分离提取出一部分内容(子字符串)
分片时,当使用一对以冒号分隔的偏移来索引字符串这样的序列对象时,会返回一个新的对象,包含了以这对偏移量所标识的连续的内容。将获取从下边界直到但不包括上边界的所有元素,并返回一个包含了所获取的元素的新对象
如果被忽略,上下边界的默认值对应为0和分片的对象的长度
分片表达式增加了一个可选的第三个索引,用作步进。
X[I:J:K]表示索引X对象中的元素,从偏移为I直到偏移为J-1,每隔K元素索引一次。那么能够使用第三个限制去跳过某些元素或反向排列它们的顺序
为什么使用分片?
分片常常用作清理输入文件的内容。如果知道一行将会以行终止字符结束,可以通过line[:-1],把这行除去最后一个字符之外的所有内容提取出来
为了去掉换行字符推荐采用line.rstrip方法,因为这个调用将会留下没有换行字符那行的最后一个字符
7.7字符串转换工具
int函数将字符串转换为数字,str函数将数字转换为字符串,repr函数能够将一个对象转换为其字符串形式,然而这些返回的对象将作为代码的字符串,可以重新创建对象
eval函数将会运行一个包含python表达式代码的字符串,能够将一个字符串转换为任意类型的对象
ord函数将单个字符串转换为其对应的ASCII码(返回的是这个字符在内存中对应的字符的二进制值)
chr函数将会执行相反的操作,获取ASCII码并将其转换为对应的字符
int和bin函数可以用来处理二进制转换任务
7.8修改字符串
字符串是不可变序列,是不能在原地修改的
若要改变一个字符串,需要利用合并、分片来建立并赋值给一个新的字符串
还可以通过replace函数进行修改
还可以通过字符串格式串化表达式来创建新的文本值,会返回一个新的字符串对象
7.9字符串方法
属性读取:具有object.attribute格式的表达式可以理解为“读取object对象的属性attribute的值”
函数调用表达式:具有函数(参数)格式的表达式意味着“调用函数代码,传递零或者更多用逗号隔开的参数对象,最后返回函数的返回值”
S是一个字符串对象,并且可选的参数包含在方括号中,字符串方法调用如下
7.10字符串方法实例:修改字符串
可以通过分片和合并操作来建立新的字符串
replace方法它的参数是原始子字符串(任意长度)和替换原始子字符串的字符串(任意长度),之后进行全局搜索并替换
find方法返回在子字符串出现处的偏移或者未找到时返回-1
还可以通过list函数将字符串转换为一个支持原处修改的对象
修改之后,变回字符串可以使用join方法进行合并
join将列表字符串连在一起,并用分隔符隔开
7.11字符串方法实例:文本解析
文本解析:分析结构并提取子串
采用分片和split
split方法将一个字符串分割为一个子字符串的列表,以分隔符字符串为标准
分片和split两种方法运行都很快
7.12实际应用中的其他常用字符串的方法
与字符串方法相比,其他的技术也能够达到相同的效果
7.13字符串格式化表达式
字符串格式化表示:最初的技术,基于C语言的printf模型,在大多数现有的代码中使用
字符串格式化方法调用:python独有的方法,和字符串格式化表达式的功能有很大重叠
格式化字符串:
1在%操作符的左侧放置一个需要进行格式化的字符串,这个字符串带有一个或多个嵌入的转换目标,都以%开头
2在%操作符右侧放置一个(或多个,嵌入到元组中)对象,这些对象将会插入到左侧想让python进行格式化字符串的一个(或多个)转换目标的位置上去
每一个与%s一同参与操作的对象类型都可以转换代码
格式化总是会返回新的字符串作为结果而不是对左侧的字符串进行修改
7.14更高级的字符串格式化表达式
字符串格式化代码如下
表达式左侧的转换目标支持多种转换操作,转换目标的通用结构看上去是这样的:%[(name)][flags][width][.precision]typecode
表中的字符码出现在目标字符串的尾部,在%和typecode之间,可以进行如下操作:
放置一个字典的键;罗列出左对齐(-)、正负号(+)、补零(0)的标志位;给出数字的整体长度和小数点后的位数等。width和percision都可以编码为一个*,以指定它们应该从输入值的下一项中取值
如果在运行的时候才知道大小,可以在格式化字符串中用一个*来指定通过计算得出width和precision,从而迫使它们的值从%运算符右边的输出中的下一项获取,4指定为precision
7.15基于字典的字符串格式化
字符串的格式化同时也允许左边的转换目标来引用右边字典中的键来提取对应的值
这样的小技巧常与内置函数vars配合使用,这个函数返回的字典包含了所有在本函数调用时存在的变量:
当字典用在一个格式化操作的右边时,会让格式化字符串通过变量名来访问变量(通过字典的键)
7.16字符串格式化调用方法之基础知识
字符串对象的format方法使用主体字符串作为模板,并且接受任意多个表示将要根据模板替换的值的参数。
在主体字符串中,花括号通过位置或关键字指出替换目标及将要插入的参数
任意的对象类型都可以替换
format创建并返回一个新的字符串对象,可以立即打印或保存起来以后使用
7.17添加键、属性和偏移量
格式化字符串可以指定对象属性和字典键,方括号指定字典键,点表示位置或关键字所引用的一项的对象属性
格式化字符串中的方括号可以指定列表偏移量以执行索引,只有单个的正的偏移才能在格式化字符串的语法中有效
7.18添加具体格式化
对于格式化方法,可以在替换目标的标识之后使用一个冒号,后面跟着可以指定字段大小、对齐方式和一个特定类型编码的格式化声明,形式化结构如下:
{fieldname!conversionflag:formatspec}
fieldname是指定参数的一个数字或关键字,后面跟着可选的“.name”或“[index]”成分引用
conversionflag可以是r、s或者a分别是在该值上对repr、str或ascii内置函数的一次调用
formatspec指定了如何表示该值,包括字段宽度、对齐方式、补零、小数点精度等细节,并且以一个可选的数据类型编码结束
formatspec组成形式上的描述如下(方括号表示可选)
[[fill]align][sign][#][0][width][.precision][typecode]
align可能是<、>、=或^,分别表示左对齐、右对齐、一个标记字符后的补充或居中对齐
通过嵌套的格式化语法从参数列表动态获取
内置的format函数,可以用来格式化一个单独的项
7.19与%格式化表达式比较
格式化表达式可能比格式化方法调用更容易编写
**数据是特殊的语法,它把键和值的一个字典包装到单个的“name=value”的关键字参数中,以便可以在格式化字符串中用名字来引用他们
猪猪&&憨憨