在這一篇中我們將對上幾篇的Python零碎的知識進行補充,即字符串的格式化輸出,以及深淺拷貝,接下來我們將對這兩種進行一一介紹。
一、字符串格式化輸出
關於字符串的格式化輸出,我們需要了解為什么需要字符串的格式化,同時掌握格式化輸出的兩種用法:百分號方式、format方式。接下來我們就這兩種方式進行介紹:
字符串的格式化的兩種用法:
#百分號方式 info1 ="My name is %s,I'm %d years old."%("little-five",22) print(info1) #format方式 n=input("name-->:") a=int(input("age-->:")) info2 ="My name is {name},I'm {age} years old.".format(name=n,age=a) print(info2)
通過以上例子我們可以看出,字符串的格式化輸出使得字符串的使用更加靈活、且格式輸出一致。
1、百分號方式
從上述例子我們可以看到%s、%d等這些占位符,而這些占位符不但為真實值預留位置,同時也規定了真實值輸入的數據類型,例如:%s-->表示接收字符串,%d-->表示接收整數。接下來我們看一下這些常用的占位符分別代表的含義:
s,獲取傳入對象的__str__方法的返回值,並將其格式化到指定位置 r,獲取傳入對象的__repr__方法的返回值,並將其格式化到指定位置 c,整數:將數字轉換成其unicode對應的值,10進制范圍為 0 <= i <= 1114111(py27則只支持0-255);字符:將字符添加到指定位置 o,將整數轉換成 八 進制表示,並將其格式化到指定位置 x,將整數轉換成十六進制表示,並將其格式化到指定位置 d,將整數、浮點數轉換成 十 進制表示,並將其格式化到指定位置 e,將整數、浮點數轉換成科學計數法,並將其格式化到指定位置(小寫e) E,將整數、浮點數轉換成科學計數法,並將其格式化到指定位置(大寫E) f, 將整數、浮點數轉換成浮點數表示,並將其格式化到指定位置(默認保留小數點后6位) g,自動調整將整數、浮點數轉換成 浮點型或科學計數法表示(超過6位數用科學計數法),並將其格式化到指定位置(如果是科學計數則是e;) G,自動調整將整數、浮點數轉換成 浮點型或科學計數法表示(超過6位數用科學計數法),並將其格式化到指定位置(如果是科學計數則是E;) %,當字符串中存在格式化標志時,需要用 %%表示一個百分號 |
注:Python中百分號格式化是不存在自動將整數轉換成二進制表示的方式。
常見的格式化輸出:
占位符的接收方式有兩種,當然其格式也不一樣,兩種分別是:元組、字典。
#1、字符串
st1="My name is %s"%"little-five"
#2、以字典的方式傳入
st2="My name is %(name)s,I'm %(adj)s."%{"name":"little-five","adj":"greater"} #3、浮點數,並且指定小數點后的位數,四舍五入
st3="The number is %.2f"%68.68888
#4、百分之幾
st4="The tax rate is %.2f%%"%12.366566
#5、科學計數法
st5 ="scientific notation-->:%e"%11000012 st6="The tax rate is %(rate).2f%%"%{"rate":12.366566}
2、format方式
format()為字符串的內置方法,從上述例子中也可以看出,以{}為占位符,同時可以以元組和字典的方式傳入。
其常見的格式化輸出:
# format方式 #三種方式-->真實值傳入的三種方式 #1、占位符為{},以元組的方式傳入 # info1="My name is {},I'm {} years old.".format("little-five",22)
info1="My name is {},I'm {} years old.".format(*["little-five",22])#等同於上式
#2、占位符為{int},以元組的方式傳入 # info2="My name is {1},I'm {0} years old.".format(22,"little-five")
info2="My name is {1},I'm {0} years old.".format(*[22,"little-five"])#等同於上式
#3、占位符為{key},以字典的方式傳入 # info3="My name is {name},I'm {age} years old.".format(name="little-five",age=22)
info3="My name is {name},I'm {age} years old.".format(**{"name":"little-five","age":22})
其他的format應用方式:
1 #傳入列表中的元素
2 info1="My name is {0[0]},I'm {1[0]} years old.".format(["little-five","amanda"],[22,23])
3 #規定傳入的參數的格式
4 info2="My name is {:s},I'm {:d} years old.".format("little-five",22)
5 #規定傳入的參數格式,並且以字典的形式傳入
6 info3="My name is {name:s},I'm {age:d} years old.".format(name="little-five",age=22)
7 #占位符->s:字符串,d:十進制,b:二進制,0:八進制,x:十六進制,X:大寫十六進制,e:科學計數法,.2f:浮點數,保留兩位小數
8 data = "numbers -->{:s},{:d},{:b},{:o},{:x},{:X},{:e},{:.2f}"
9 print(data.format("hello",15,15,15,15,15,16.6666,16.3333))
同時這里忍不住提一下如何將文本高亮顯示:
#\33[42;1m xxx \033[0m’,其中42為背景顏色 name ="\033[42;1m little-five \033[0m" print(name)
二、深淺拷貝
1、淺拷貝:
在了解深淺拷貝時,我們先看一個拷貝列表的例子:
ls1=["little-five","amanda",[1,2,3]] ls2=ls1.copy() #淺拷貝 # print(ls2) #修改列表中的不可變數據類型,ls2變,ls1不變 ls2[0]="xiaowu" print(ls1,ls2) #輸出為:['little-five', 'amanda', [1, 2, 3]] ['xiaowu', 'amanda', [1, 2, 3]] #修改列表中的可變數據類型,ls2變,ls1也變 ls2[2][0]=6666 print(ls1,ls2) #輸出為:['little-five', 'amanda', [6666, 2, 3]] ['xiaowu', 'amanda', [6666, 2, 3]]
從上述例子中我們可以知道,對於淺拷貝,由ls1拷貝成ls2,當修改ls2中的不可變數據類型時,s1不發生變化;而當修改ls2中的可變數據類型是,s2則發生改變。
這是由於:淺拷貝-->拷貝的僅僅是原列表以及原列表元素中內存指針,故ls2中的不可變數據類型發生改變時,其內存指針也發生了改變,則當ls2[0]發生改變時,其內存指針發生改變,指向的不再存儲"little-five"的內存空間,而是存放"xiaowu"的內存空間。故ls1不受影響。而當修改ls2中可變數據類型時,修改列表[1,2,3]中的元素時,該列表[1,2,3]的內存地址並不發生改變,故ls1和ls2的內存指針均指向該列表[1,2,3],故ls2發生該表,ls1也跟着改變。從下面例子可以看出可變數據類型和不可變數據類型的區別:
#當修改不可變數據類型時,其內存指針發生改變 name="alex" print(id(name)) #1777614111552 name="little-five" print(id(name)) #1777646713264 #當修改可變數據類型,其內存指針不發生改變 lis=["zhangsan","lisi","wangwu"] print(id(lis)) #1777646712904 lis[2]="wangmazi" print(id(lis)) #1777646712904
我們也可以從下圖更好的理解淺拷貝:
修改數據前:
修改數據后:
2、深拷貝
首先我們也先從拷貝一個例子可以來了解深拷貝:
import copy #導入拷貝模塊
ls3=["zhangsan","lis","wnagwu",[1,2,3]] #ls5=copy.copy(li3) #淺拷貝
ls4=copy.deepcopy(ls3) #深拷貝
print(ls4) ls4[0]="little-five"
print(ls3,ls4) #輸出為:['zhangsan', 'lis', 'wnagwu', [1, 2, 3]] ['little-five', 'lis', 'wnagwu', [1, 2, 3]]
ls4[3][0]=666
print(ls3,ls4) #輸出為:['zhangsan', 'lis', 'wnagwu', [1, 2, 3]] ['little-five', 'lis', 'wnagwu', [666, 2, 3]]
從上述例子可以看出,ls3與ls4再無任何關聯,這是由於ls4拷貝過來時,其拷貝的不止內存指針,同時還創建新的內存空間,並將數據拷貝至新的內存空間。故新的內存指針指向新的內存空間。