r
r"" 的作用是去除轉義字符.
即如果是“\n”那么表示一個反斜杠字符,一個字母n,而不是表示換行了。
以r開頭的字符,常用於正則表達式,對應着re模塊。
>>> str = 'hello\n'
>>> str_r = r'hello\n'
>>> print(str)
hello
>>> print(str_r)
hello\n
>>>
f
import time
t0 = time.time()
time.sleep(1)
name = 'processing'
# 以 f開頭表示在字符串內支持大括號內的python 表達式
print(f'{name} done in {time.time() - t0:.2f} s')
輸出:
processing done in 1.00 s
b
response = b'<h1>Hello World!</h1>' # b' ' 表示這是一個 bytes 對象
作用:b" "前綴表示:后面字符串是bytes 類型。
用處:
網絡編程中,服務器和瀏覽器只認bytes 類型數據。
如:send 函數的參數和 recv 函數的返回值都是 bytes 類型
附:
在 Python3 中,bytes 和 str 的互相轉換方式是
str.encode('utf-8')
bytes.decode('utf-8')
#后面有詳解
u
>>> str_cn = u'中文字符串'
>>> print(str_cn)
中文字符串
>>>
作用:后面字符串以 Unicode 格式 進行編碼,一般用在中文字符串前面,防止因為源碼儲存格式問題,導致再次使用時出現亂碼。
decode
decode解碼,在已知byte string字符串編碼的情況下,轉碼為Unicode String。例如下面,已知str是utf-8,轉成Unicode。(bytes轉成str)
new_str = str.decode('utf-8')
encode
在已為 unicode String 的情況下,轉碼為指定編碼的byte String。例如下面,str是Unicode String,通過encode 轉成utf-8。(str轉成bytes)
new_str = str.encode('utf-8')
如果還是不清楚,下面用一個報錯來詳細說明一下
某些報錯及其解決方法
ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)
在解決錯誤之前,首先要了解unicode和utf-8的區別。
unicode指的是萬國碼,是一種“字碼表”。而utf-8是這種字碼表儲存的編碼方法。
unicode不一定要由utf-8這種方式編成bytecode儲存,也可以使用utf-16,utf-7等其他方式。目前大多都以utf-8的方式來變成bytecode。
其次,Python中字符串類型分為byte string 和 unicode string兩種。
如果在python文件中指定編碼方式為utf-8(#coding=utf-8),那么所有帶中文的字符串都會被認為是utf-8編碼的byte string(例如:mystr="你好"),但是在函數中所產生的字符串則被認為是unicode string
問題就出在這邊,unicode string 和 byte string 是不可以混合使用的,一旦混合使用了,就會產生這樣的錯誤.
例如:
self.response.out.write("你好" + self.request.get("param"))
其中,"你好"被認為是byte string,而self.request.get("param")的返回值被認為是unicode string。由於預設的解碼器是ascii,所以就不能識別中文byte string。然后就報錯了。
以下有兩個解決方法:
1.將字符串全都轉成byte string。
self.response.out.write("你好"+self.request.get("param").encode("utf-8"))
2.將字符串全都轉成unicode string。
self.response.out.write(u"你好"+self.request.get("param"))
byte string轉換成unicode string可以這樣轉unicode(unicodestring, "utf-8")