第3章 数值和字符串
在你能够开始编写程序之前,还有一个主题需要理解,那就是Python的数据类型:数值、字符串、列表(List)、元组(Tuple)、字典(Dict)和集合(Set)。列表、元组、字典和集合都可以可以包含多个值,有了这些数据类型我们编写程序处理大量数据就变得更容易。而且,这些数据类型中本身又可以包含自身数据类型或其他数据类型,因此可以用它们来处理复杂的数据形式。
从本章开始将详细探讨这些数据类型的基础知识和数据类型相关的方法,方法就是函数,它们与特定数据类型的值绑定,方便我们处理该类型的数据。
3.1 数值(Number)
第一讲为了能快速的进入Python学习氛围,我们讲了一部分的数值类型相关的内容,这一节我们讲详细讨论Python数值类型的内容,以让读者对Python的数据类型有个完整的掌握。
3.1.1 Python变量的本质
数值数据类型变量用于存储数值,定义好的数值类变量是不允许改变其值,如果改变值,将会导致重新分配内存空间,估计很多人看着很晕,这个和我们直观上感觉不一致,也和我们过去学的语言的概念机制不一致。看例子:定义一个数值类型变量var=1,然后我们重新赋值var=2,1和2都是整数,尽管数据类型未改变,因为改变var变量的值,其内存地址也会重新分配,说了这么多,我们怎么验证呢?难点是怎么取变量指向的内存地址呢?Python中通过id()函数来完成这个任务,其语法格式为:id([object]),返回就是该变量的内存地址,我们可以看源码中id函数的解释:
def id(*args, **kwargs): # real signature unknown
"""
Return the identity of an object.
This is guaranteed to be unique among simultaneously existing objects.
(CPython uses the object's memory address.)
"""
pass
下面我们就来验证一下,最好是通过命令行方法,启动PyCharm,打开工程,点击底部的Python Console进入控制台:
>>> var=1
>>> print(id(var))
4483410224
>>> var=2
>>> print(id(var))
4483410256
通过上面的执行情况看,第一次赋值完成后var的内存地址是:4483410224,当重新给var赋值2的时候,var变量的内存地址变成了:4483410256。当var变量重新赋值之后,原始的值:1还在内存中,只不过没有变量指向它了。看到这里估计很多人会问,你怎么知道的,我们做个实验:还是var变量
>>> var=1
>>> print(id(var))
94421016702272
>>> newVar=var #变量newVar和var为同一值。
>>>print(id(newVar)) #打印newVar的内存地址
94421016702272 #和var相同
>>> var=2 #对var重新赋值
>>> print(id(var)) #再次打印var内存地址
94421016702304 #变了变了
>>> print(newVar) #打印newVar的值,还是1
1
>>> print(id(newVar)) #打印newVar地址,
94421016702272 #没变
>>> print(id(var)) #打印var内存地址
94421016702304 #变了,var指向了另一个内存地址
通过上面的过程我们发现,Python变量重新赋值不是占用原来的地方,而是在内存重新开辟一个区域放进新值,把变量指向新的地址。原值没有变量指向的地址会在适当的时候被解释器回收。如果我们在程序中做了类似上面的操作,新的变量就是在后面代码没用到,Python解释器也不会主动释放它指向的内存区域,因为还有个变量指向那个地址,如果想主动释放这块内存区域,就要使用del语句删除指向该内存区域的变量对象引用,来主动给解释器说这块内存我不用了,你收回去吧,看代码:
>>> var=12
>>> newVar=var
>>> var=13
>>> var
13
>>> newVar
12
>>> print(id(var))
94749604572864
>>> print(id(newVar))
94749604572832
>>> del newVar #删除newVar变量,删除了指向值为1的内存的引用
>>> newVar #再次显示,会引发错误,程序中已经没有这个标记
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'newVar' is not defined
>>> print(id(newVar)) #同样打印newVar内存地址,也会说变量未定义
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'newVar' is not defined
>>> var #而原var变量没受影响,还存在
13
>>> print(id(var))
94749604572864
在来做个实验,定义变量var赋值为1,在定义变量newVar等于var,然后删除newVar,试试看会出现什么现象:
>>> var=1
>>> newVar=var
>>> var
1
>>> newVar
1
>>> id(var)
94920930020672
>>> id(newVar)
94920930020672 #两个变量指向同一块内存哦
>>> del newVar #删除newVar
>>> var #var的值还在,说明del没有删除内存中的数值
1
>>> newVar #看见了什么?说明del仅仅是删除了代码中指向那个变量的引用
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'newVar' is not defined
>>>
由此得出一个结论,定义变量存的不是值,而是针对那块内存变量的引用,也就是类似C语言中说的指针。这个时候应该彻底明白Python的变量了吧?
总结一下,Python的变量就是程序中对存值内存地址的标记,可以是多个变量同时指向一块内存,可以任意删除变量,不会影响其他指向这块内存的变量,只有在代码中再也没有变量保存对值的引用时,该内存才会被Python解释器回收。del语句可以同时删除变量引用,语法格式如下:
del var1[,var2[,var3[....,varN]]]
比如:
del var
del var, newVar
3.1.2Python支持三种不同的数值类型
整型(int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。布尔(bool)是整型的子类型。
浮点型(float) - 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)
复数( (complex)) - 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。
我们可以使用十六进制和八进制来代表整数:
>>> num=0xAEE #16进制
>>> num
2798
>>> num=0o765 #8进制
>>> num
501
>>>
表3-1 数值表
int |
float |
complex |
1 |
3.0 |
6.14j |
10 |
25.20 |
55.j |
-786 |
-616.9 |
5.322e-44j |
08 |
62.5e+18 |
.567j |
-090 |
-90.0 |
-.8545+9J |
-0x60 |
-132.54e100 |
13e+6J |
0x91 |
74.2E-12 |
8.53e-9j |
Python支持复数,复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。
3.1.3Python数值类型之间的转换
在写程序过程中,变量之间数值类型转换是不可避免的,Python内置了以下这些函数方便我们做数值之间的转换。
1、int(x) 将x转换为一个整数。
2、float(x) 将x转换到一个浮点数。
3、complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。
complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数值表达式。
以下实例将浮点数变量var转换为整数:
>>> var=1.35
>>> int(var)
1
>>> complex(var)
(1.35+0j)
3.1.4 Python数值运算
Python解释器可以作为一个简单的计算器,我们可以直接在解释器里输入一个数学表达式,它会自动输出表达式的计算接过。
表达式的语法很简单,就是我么日常的数学里面的常规运算,不过在计算机里面,我们用*表示乘号、/表示除号、%表示取余: +、-、* 、 /、%,还有个数学符号幂,在Python里面我们用**符号表示,比如23,在代码中我们写成2**3,5610写成56**10。代码:
>>> 14+3
17
>>> 100-3*21
37
>>> (100-23*7)/3
-20.333333333333332
>>> 37/6
6.166666666666667
>>> 9/3
3.0
>>> 3*4
12
>>> 77%5
2
>>> 2**3 #23
8
>>> 2**24 #224
16777216
>>> 56**10 5610
303305489096114176
说明一下,在不同的机器上浮点运算的结果可能会不一样,两个整数相除得到的结果会以浮点数形式出现,但是相乘则不自动转换成浮点数,这个机制在写代码过程中涉及到除法的一定要注意。
在整数除法中,除法/总是返回一个浮点数,如果只想得到整数的结果,丢弃可能的分数部分,Python提供了运算符//,//计算的结果并不一定以整数类型的数形式出现,它与分母分子的数据类型有关系:
>>> 29/4 #除法是小数
7.25
>>> 29//4 #如果参与计算的是整数,计算结果就是整数
7
>>> 29.0/4
7.25
>>> 29.0//4 #参数计算的有浮点数返回就是浮点数
7.0
>>> 29%4 #注意//符和%符的区别
1
还有个和我们直观语义不一致的符号: =,在数学教科书中,这个号两个作用,一个赋值,一个判断是否相等,在计算机世界内,=号就表示一个意义:赋值,判断两个数值是不是相等的语义用:==来处理。注意在交互环境中,=赋值之后,除了下一个提示符,解释器不会显示任何结果,比如我们前面定义的好几个变量等于数值的例子,看代码,计算直角三角形的面积:
>>> leg1=23 #直角边1
>>> leg2=12 #直角边2
>>> s=leg1*leg2/2 #计算面积
>>> s #显示面积
138.0
Python的变量也是先"定义"(即赋予变量一个值)后使用,否则会出现错误,比如在代码或者命令行中,没有预先给leg1和leg2赋值,那么在计算面积过程中就会报错:
>>> s=leg1*leg2/2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'leg1' is not defined
Python中,如果表达式中有不同类型的数混合运算时,会自动将整数转换为浮点数:
>>> 5*5.67/2.3
12.32608695652174
>>> 7*2.34
16.38
在Python中一个特殊变量:_,用于在交互模式中,存放最后一个表达式的计算结果,这里要注意,表达式计算结果赋给变量的,计算不会被保存在_中,只有直接在交互模式做的计算才会被保存,_变量和普通变量一样也可以被赋值,_变量被赋值之后,就不会在保存最后一次表达式的结算结果,但这么做会其他人带来歧义,所以建议,非必须场景必要给_变量赋值,看代码,还是计算三角形的面积:
>>> 34*5 #表达式会有计算结果,会被保存到_变量
170
>>> _
170
>>> leg1=2 #赋值不会被保存到_变量
>>> _
170
>>> leg2=23
>>> _
170
>>> s=leg1*leg2/2 #计算结果赋给另一个变量的也不会保存到_变量
>>> _
170
>>> s #s是表达式,本行没有赋给其他变量的操作,赋给_变量
23.0
>>> _
23.0
>>> _=3434 #给_变量赋值
>>> _
3434
>>> s #_变量的值就不会保存最后表达式是的计算结果了
23.0
>>> _
3434
>>> 34*5 #_变量的值就不会保存最后表达式是的计算结果了
170
>>> _
3434
3.1.5 数学函数
学到这里估计,疑问就来了,我们数学中常用的函数Python有没有提供呢?有,有些是直接封装了,有些数学函数是通过math模块给我们,下表列出了一下,使用这些函数之前,有些函数要引入math模块:
表3-2 数学函数表
函数 |
返回值 ( 描述 ) |
返回数值的绝对值,如abs(-10) 返回 10 |
|
返回数值的上入整数,如math.ceil(4.1) 返回 5 |
|
返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045 |
|
返回数值的绝对值,如math.fabs(-10) 返回10.0 |
|
返回数值的下舍整数,如math.floor(4.9)返回 4 |
|
如math.log(math.e)返回1.0,math.log(100,10)返回2.0 |
|
返回以10为基数的x的对数,如math.log10(100)返回 2.0 |
|
返回给定参数的最大值,参数可以为序列。 |
|
返回给定参数的最小值,参数可以为序列。 |
|
返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。math.modf(1,25),返回的是:(0.25, 1.0) |
|
x**y 运算后的值。pow(2,4)返回是16,pow(5,6)为15625 |
|
返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。round(1.25)返回1,round(1.25)返回1.2,round(1.251,1)返回1.3,做计算的时候要特别注意0.5的情况,本质上这个函数的意义是:保留值将保留到离上一位更近的一端。round(1.2500001,1)返回1.3 |
|
返回数值x的平方根。math.sqrt(45)返回6.7082039324993 |
3.1.6 随机数函数
随机数经常用于数学、游戏NPC的随机刷新、密码加密等领域中,还经常被嵌入到算法中,用以提高算法效率和程序的安全性。Python包含以下常用随机数函数,随机数函数Python封装在random模块中,使用时需先引入random模块:
表3-3 随机函数表
函数 |
描述 |
从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。 |
|
从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1,random.randrange(100)返回63,random.randrange(80,100,2)返回96 |
|
随机生成下一个实数,它在[0,1)范围内。random.random()返回0.104969 |
|
改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。 |
|
randint(a,b) |
在a,b范围内随机返回一个整数,random.randint(80,100)返回85 |
将序列的所有元素随机排序 |
|
随机生成下一个实数,它在[x,y]范围内。 |
看演示代码:
>>> import random
>>> random.random()
0.10496928253728277
>>> random.randint(1,100)
51
>>> random.randint(80,100)
82
>>> random.randrange(100)
52
>>> random.randrange(80,100,2)
92
>>> random.randrange(80,100,2)
82
>>> random.uniform(2,50)
12.80581013913698
>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> random.shuffle(a)
>>> a
[8, 3, 5, 4, 6, 7, 10, 2, 9, 1]
>>> a=[1,2,3,4,5,6,7,8,9,10]
>>> random.shuffle(a)
>>> a
[2, 7, 1, 4, 9, 3, 6, 5, 10, 8]
>>> random.choice(a)
10
>>> random.choice(a)
3
3.1.7 三角函数及数学常量
Python包括以下三角函数,这些函数Python在math中提供,使用之前要先引入math模块:
表3-4 三角函数及数学常量
函数 |
描述 |
返回x的反余弦弧度值。 |
|
返回x的反正弦弧度值。 |
|
返回x的反正切弧度值。 |
|
返回给定的 X 及 Y 坐标值的反正切值。 |
|
返回x的弧度的余弦值。 |
|
返回欧几里德范数 sqrt(x*x + y*y)。 |
|
返回的x弧度的正弦值。 |
|
返回x弧度的正切值。 |
|
将弧度转换为角度,如degrees(math.pi/2) , 返回90.0 |
|
将角度转换为弧度 |
|
pi |
数学常量 pi(圆周率,一般以π来表示) |
e |
数学常量 e,e即自然常数(自然常数)。 |
看演示代码:
>>> import math
>>> math.degrees(math.pi/2) #
90.0
>>> math.degrees(math.pi/3) #
59.99999999999999
>>> math.degrees(math.pi/4) #
45.0
>>> math.degrees(math.pi) #
180.0
>>> math.acos(0) #
1.5707963267948966
>>> math.degrees(math.acos(0))
90.0
>>> math.degrees(math.acos(1))
0.0
>>> math.degrees(math.acos(-1)) #
180.0
>>> math.degrees(math.acos(0.5)) #
60.00000000000001
>>> math.degrees(math.asin(0))
0.0
>>> math.degrees(math.asin(1))
90.0
>>> math.degrees(math.asin(0.5))
30.000000000000004
>>> math.degrees(math.asin(-0.5))
-30.000000000000004
>>> math.degrees(math.asin(-0.75))
-48.590377890729144
>>> math.degrees(math.atan(-0.75))
-36.86989764584402
>>> math.degrees(math.atan(0))
0.0
>>> math.degrees(math.atan(131432434324234))
89.99999999999957
>>> math.degrees(math.atan2(1,1))
45.0
>>> math.degrees(math.atan2(2,1))
63.43494882292201
>>> math.cos(math.degrees(0))
1.0
>>> math.cos(math.pi)
-1.0
>>> math.cos(math.pi/2)
6.123233995736766e-17
>>> math.cos(math.pi/3)
0.5000000000000001
>>> math.cos(math.pi/6)
0.8660254037844387
>>> math.tan(math.pi/6)
0.5773502691896257
>>> math.tan(math.pi/3)
1.7320508075688767
>>> math.tan(math.pi/2)
1.633123935319537e+16
>>> math.tan(math.pi/4)
0.9999999999999999
>>> math.radians(90)
1.5707963267948966
>>> math.radians(45)
0.7853981633974483
>>> math.radians(30)
0.5235987755982988
>>> math.radians(180)
3.141592653589793
3.2 Python字符串
字符串是Python中最常用的数据类型。我们使用引号' '或" "来创建字符串。定义一个字符串变量也很简单,只要为变量分配一个值使用' '或" "包裹的值即可,例如:
>>> varStr='hello Python'
>>> varStr2="Life is short, You need Python"
>>> varStr3='你好Python'
>>> varStr4="生命苦短,你需要Python"
3.2.1 如何访问字符串中的值
Python 不支持单字符类型,单字符在Python中也是作为一个字符串使用。
Python 访问子字符串,可以使用方括号 [] 来截取字符串,字符串的截取的语法格式如下,使用方法件图3-1和图3-2:
- 变量[头下标:尾下标]
- 索引值以 0 为开始值,-1 为从末尾的开始位置。
图3-1 字符串索引及位置
图3-2 字符索引操作
看代码:
>>> varStr4="生命苦短,你需要Python"
>>> varStr[1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'varStr' is not defined
>>> varStr4[1]
'命'
>>> varStr4[1:4]]
File "<stdin>", line 1
varStr4[1:4]]
^
SyntaxError: unmatched ']'
>>> varStr4[1:4]
'命苦短'
>>> varStr4[:]
'生命苦短,你需要Python'
>>>
KeyboardInterrupt
>>>
KeyboardInterrupt
>>> varStr4[0:]
'生命苦短,你需要Python'
>>> varStr4[:14]
'生命苦短,你需要Python'
>>> varStr4[:3]
'生命苦'
>>> varStr4[0:6]
'生命苦短,你'
>>> varStr4[5:12]
'你需要Pyth'
>>> varStr4[5:-3]
'你需要Pyt'
>>> varStr4[4:-3]
',你需要Pyt'
>>> varStr4[-7:-3]
'要Pyt'
>>> varStr4[-7:-2]
'要Pyth'
>>> varStr4[-14:-2]
'生命苦短,你需要Pyth'
>>> varStr4[-14:]
'生命苦短,你需要Python'
>>> varStr4[:-5]
'生命苦短,你需要P'
>>> varStr4[5:]
'你需要Python'
>>> varStr4[:-14]
''
>>> varStr4[-7:]
'要Python'
3.2.2 字符串基本操作
可以截取字符串的一部分并与其他字段拼接,拼接的操作符是+号,看代码:
>>> str1="中华人民共和国"
>>> str2="台湾省"
>>> str1[1]
'华'
>>> str1[0]+str1[-1]+str2
'中国台湾省'
>>> str1[:]+str2[:]
'中华人民共和国台湾省'
3.2.3 Python转义字符
在需要在字符中使用特殊字符时,python 用反斜杠 \ 转义字符。如下表:
表3-5 转义符表
转义字符 |
描述 |
实例 |
\(在行尾时) |
续行符 |
>>> print("中华人民共和国\ ... 台湾省\ ... 台北市") 中华人民共和国台湾省台北市 |
\\ |
反斜杠符号 |
>>> print("中华人民共和国\\\ ... 台湾省\\\ ... 台北市") 中华人民共和国\台湾省\台北市 |
\' |
单引号 |
>>> print("中华人民共和国\'\ ... 台湾省\'\ ... 台北市") 中华人民共和国'台湾省'台北市 |
\" |
双引号 |
>>> print("中华人民共和国\"\ ... 台湾省\"\ ... 台北市") 中华人民共和国"台湾省"台北市 |
\a |
响铃 |
>>> print("\a") 执行后电脑有响声。 |
\b |
退格(Backspace) |
>>> print("中华人民共和国 \b台湾省 \b台北市") 中华人民共和国台湾省台北市! |
\000 |
空 |
>>> print("\000") >>> |
\n |
换行 |
>>> print("\n")
>>> |
\v |
纵向制表符 |
>>> print("中华人民共和国\v台湾省\v台北市") 中华人民共和国 台湾省 台北市 |
\t |
横向制表符 |
>>> print("中华人民共和国\t台湾省\t台北市") 中华人民共和国 台湾省 台北市 |
\r |
回车,将 \r 后面的内容移到字符串开头,并逐一替换开头部分的字符,直至将 \r 后面的内容完全替换完成。 |
>>> print("这里的字符替换台湾省台北市\r中华人民共和国") 中华人民共和国台湾省台北市 |
\f |
换页 |
>>> print("中华人民共和国 \f 台湾省 \f 台北市!") 中华人民共和国 台湾省 台北市!
|
\yyy |
八进制数,y 代表 0~7 的字符,例如:\012 代表换行。 |
>>> print("\110\145\154\154\157\40\127\157\162\154\144\41") Hello World! |
\xyy |
十六进制数,以 \x 开头,y 代表的字符,例如:\x0a 代表换行 |
>>>print("\x48\x65\x6c\x6c\x6f\x20\x57\x6f\x72\x6c\x64\x21") Hello World! |
\other |
其它的字符以普通格式输出 |
|
3.2.4 Python字符串运算符
表3-6详细介绍了字符串的运算符,在示例代码中我们定义了两个变量:str1="中华人民共和国",str2变量值为"台湾省":
表3-6 字符串运算符
操作符 |
描述 |
实例 |
+ |
字符串连接 |
str1+str2输出结果: 中华人民共和国台湾省 |
* |
重复输出字符串 |
str1*2 输出结果: 中华人民共和国中华人民共和国 |
[] |
通过索引获取字符串中字符 |
str1[2] 输出结果 ”人” |
[ : ] |
截取字符串中的一部分,遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的。 |
str1[1:4] 输出结果 : ”华人民共” |
in |
成员运算符 - 如果字符串中包含给定的字符返回 True |
>>> print('人' in '中华人民共和国') True |
not in |
成员运算符 - 如果字符串中不包含给定的字符返回 True |
>>> print('美' not in '中华人民共和国') True |
r/R |
原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。 |
>>> print( R'\n' ) \n >>> print( r'\n' ) \n >>> print(R"\c中华人民共和国 \f 台湾省 \f 台北市!") \c中华人民共和国 \f 台湾省 \f 台北市!
|
% |
格式字符串 |
请看下一节内容。 |
看代码:
>>> str1="中华人民共和国"
>>> str2="台湾省"
>>> str1+str2
'中华人民共和国台湾省'
>>> str1[2]
'人'
>>> str1[2:5]
'人民共'
>>> str1*2
'中华人民共和国中华人民共和国'
>>> print('美' not in str1)
True
>>> print('人' in str1)
True
>>> print( R'\n' )
\n
>>> print( r'\n' )
\n
>>> print(R"\c中华人民共和国 \f 台湾省 \f 台北市!")
\c中华人民共和国 \f 台湾省 \f 台北市!
3.2.5 字符串格式化
我们写程序的时候经常需要输出复杂的字符串,而且其中大部分的的数据都是动态变化的,使用前面学的简单打印方法已经无法应付这类情况,Python语言设计也考虑到了这种情况,提供了可以应对所有情况的格式化字符串的输出符号,尽管这样可能会产生非常复杂的表达式,其用法也是有迹可循,有规可守,其基本的用法就是在需要使用动态数据的字符串位置使用合适的格式化符号代替,本质上还是写字符串,无非就是把过去固定的字符改成了动态的格式符号而已,然后在按顺序传入合适的值,也就是将一个值插入到一个有字符串格式符%s 的字符串中。
在Python中,字符串格式化使用与C语言中sprintf 函数一样的语法。
表3-7 python字符串格式化符号
格式符 |
描述 |
%s |
字符串 (采用str()的显示) |
%r |
字符串 (采用repr()的显示) |
%c |
单个字符及其ASCII码 |
%u |
整数(无符号) |
%b |
二进制整数 |
%o |
八进制数(无符号) |
%d |
十进制整数 |
%i |
十进制整数 |
%x |
十六进制数(无符号) |
%X |
十六进制数大写(无符号) |
%e |
指数 (基底写为e),用科学计数法格式化浮点数 |
%E |
指数 (基底写为E),作用同%e |
%f |
浮点数,可指定小数点后的精度 |
%g |
%f和%e的简写,指数(e)或浮点数 (根据显示长度) |
%G |
%F和%E的简写,指数(E)或浮点数 (根据显示长度) |
%p |
用十六进制数格式化变量的地址 |
%% |
转义,字符"%" |
1、字符串输出(%s)
%10s——右对齐,占位符10位
%-10s——左对齐,占位符10位
%.2s——截取2位字符串
%10.2s——10位占位符,截取两位字符串
>>> print('%s' % 'hello world') # 结果:hello world
hello world
# 右对齐,取20位,不够则补位
>>> print('%20s' % 'hello world') # 结果: hello world
hello world
# 左对齐,取20位,不够则补位
>>> print('%-20s' % 'hello world') # 结果:hello world
hello world
# 取2位
>>> print('%.2s' % 'hello world') # 结果:he
he
# 右对齐,占位符10位,取2位
>>> print('%10.2s' % 'hello world') # 结果: he
he
# 左对齐,占位符10位,取2位
>>> print('%-10.2s' % 'hello world') # 结果:he
he
2、浮点数输出(%f)
%f ——保留小数点后面六位有效数字
%.3f,保留3位小数位
%e ——保留小数点后面六位有效数字,指数形式输出
%.3e,保留3位小数位,使用科学计数法
%g ——在保证六位有效数字的前提下,使用小数方式,否则使用科学计数法
%.3g,保留3位有效数字,使用小数或科学计数法
>>> print('%f' % 1.11) # 默认保留6位小数
1.110000
>>>
>>> print('%.1f' % 1.11) # 取1位小数
1.1
>>>
>>> print('%e' % 1.11) # 默认6位小数,用科学计数法
1.110000e+00
>>>
>>> print('%.3e' % 1.11) # 取3位小数,用科学计数法
1.110e+00
>>>
>>> print('%g' % 1111.1111) # 默认6位有效数字
1111.11
>>>
>>> print('%.7g' % 1111.1111) # 取7位有效数字
1111.111
>>>
>>> print('%.2g' % 1111.1111) # 取2位有效数字,自动转换为科学计数法
1.1e+03
- 格式化操作符辅助指令:
表3-8 格式化操作符辅助指令
符号 |
功能 |
* |
定义宽度或者小数点精度 |
- |
用做左对齐 |
+ |
在正数前面显示加号( + ) |
<sp> |
在正数前面显示空格 |
# |
在八进制数前面显示零('0'),在十六进制前面显示'0x'或者'0X'(取决于用的是'x'还是'X') |
0 |
显示的数字前面填充'0'而不是默认的空格 |
% |
'%%'输出一个单一的'%' |
(var) |
映射变量(字典参数) |
m.n. |
m 是显示的最小总宽度,n 是小数点后的位数(如果可用的话) |
Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。
4、format的使用
A、按位置匹配
- 不带参数,即{}
- 带数字参数,可调换顺序,即{1}、{2}
- 带关键字,即{a}、{to}
>>> print('{} {}'.format('hello','world')) # 不带参数
hello world
>>> print('{0} {1}'.format('hello','world')) # 带数字参数
hello world
>>> print('{0} {1} {0}'.format('hello','world')) # 参数顺序倒乱
hello world hello
>>> print('{a} {tom} {a}'.format(tom='hello',a='world')) # 带关键字参数
world hello world
>>> coord = (3, 5)
>>> print('X: {0[0]}; Y: {0[1]}'.format(coord)) # 通过索引
X: 3; Y: 5
>>> a = {'a': 'test_a', 'b': 'test_b'} # 通过key键参数
>>> print('X: {0[a]}; Y: {0[b]}'.format(a)) # 结果:'X: test_a; Y: test_b'
X: test_a; Y: test_b
- 格式转换
表3-9 格式转换符号
符号 |
描述 |
'b' |
二进制。将数字以2为基数进行输出 |
'c' |
字符。在打印之前将整数转换成对应的Unicode字符串 |
'd' |
十进制整数。将数字以10为基数进行输出 |
'o' |
八进制。将数字以8为基数进行输出 |
'x' |
十六进制。将数字以16为基数进行输出,9以上的位数用小写字母 |
'e' |
幂符号。用科学计数法打印数字。用'e'表示幂 |
'g' |
一般格式。将数值以fixed-point格式输出。当数值特别大的时候,用幂形式打印 |
'n' |
数字。当值为整数时和'd'相同,值为浮点数时和'g'相同。不同的是它会根据区域设置插入数字分隔符 |
'%' |
百分数。将数值乘以100然后以fixed-point('f')格式打印,值后面会有一个百分号 |
看代码:
>>> print('{0:b}'.format(3)) # 结果:11
11
>>> print('{:c}'.format(20)) # 结果:�
�
>>> print('{:d}'.format(20)) # 结果:20
20
>>> print('{:o}'.format(20)) # 结果:24
24
>>> print('{:x}'.format(20)) # 结果:14
14
>>> print('{:e}'.format(20)) # 结果:2.000000e+01
2.000000e+01
>>> print('{:g}'.format(20.1)) # 结果:20.1
20.1
>>> print('{:f}'.format(20)) # 结果:20.000000
20.000000
>>> print('{:n}'.format(20)) # 结果:20
20
>>> print('{:%}'.format(20)) # 结果:2000.000000%
2000.000000%
C、高阶用法-进制转换
>>> print("int: {0:d}; hex: {0:x}; oct: {0:o}; bin: {0:b}".format(42))
int: 42; hex: 2a; oct: 52; bin: 101010
>>> print("int: {0:d}; hex: {0:#x}; oct: {0:#o}; bin: {0:#b}".format(42))# 在前面加“#”,则带进制前缀
int: 42; hex: 0x2a; oct: 0o52; bin: 0b101010
D、高阶用法-左中右对齐及位数补全
表3-10 对齐符号
符号 |
描述 |
< |
左对齐(默认) |
> |
右对齐 |
^ |
居中对齐 |
= |
在小数点后进行补齐(只用于数字) |
E、 取位数 “{:4s}”、"{:.2f}"等
# 默认左对齐
>>> print('{} and {}'.format('hello','world'))
hello and world
# 取10位左对齐,取10位右对齐
>>> print('{:10s} and {:>10s}'.format('hello','world'))
hello and world
# 取10位中间对齐
>>> print('{:^10s} and {:^10s}'.format('hello','world'))
hello and world
>>>
# 取2位小数
>>> print('{} is {:.2f}'.format(1.123,1.123))
1.123 is 1.12
# 取2位小数,右对齐,取10位
>>> print('{0} is {0:>10.2f}'.format(1.123))
1.123 is 1.12
>>>
# 左对齐
>>> print('{:<30}'.format('left aligned')) '
left aligned
# 右对齐
>>> print('{:>30}'.format('right aligned')) # 结果:' right aligned'
right aligned
# 中间对齐
>>> print('{:^30}'.format('centered')) # 结果:' centered '
centered
# 使用“*”填充
>>> print('{:*^30}'.format('centered'))
***********centered***********
# 还有“=”只能应用于数字,这种方法可用“>”代替
>>> print('{:0=30}'.format(11)) # '000000000000000000000000000011'
000000000000000000000000000011
>>> print('{:0>30}'.format(11)) # '000000000000000000000000000011'
000000000000000000000000000011
>>> print('{:0<30}'.format(11)) # '110000000000000000000000000000'
110000000000000000000000000000
F、高阶用法-正负符号显示
正负符号显示 %+f, %-f, 和 % f的用法
>>> # 总是显示符号
>>> print('{:+f}; {:+f}'.format(3.14, -3.14)) # '+3.140000; -3.140000'
+3.140000; -3.140000
>>> # 若是+数,则在前面留空格
>>> print('{: f}; {: f}'.format(3.14, -3.14)) # ' 3.140000; -3.140000'
3.140000; -3.140000
>>> # -数时显示-,与'{:f}; {:f}'一致
>>> print('{:-f}; {:-f}'.format(3.14, -3.14)) # '3.140000; -3.140000'
3.140000; -3.140000
G、高阶用法-百分数%
>>> points = 19
>>> total = 22
>>> print('Correct answers: {:.2%}'.format(points/total)) # 'Correct answers: 86.36%'
Correct answers: 86.36%
H、高阶用法-逗号作为千位分隔符,金额表示
>>> print('{:,}'.format(1234567890)) # '1,234,567,890'
1,234,567,890
I、format变形用法
在字符串前加f以达到格式化的目的,在{}里加入对象,此为format的另一种形式
>>> name = 'jack'
>>> age = 18
>>> sex = 'man'
>>> job = "IT"
>>> salary = 9999.99
>>> print(f'my name is {name.capitalize()}.') # my name is Jack.
my name is Jack.
>>> print(f'I am {age:*^10} years old.') # I am ****18**** years old.
I am ****18**** years old.
>>> print(f'I am a {sex}') # I am a man
I am a man
>>> print(f'My salary is {salary:10.3f}') # My salary is 9999.990
My salary is 9999.990
3.2.6 Python三引号
python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。看如下代码:
>>> varStr="""从2000多年前的华夏文明穿越而至,
... “一带一路”犹如重生的翅膀,以中国为原点,
... 沿着古老大陆和大洋铺展开来。
... 在这条和平、繁荣、开放、创新、文明之路上,
... 伟大的思想推动伟大的实践,
... 让昔日“流淌着牛奶与蜂蜜的地方”焕发出新的活力。
... 来自东方的思想力量,实实在在地在改变世界。
... """
>>> print(varStr)
从2000多年前的华夏文明穿越而至,
“一带一路”犹如重生的翅膀,以中国为原点,
沿着古老大陆和大洋铺展开来。
在这条和平、繁荣、开放、创新、文明之路上,
伟大的思想推动伟大的实践,
让昔日“流淌着牛奶与蜂蜜的地方”焕发出新的活力。
来自东方的思想力量,实实在在地在改变世界。
三引号让程序员从引号和特殊字符串的泥潭里面解脱出来,自始至终保持一小块字符串的格式是所谓的WYSIWYG(所见即所得)格式的。
一个典型的用例是,当你需要一块HTML或者SQL时,这时用字符串组合,特殊字符串转义将会非常的繁琐。
errHTML = ''' <HTML>
<HEAD>
<TITLE> Friends CGI Demo</TITLE>
</HEAD>
<BODY>
<H3>ERROR</H3>
<B>%s</B>
<P>
<FORM>
<INPUT TYPE=button VALUE=Back ONCLICK="window.history.back()">
</FORM>
</BODY>
</HTML> '''
cursor.execute('''
CREATE TABLE users (
login VARCHAR(8),
uid INTEGER,
prid INTEGER) '''
)
3.2.7 f-string
f-string是python3.6之后版本添加的,称之为字面量格式化字符串,是新的格式化字符串的语法。
之前我们习惯用百分号 (%):
>>> varStr="台湾省"
>>> '中华人民共和国%s的首府是台北市'%varStr
'中华人民共和国台湾省的首府是台北市'
f-string 格式化字符串以 f 开头,后面跟着字符串,字符串中的表达式用大括号{}包起来,它会将变量或表达式计算后的值替换进去,看代码:
>>> varStr="台湾省"
>>> f'中华人民共和国{varStr}的首府是台北市'
'中华人民共和国台湾省的首府是台北市'
>>> f'{23/4}'
'5.75'
>>> province={'name':'台湾省','center':'台北市'}
>>> f'中华人民共和国{province["name"]}的首府是{province["center"]}'
'中华人民共和国台湾省的首府是台北市'
>>>
用了这种方式明显更简单了,不用再去判断使用 %s,还是 %d。
在Python3.8 的版本中可以使用 = 符号来拼接运算表达式与结果,看代码:
>>> x = 1
>>> print(f'{x+1}') #Python3.6
2
>>> x = 1
>>> print(f'{x+1=}') #Python3.8
x+1=2
3.2.8 关于Unicode
在Python2中,普通字符串是以8位ASCII码进行存储的,而Unicode字符串则存储为16位unicode字符串,这样能够表示更多的字符集。使用的语法是在字符串前面加上前缀 u。
在Python3中,所有的字符串都是Unicode字符串。
3.2.9 Python的字符串内建函数
表3-11 Python 的字符串常用内建函数
序号 |
方法及描述 |
1 |
capitalize() |
2 |
返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。 |
3 |
count(str, beg= 0,end=len(string))
|
4 |
bytes.decode(encoding="utf-8", errors="strict")
|
5 |
encode(encoding='UTF-8',errors='strict')
|
6 |
endswith(suffix, beg=0, end=len(string)) |
7 |
|
8 |
find(str, beg=0, end=len(string))
|
9 |
index(str, beg=0, end=len(string))
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
rfind(str, beg=0,end=len(string))
|
28 |
rindex( str, beg=0, end=len(string))
|
29 |
|
30 |
|
31 |
split(str="", num=string.count(str))
|
32 |
|
33 |
startswith(substr, beg=0,end=len(string))
|
34 |
|
35 |
|
36 |
|
37 |
translate(table, deletechars="")
|
38 |
|
39 |
|
40 |
|
0 条 查看最新 评论
没有评论