第四篇:python基礎之雜貨鋪
在這一篇中我們將對上幾篇的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拷貝過來時,其拷貝的不止記憶體指標,同時還建立新的記憶體空間,並將資料拷貝至新的記憶體空間。故新的記憶體指標指向新的記憶體空間。
總結:
1,深淺拷貝都是對源物件的複製,佔用不同的記憶體空間。
2,不可變型別的物件,對於深淺拷貝毫無影響,最終的地址值和值都是相等的。
3,可變型別:
=淺拷貝: 值相等,地址相等
copy淺拷貝:值相等,地址不相等
deepcopy深拷貝:值相等,地址不相等