python 内置方法赋值_Python内置数据结构之字符串str
1. 數據結構回顧
所有標準序列操作(索引、切片、乘法、成員資格檢查、長度、最小值和最大值)都適用于字符串,但是字符串是不可變序列,因此所有的元素賦值和切片賦值都是非法的。
>>> website = 'http://www.python.org'
>>> website[-3:] = 'com'Traceback (most recent call last):
File"", line 1, in?
website[-3:] = 'com'TypeError: object doesn't support slice assignment
View Code
通過名稱來訪問其各個值的數據結構。這種數據結構稱為映射(mapping) 。字典是Python中唯一的內置映射類型,其中的值不按順序排列,而是(值)存儲在鍵下。鍵可能是數、字符串或元組。
2. 字符串
print ( "hello,world!")? ??"hello,world!" 是字符串,字符串在幾乎所有真實可用的Python程序中都會存在,并且有多種用法,其中最主要的用法就是表示一些文本。字符串是值,就像數字一樣。str,repr和反引號是將Python值轉換成 字符串的3種方法。
2.1 字符串基礎
a.單引號字符串和轉義引號
>>> 'let's go'? ? ? ? ? # 后面的黑色字體部分Python無法識別
SyntaxError: invalid syntax
>>> 'let\'s go'? ? ? ? ? # 在常規字符串中,反斜杠扮演著特殊角色:它對字符進行轉義,讓你能夠在字符串中包含原本無法包含的字符。? ?反斜線(\),可以換行。
"let's go"
>>> "let's go!"? ? ? ? ?# 用""對'加以區分
"let's go!"
b.拼接字符串
>>> "let's say:" '"hello,world!"'
'let\'s say:"hello,world!"'
>>> 'hello,' + 'world!'
'hello,world!'
可以使用 + 操作符來連接 (粘在一起); 使用 * 操作符重復
>>> word = 'help ' + 'me! '
>>> word
'help me! '
>>> ''
''
>>>
注意:
兩個靠著一起的字符串會自動的連接; 上面例子的第一行也可以寫成 word = 'Help' 'A'; 這只能用于兩個字符串常量, 而不能用于任意字符串表達式。
c.字符串表示,str和repr
Python打印值的時候會保持值在代碼中的狀態,而不是你希望用戶看到的狀態,通過使用print,結果將不同。
>>> "Hello, world!"
'Hello, world!'
>>> print("Hello, world!")
Hello, world!
如果再加上表示換行符的編碼\n,差別將更明顯。
>>> 'hello,\nworld!'
'hello,\nworld!'
>>> print('hello,\nworld!')
hello,
world!
>>>
str,repr和反引號是將Python值轉換成 字符串的3種方法。
通常會獲得值的合法Python表達式表示。則意味著產生一個解釋器易讀的表達形式 (或者如果沒有這樣的語法會給出?SyntaxError?).
str()?函數 ,(實際是類,工廠函數;str和int、long一樣,是一種類型。repr僅僅是函數)
使用str能以合理的方式將值轉換為用戶能夠看懂的字符串。例如,盡可能將特殊字符編碼轉換為相應的字符。
對于那些沒有特殊表達的對象,?str()?將會與?repr()?返回相同的值. 很多的值, 如數字或一些如列表和字典那樣的結構, 使用這兩個函數的結果完全一致. 字符串與浮點型則有兩種不同的表達。
repr和反引號則把結果字符串轉換為合法的Python表達式。
d.長字符串,原始字符串和Unicode
有一些獨特而有用的字符串表示方式。例如,有一種獨特的語法可用于表示包含換行符或反斜杠的字符串(長字符串和原始字符串)。對于包含特殊符號的字符串,
Python 2還提供了一種專用的表示語法,結果為Unicode字符串。這種語法現在依然管用,但是多余,因為在Python 3中,所有的字符串都是Unicode字符串。 Python 3還引入了一種新語法,用于表示大致相當于老式字符串的字節對象。在處理Unicode編碼方面,這種對象依然扮演著重要的角色。
請注意,指定原始字符串時,可使用單引號或雙引號將其括起,還可使用三引號將其括起。
i. 長字符串
字符串可以使用一對匹配的三引號對包圍: """ 或 '''。當使用三引號時, 回車不需要被舍棄, 他們會包含在字符串里。
>>> print('''This is a very long string. It continues here.
And it's not over yet. "Hello, world!"
Still here.''')
This is a very long string. It continues here.
And it's not over yet. "Hello, world!"
Still here.
>>>
ii. 原始字符串
原始字符串不以特殊方式處理反斜線。
>>> path = 'C:\nowhere'
>>> path
'C:\nowhere'
>>> print(path)? ? ? ? ? ? ? ? ? ? ?# 打印出問題
C:
owhere
>>> print('C:\\nowhere')? ? ? ?#對反斜杠本身進行轉義。
C:\nowhere
>>>
對于很長的路徑,將需要使用大量的反斜杠。
在這樣的情況下,原始字符串可派上用場,因為它們根本不會對反斜杠做特殊處理,而是讓字符串包含的每個字符都保持原樣。
>>> print(r'C:\nowhere')
C:\nowhere
>>> print(r'C:\Program Files\fnord\foo\bar\baz\frozz\bozz')
C:\Program Files\fnord\foo\bar\baz\frozz\bozz
>>>
iii.? Unicode、 bytes和bytearray
Python字符串與二進制的關系
python 3中最重要的新特性可能就是將文本(text)和二進制數據做了更清晰的區分。文本總是用unicode進行編碼,以str類型表示;而二進制數據以bytes類型表示。
在python3中,不能以任何隱式方式將str和bytes類型二者混合使用。不可以將str和bytes類型進行拼接,不能在str中搜索bytes數據(反之亦然),也不能將str作為參數傳入需要bytes類型參數的函數(反之亦然)。
Unicode
大致而言,每個Unicode字符都用一個碼點(code point)表示,而碼點是Unicode標準給每個字符指定的數字。這讓你能夠以任何現代軟件都能識別的方式表示129個文字系統中的12萬個以上的字符。當然,鑒于計算機鍵盤不可能包含幾十萬個鍵,因此有一種指定Unicode字符的通用機制:使用16或32位的十六進制字面量(分別加上前綴\u或\U)或者使用字符的Unicode名稱(\N{name})。
>>> "\u00C6"
'?'
要獲悉字符的Unicode碼點和名稱,可在網上使用有關該字符的描述進行搜索,也可參閱特定的網站,如http://unicode-table.com。
Bytes
Unicode的理念很簡單,卻帶來了一些挑戰,其中之一是編碼問題。在內存和磁盤中,所有對象都是以二進制數字(0和1)表示的(這些數字每8個為一組,即1字節),字符串也不例外。在諸如C等編程語言中,這些字節完全暴露,而字符串不過是字節序列而已。為與C語言互操作以及將文本寫入文件或通過網絡套接字發送出去,Python提供了兩種類似的bytes類型:不可變的bytes和可變的bytearray。如果需要,可直接創建bytes對象(而不是字符串),方法是使用前綴b:
>>> b'Hello, world!'
b'Hello, world!
然而, 1字節只能表示256個不同的值,離Unicode標準的要求差很遠。 Python bytes字面量只支持ASCII標準中的128個字符,而余下的128個值必須用轉義序列表示,如\xf0表示十六進制值0xf0(即240)。? ?8位一個字節,一位是一個bite,8位最多表示255個符號。
唯一的差別好像在于可用的字母表規模,但實際上并非完全如此。乍一看,好像ASCII和Unicode定義的都是非負整數和字符之間的映射,但存在細微的差別: Unicode碼點是使用整數定義的,而ASCII字符是使用對應的數及其二進制編碼定義的。
這一點好像無關緊要,原因之一是整數0~255和8位二進制數之間的映射是固定的,幾乎沒有任何機動空間。問題是超過1字節后,情況就不那么簡單了:直接將每個碼點表示為相應的二進制數可能不再可行。這是因為不僅存在字節順序的問題(即便對整數值進行編碼,也會遇到這樣的問題),而且還可能浪費空間:如果對于每個碼點都使用相同數量的字節進行編碼,就必須考慮到文本可能包含安那托利亞象形文字或皇家亞蘭字母。有一種Unicode編碼標準是基于這種考慮的,它就是UTF-32(32位統一編碼轉換格式, Unicode Transformation Format 32 bits),但如果你主要處理的是使用互聯網上常見語言書寫的文本,那么使用這種編碼標準將很浪費空間。然而,有一種非常巧妙的替代方式:不使用全部32位,而是使用變長編碼,即對于不同的字符,使用不同數量的字節進行編碼。這種編碼方式主要出自計算機先鋒Kenneth Thompson之手。通過使用這種編碼,可節省占用的空間,就像摩爾斯碼使用較少的點和短線表示常見的字母,從而減少工作量一樣。具體地說,進行單字節編碼時,依然使用ASCII編碼,以便與較舊的系統兼容;但對于不在這個范圍內的字符,使用多個字節(最多為6個)進行編碼。
下面來使用ASCII、UTF-8、UTF-16和UTF-32編碼將字符串轉換為bytes。
>>> "Hello, world!".encode("ASCII")
b'Hello, world!'
>>> "Hello, world!".encode("UTF-8")
b'Hello, world!'
>>> "Hello, world!".encode("UTF-16")
b'\xff\xfeH\x00e\x00l\x00l\x00o\x00,\x00 \x00w\x00o\x00r\x00l\x00d\x00!\x00'
>>> "Hello, world!".encode("UTF-32")
b'\xff\xfe\x00\x00H\x00\x00\x00e\x00\x00\x00l\x00\x00\x00l\x00\x00\x00o\x00\x00\x00,\x00\x00\x00 \x00\x00\x00w\x00\x00\x00o\x00\x00\x00r\x00\x00\x00l\x00\x00\x00d\x00\x00\x00!\x00\x00\x00'
>>>
>>> len("How long is this?".encode("UTF-8"))17
>>> len("How long is this?".encode("UTF-16"))36
>>> len("How long is this?".encode("UTF-32"))72
>>>說明: 在所有情況下,都最好使用UTF-8。事實上,它也是默認使用的編碼。
View Code
幾乎在所有情況下,都最好使用UTF-8。它是默認使用的編碼。
.encode()可將字符串編碼為bytes,.decode()可將bytes解碼為字符串。
可不使用方法encode和decode,而直接創建bytes和str(即字符串)對象,這種方法更通用一些,在你不知道類似于字符串或bytes的對象屬于哪個類時,使用這種方法也更管用。一個通用規則是,不要做過于嚴格的假設。
>>> "H?ll?, w?rld!".encode()
b'H\xc3\xa6ll\xc3\xa5, w\xc3\xb8rld!'
>>> b'H\xc3\xa6ll\xc3\xa5, w\xc3\xb8rld!'.decode()'H?ll?, w?rld!'
>>> bytes("H?ll?, w?rld!", encoding="utf-8")
b'H\xc3\xa6ll\xc3\xa5, w\xc3\xb8rld!'
>>> str(b'H\xc3\xa6ll\xc3\xa5, w\xc3\xb8rld!', encoding="utf-8")'H?ll?, w?rld!'
>>>
View Code
>>> msg = "我愛北京天安門!"
>>> print(msg.encode(encoding = "utf-8"))
b'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x97\xa8\xef\xbc\x81'
>>> print(msg.encode(encoding = "utf-8").decode(encoding = "utf-8"))
我愛北京天安門!>>>
View Code
編碼和解碼的最重要用途之一是,將文本存儲到磁盤文件中。然而, Python提供的文件讀寫機制通常會替你完成這方面的工作!只要文件使用的是UTF-8編碼,就無需操心編碼和解碼的問題。但如果原本正常的文本變成了亂碼,就說明文件使用的可能是其他編碼。
最后, Python還提供了bytearray,它是bytes的可變版。從某種意義上說,它就像是可修改的字符串——常規字符串是不能修改的。然而, bytearray其實是為在幕后使用而設計的,因此作為類字符串使用時對用戶并不友好。例如,要替換其中的字符,必須將其指定為0~255的值。
因此,要插入字符,必須使用ord獲取其序數值(ordinal value)。
>>> x = bytearray(b"Hello!")
>>> x[1] = ord(b"u")
>>> x
bytearray(b'Hullo!')
>>>
2.2 字符串格式
字符串格式設置涉及的內容很多,基本思想是對字符串調用方法format,并提供要設置其格式的值。字符串包含有關如何設置格式的信息,而這些信息是使用一種微型格式指定語言(mini-language)指定的。每個值都被插入字符串中,以替換用花括號括起的替換字段。要在最終結果中包含花括號,可在格式字符串中使用兩個花括號(即{{或}})來指定。
Python提供了多種字符串格式設置方法。以前,主要的解決方案是使用字符串格式設置運算符——百分號。這個運算符的行為類似于C語言中的經典函數printf:在%左邊指定一個字符串(格式字符串),并在右邊指定要設置其格式的值。指定要設置其格式的值時,可使用單個值(如字符串或數字),可使用元組(如果要設置多個值的格式),還可使用字典,其中最常見的是元組。
%s稱為轉換說明符 ,指出了要將值插入什么地方。 s意味著將值視為字符串進行格式設置。如果指定的值不是字符串,將使用str將其轉換為字符串。其他說明符將導致其他形式的轉換。例如, %.3f將值的格式設置為包含3位小數的浮點數。
>>> a = "hello, %s. %s said!"
>>> b = ('world', 'he')
>>> a % b
'hello, world. he said!'
>>>
2.2.1 替換字段名
向format提供要設置其格式的未命名參數或參數指定名稱 ;
>>> "{i} {} {sleep} {}".format(1, 2, sleep=4, i=3)
'3 1 4 2'
通過索引來指定要在哪個字段中使用相應的未命名參數 ,可以不按順序使用未命名參數。
>>> "{i} {1} {sleep} {0}".format(1, 2, sleep=4, i=3)
'3 2 4 1'
訪問提供的值的組成部分
>>> fullname = ["alex", "Li"]
>>> 'Mr {name[0]}'.format(name=fullname)
'Mr alex'
>>>
使用索引,還可使用句點表示法來訪問導入的模塊中的方法、屬性、變量和函數(看起來很怪異的變量__name__包含指定模塊的名稱)。
>>> import math
>>> tmpl = "The {mod.__name__} module defines the value {mod.pi:f} for π"
>>> tmpl.format(mod = math)
'The math module defines the value 3.141593 for π'
>>>
2.2.2 轉化
(s、 r和a)指定分別使用str、 repr和ascii進行轉換。函數str通常創建外觀普通的字符串版本(這里沒有對輸入字符串做任何處理) 。函數repr嘗試創建給定值的Python表示(這里是一個字符串字面量)。函數ascii創建只包含ASCII字符的表示,類似于Python 2中的repr。
>>> print("{pi!s} {pi!r} {pi!a}".format(pi="π"))
π 'π' '\u03c0'
>>>
>>> "The number is {num:f}".format(num=42)
'The number is 42.000000'
字符串格式設置中的類型說明符
類型? 含 義
b? ? ? ?將整數表示為二進制數
c? ? ? ?將整數解讀為Unicode碼點
d? ? ? ?將整數視為十進制數進行處理,這是整數默認使用的說明符
e? ? ? ?使用科學表示法來表示小數(用e來表示指數)
E? ? ? ?與e相同,但使用E來表示指數
f? ? ? ??將小數表示為定點數
F? ? ? ?與f相同,但對于特殊值(nan和inf),使用大寫表示
g? ? ? ??自動在定點表示法和科學表示法之間做出選擇。這是默認用于小數的說明符,但在默認情況下至少有1位小數
G? ? ? ?與g相同,但使用大寫來表示指數和特殊值
n? ? ? ??與g相同,但插入隨區域而異的數字分隔符
o? ? ? ??將整數表示為八進制數
s? ? ? ??保持字符串的格式不變,這是默認用于字符串的說明符
x? ? ? ??將整數表示為十六進制數并使用小寫字母
X? ? ? ?與x相同,但使用大寫字母
%? ? ??將數表示為百分比值(乘以100,按說明符f設置格式,再在后面加上%)
2.2.3 寬度,精度,分隔符,對齊
寬度是使用整數指定的,如下所示:
>>> "{num:10}".format(num=3)
' 3'
>>> "{name:10}".format(name="Bob")
'Bob '
精度使用整數指定的,需要在它前面加上一個表示小數點的句點。
>>> "Pi day is {pi:.2f}".format(pi=pi)
'Pi day is 3.14'
使用逗號來指出你要添加千位分隔符。
>>> 'One googol is {:,}'.format(10**100)
'One googol is 10,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000,000'
在指定寬度和精度的數前面,可添加一個標志。這個標志可以是零、加號、減號或空格,其中零表示使用0來填充數字。
>>> '{:010.2f}'.format(pi)
'0000003.14'
要指定左對齊、右對齊和居中,可分別使用和^。
>>> from math importpi>>> print('{0:<10.2f}\n{0:^10.2f}\n{0:>10.2f}'.format(pi))3.14
3.14
3.14
>>>
View Code
可以使用填充字符來擴充對齊說明符,這樣將使用指定的字符而不是默認的空格來填充。
>>> "{:$^15}".format(" WIN BIG ")
'$$$ WIN BIG $$$'
還有更具體的說明符=,它指定將填充字符放在符號和數字之間。
>>> print('{0:10.2f}\n{1:10.2f}'.format(pi, -pi))3.14
-3.14
>>> print('{0:10.2f}\n{1:=10.2f}'.format(pi, -pi))3.14
- 3.14
>>>
View Code
字符串格式設置示例
width = int(input('Please enter width:'))
price_width= 7
#指定price符的字段寬度,默認以空格填充
item_width = width -price_width
header_fmt= '{{:^{}}}{{:>{}}}'.format(item_width, price_width)#要指定左對齊、右對齊和居中,可分別使用< >和^ 。
fmt = '{{:{}.2f}}'.format(item_width, price_width)#可以使用填充字符來擴充對齊說明符,這樣將使用指定的字符而不是默認的空格來填充。#"{:$^15}".format(" WIN BIG ") ——>$$$ WIN BIG $$$#.2f 將值(價格)的格式設置為包含2位小數的浮點數。
print('=' *width)print(header_fmt.format('Item', 'Price'))print('-' *width)print(fmt.format('Apples', 0.4))print(fmt.format('Pears', 0.5))print(fmt.format('Cantaloupes', 1.92))print(fmt.format('Dried Apricots (16 oz.)', 8))print(fmt.format('Prunes (4 lbs.)', 12))print('=' *width)
執行結果:
View Code
2.3 字符串基本操作
name = "my name is alex"
print(name.capitalize()) #首字母大寫
print(name.count("a")) #統計a的個數
print(name.center(50, "-")) #美觀打印,打印50個字符,不夠用-補上
print(name.encode(encoding="utf-16")) #使用utf-16將字符串轉化為bytes
print(name.endswith("ex")) #判斷一個字符串以什么結尾(判斷郵件地址是否以.com結尾)#name = "my \tname is alex"
print(name.expandtabs(tabsize=30)) #將 Tab鍵轉換成多少個空格
print(name.find("n")) #查找,字符串的索引
print(name[name.find("name"):]) #字符串可以切片,從name開始截斷
執行結果:
My nameisalex2
-----------------my name is alex------------------b'\xff\xfem\x00y\x00 \x00n\x00a\x00m\x00e\x00 \x00i\x00s\x00 \x00a\x00l\x00e\x00x\x00'True
my nameisalex3nameis alex
View Code
name = "my name is {name} and i am {years} old."
print(name.format(name='alex', years=23)) #格式化
——>my name is alex and i am 23old.print(name.format_map({'name': 'alex', 'years': 12})) #字典,格式化
——>my name is alex and i am 12old.#print(name.isalnum())
print('123Abc123'.isalnum()) #判斷是否為數字和字母
——>Trueprint('ABCas'.isalpha()) #判斷是否為字母
print('1237'.isdecimal()) #判斷是否為十進制
print('123'.isdigit()) #判斷是否為整數
print('As3adf'.isidentifier()) #判斷是否為一個合法的標識符(變量名)
print('13414'.isnumeric()) #判斷是否為一個數字
print('My Name is'.istitle()) #判斷是每個字符的首字母是否為大寫
——>Falseprint('MY NAME IS'.isupper()) #判斷是每個字符是否為大寫
——>Trueprint('+'.join(['1', '2', '3'])) #將列表轉化成字符串
——>1+2+3
print(name.ljust(50, '*')) #滿足長50,不夠在句尾用*補足
——>my name is {name} and i am {years} old.***********
print(name.rjust(50, '*')) #滿足長50,不夠在句首用*補足
——>***********my name is {name} andi am {years} old.
執行結果:(——>后為執行結果,沒有標注的全部為True)
my nameis alex and i am 23old.
my nameis alex and i am 12old.
True
True
True
True
True
True
False
True1+2+3my nameis {name} and i am {years} old.***********
***********my name is {name} and i am {years} old.
View Code
print("Djf".lower()) #將大寫字母變小寫
print("djf".upper()) #將小寫字母變大寫
print('------')print("\ndjf".lstrip()) #去左邊的空格和回車
print("DJF\n".rstrip()) #去右邊的空格和回車
print("DJF\n".strip()) #去兩邊的空格和回車
print('------')
p= str.maketrans("abcdef",'123456')print("alex li".translate(p)) #對應字母替換,密鑰
print('------')print("alex li".replace('l', 'L')) #對應字母替換
print("alex li".replace('l', 'L', 1)) #對應字母替換
print('------')print("alex li".rfind('l')) #從左向右,最后一個l的下標
print("al exli li".split('l')) #按照分隔符,將字符串分成列表
print('1+2+3+4'.split('+'))print('1+2\n+3+4'.splitlines()) #換行
print("Alex Li".swapcase()) #大小寫變換
print("alex li".title()) #首字母變大寫
View Code
總結
以上是生活随笔為你收集整理的python 内置方法赋值_Python内置数据结构之字符串str的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《原神》游戏设计分析
- 下一篇: python游戏设计毕业论文_游戏毕业设