1、如果字符串内部既包含'
又包含"
怎么办?可以用转义字符\
来标识,比如:
'I\'m \"OK\"!'
表示的字符串内容是:
I'm "OK"!
如果字符串内部有很多换行,用
\n
写在一行里不好阅读,为了简化,Python允许用'''...'''
的格式表示多行内容,可以自己试试:>>> print('''line1 ... line2 ... line3''') line1 line2 line3
上面是在交互式命令行内输入,注意在输入多行内容时,提示符由
>>>
变为...
,提示你可以接着上一行输入。如果写成程序,就是:print('''line1 line2 line3''')
理解变量在计算机内存中的表示也非常重要。当我们写:
a = 'ABC'
时,Python解释器干了两件事情:
在内存中创建了一个
'ABC'
的字符串;在内存中创建了一个名为
a
的变量,并把它指向'ABC'
。解释一下整数的除法为什么也是精确的。在Python中,有两种除法,一种除法是
/
:>>> 10 / 3 3.3333333333333335
/
除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数:>>> 9 / 3 3.0
还有一种除法是
//
,称为地板除,两个整数的除法仍然是整数:>>> 10 // 3 3
你没有看错,整数的地板除
//
永远是整数,即使除不尽。要做精确的除法,使用/
就可以。因为
//
除法只取结果的整数部分,所以Python还提供一个余数运算,可以得到两个整数相除的余数:>>> 10 % 3 1
无论整数做
//
除法还是取余数,结果永远是整数,所以,整数运算结果永远是精确的。单个字符的编码,Python提供了
ord()
函数获取字符的整数表示,chr()
函数把编码转换为对应的字符:>>> ord('A') 65 >>> ord('中') 20013 >>> chr(66) 'B' >>> chr(25991) '文'
如果知道字符的整数编码,还可以用十六进制这么写
str
:>>> '\u4e2d\u6587' '中文'
两种写法完全是等价的。
由于Python的字符串类型是
str
,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络上传输,或者保存到磁盘上,就需要把str
变为以字节为单位的bytes
。Python对
bytes
类型的数据用带b
前缀的单引号或双引号表示:x = b'ABC'
要注意区分
'ABC'
和b'ABC'
,前者是str
,后者虽然内容显示得和前者一样,但bytes
的每个字符都只占用一个字节。以Unicode表示的
str
通过encode()
方法可以编码为指定的bytes
,例如:>>> 'ABC'.encode('ascii') b'ABC' >>> '中文'.encode('utf-8') b'\xe4\xb8\xad\xe6\x96\x87' >>> '中文'.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
纯英文的
str
可以用ASCII
编码为bytes
,内容是一样的,含有中文的str
可以用UTF-8
编码为bytes
。含有中文的str
无法用ASCII
编码,因为中文编码的范围超过了ASCII
编码的范围,Python会报错。在
bytes
中,无法显示为ASCII字符的字节,用\x##
显示。反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是
bytes
。要把bytes
变为str
,就需要用decode()
方法:格式化整数和浮点数还可以指定是否补0和整数与小数的位数:
>>> '%2d-%02d' % (3, 1) ' 3-01' >>> '%.2f' % 3.1415926 '3.14'
如果你不太确定应该用什么,
%s
永远起作用,它会把任何数据类型转换为字符串:>>> 'Age: %s. Gender: %s' % (25, True) 'Age: 25. Gender: True'
有些时候,字符串里面的
%
是一个普通字符怎么办?这个时候就需要转义,用%%
来表示一个%
:>>> 'growth rate: %d %%' % 7 'growth rate: 7 %'