1. 程式人生 > >python 基礎:字串詳解

python 基礎:字串詳解

import os
import linecache
import string

"""
python 基礎之資料型別學習筆記
主要內容如下:
字串的引用的解釋,修改,拼接,刪除,子串的查詢,分割,切片

"""
#字串
#字串在python 中是不可改變的值,這點與java很相似,字串是一個引用變數,
#也就是在python的虛擬機器中維護一個字串專門的空間,對兩個字串值相同的變數,實際上同一個變數。

#字串1
a="abcdef"

#字串2
b="abcdef"

#檢視兩個字串在記憶體中識別符
print(id(a))
#2937199059216

print(id(b))
#2937199059216

#"改變"字串1
a="abcdefgh"

#檢視識別符號
print(id(a))
#2071341216880

#結論:字串改變不是改變的值本身,而是改變了變數的引用物件

#字串的編碼
#字串1
a='this is a test example.'

#字串2
b='這是一個測試用例。'

#輸出兩個字串的長度
print('a:',len(a))
#a: 23
print('b:',len(b))
#b: 9

#以上編碼在我的環境下預設是用的utf-8進行編輯的,所以漢字字元是能夠進行正確識別的,如果不是使用utf-8進行編碼的話,
#將會出現錯誤。這時,需要利用字串的encode()方法進行編碼的轉換。

#兩個字串的拼接

#字串1
a='abcdefg'

#字串2
b='hijklmn'

#第一種拼接方法:利用連線符
c=a+b

print(c)
#abcdefghijklmn

#說明:該方法在拼接數量較少時,使用比較方便,同樣顯示也比較直觀,
#但在拼接的數量較多的時候,會消耗大量的記憶體,

#第二種方法:格式化的方法:
#利用%s進行格式化

d="%s%s" % (a,b)

print(d)
#abcdefghijklmn

#利用string的format方法進行格式化:

e="{a}{b}".format(a=a,b=b)

print(e)
#abcdefghijklmn
#第三種方法:利用string的join方法

f=''.join([a,b])

print(f)
#abcdefghijklmn

#字串的修改:

a='abcDEf'

print(id(a))
# 2074274992680

a=a.replace('DE','de')

print(id(a))
# 2074274993352

print(a)
# abcdef
#雖然可以改變字串中的值,但是從本質上來講,修改後的字串不是原先的字串了,而將變數指向了一個新的字串

#查詢字串的子串
a="I'm a student,my name is zhangsan,my hometown is New York,my phone number is 333-4445"

print(a.find('zhangsan'))
# 25

print(a.index('zhangsan'))
# 25

print(a.find('Lisi'))
# -1

# print(a.index('Lisi'))
# ValueError: substring not found

#結論:從查詢的結果上來看,如果說查詢的字串中存在子串,則不會影響,但如果不存在 ,find會返回一個-1,而index則會返回一個錯誤。

print(a.find('my'))
#14

#find預設是查詢到的子串第一次出現的位置

print(a.count('my'))
#3

#在字串有多個子串,在查詢的時候,我們可以利用對查詢的起始位置進行限制

print(a.find('my',15))
#34

print(a.find('my',35))
#58

print(a.replace('my',"My"))
# I'm a student,My name is zhangsan,My hometown is New York,My phone number is 333-4445
#所有的符合條件的字元被替換

print(a.replace('my',"My",1))
# I'm a student,My name is zhangsan,my hometown is New York,my phone number is 333-4445

print(a.replace('my',"My",2))
# I'm a student,My name is zhangsan,My hometown is New York,my phone number is 333-4445

#在replace中也有一個可選引數,如果不指定,則會將所有的替換,如果指定,則只替換指定的個數,

#字串的分割:
a="I'm a student,my name is zhangsan,my hometown is New York,my phone number is 333-4445"
#將上面的字串按空格進行分割
b=a.split(' ')

print(type(b))
# <class 'list'>

print(b)
# ["I'm", 'a', 'student,my', 'name', 'is', 'zhangsan,my', 'hometown', 'is', 'New', 'York,my', 'phone', 'number', 'is', '333-4445']
#可以看出,上面的字串按空格被分割成了一個list

#將上面得到的list進行還原
c=' '.join(b)	#注意join前面的字串是一個擁有一個空格的字串

print(c)
# I'm a student,my name is zhangsan,my hometown is New York,my phone number is 333-4445

#字串的刪除
a='test'

del a

# print(a)
#NameError: name 'a' is not defined

#說明:其本質上是刪除了一個變數

#字串的切片:
#字串在本質上也是一種序列化的結構,所以能夠使用遊標的方式進行訪問,所以能夠進行切片的訪問
#基本的使用:
a='abcdefghijklmn'

#訪問固定位置:

print(len(a))
# 14

print(a[0])
# a

# print(a[14])
# IndexError: string index out of range

# 說明:字串的遊標是從0開始進行計數的,其他位置與我們實際生活中數的位置差1

#取出字串的abc
print(a[0:3])
# abc

print(a[:3])
# abc,預設從最開始的位置開始,所以0可以省略

print(a[-14:-11])
# abc,數表示從右邊開始數起,但起始的相對位置不變,第一個表示開始位置,第二個表示結束位置的下一位

#取出字元acegikm

print(a[0:14:2])
# acegikm,第三個數表示步進

print(a[::2])
# acegikm,對整個字串來講,開始和結束的預設位置都可以省略,也可以省略一個

print(a[0::2])
# acegikm

print(a[:14:2])
# acegikm