python的字符串格式化有兩種方式: 百分號方式, format方式python
%[(name)][flags][width].[precision]typecode
(name) 可選,用於選擇指定的key編程
flags 可選,可供選擇的值有:數組
+ 右對齊;正數前加正號,負數前加負號;數據結構
- 左對齊;正數前無符號,負數前加負號;函數式編程
空格 右對齊; 正數前加空格,負數前加負號;函數
0 右對齊;正數前無符號,負數前加負號;用0填充空白處spa
width 可選,佔有寬度code
precision 可選,小數點後保留的位數orm
typecode 必選對象
s, 獲取傳入對象的__str__方式的返回值,並將其格式化到指定位置
r,獲取傳入對象的__repr__方法的返回值,並將其格式化到指定位置
c,整數:將數字轉換成其unicode對應的值,10進制範圍爲 0 <= i <= 1114111(py27則支持 0-255);字符:將字符添加到指定位置
o,將整數轉換成八進制表示,並將其格式化到指定位置
x,將整數轉換成十六進制表示,並將其格式化到指定位置
d,將整數,浮點數轉換成十進制表示,並將其格式化到指定位置
e,將整數,浮點數轉換成科學計數法,並將其格式到指定位置(小寫e)
注:python中百分號格式化是不存在自動將整數轉換成二進制表示的方式 經常使用: %s>>>>>>>>輸入爲字符串 %d>>>>>>>>輸入格式爲數字 %f>>>>>>>>輸入格式爲浮點型,即小數,在%後加.數字表示保留小數點後幾位,在f後加%%輸入百分數
[[fill]align][sign][#][0][width][,][.precision][type]
注意,在字符串中引用format,默認替換變量下標由0開始
特色:一次建立可屢次調用,加強代碼的重用性和可讀性, 調用函數過程當中, 函數的代碼塊中變量會被賦值,但在調用結束後, 變量對應的值會被清空, 不會佔用內存空間
1 def 函數名(參數): 2 3 4 ' ' ' 5 函數體 6 ' ' ' 7 返回值
函數的定義主要有以下要點:
def : 標識符, 表示函數的關鍵字
函數名 : 函數的名稱, 往後根據函數名調用函數, 函數名實質也是一個變量
函數體 : 函數中進行一系列的邏輯計算, 如: 發送郵件, 計算出 [11,22,38,888,2]中的最大數等
參數: 爲函數體提供數據
返回值 : 當函數執行完畢後, 能夠給調用者返回數據.結束函數, 能夠一個return返回多個值以 元組形式呈現, 若沒設置返回值, 則會隱式返回一個none.
函數參數分爲形式參數跟實際參數
形式參數 : 在函數名後面括號裏做爲函數體邏輯判斷的變量名
實際參數 : 在調用函數時,賦值給函數變量的值
位置參數和關鍵字(標準調用: 實參與形參位置-------對應; 關鍵字調用: 位置無需固定)
默認參數, 在定義形式參數的時候給參數賦值
參數組 (*args >>> 傳列表元素,**kwargs傳字典元素)
*arg若不傳參數不會報錯, 會輸出一個空元組, 列表前不加*號默認將整個列表做爲一個元素 傳 給*arg
**kwargs若不傳參不會報錯,會輸出一個空字典,傳值方式有鍵值對(相似於關鍵字傳值) 傳值跟 *+字典傳值
全局變量: 頂頭無縮進定義的變量, 對全局有效的變量
局部變量: 在函數中定義的變量, 只有在調用該函數的時候對函數體起做用
global:聲明修改全局變量
nonlocal:在函數內聲明修改上一層變量, 只能修改函數內變量, 能夠隔層往上尋找該變量,若最外層函數不存在該變量, 會報錯
name = "tom"#定義全局變量無縮進
def con(): name1 = "aric"#在函數中定義的變量爲局部變量 print(name1)
name = "tom"#定義全局變量無縮進 def con(): name1 = "aric"#在函數中定義的變量爲局部變量 print(name1)#》》》》aric con()#調用函數時候,局部變量只在函數內有效 print(name)#》》》》tom
n1 = "tom" def n2(): n1 = 123 print(n1)#》》》》123 def n3(): nonlocal n1#》》》》聲明修改上一層變量 n1 = "aric" n3() print(n1)#》》》》aric print(n1)#》》》》tom n2() print(n1)#》》》》》tom
n1 = "aric" def coin(): global n1#global聲明修改全局變量 n1 = "aric" print(n1)#>>>aric coin() print(n1)#>>>aric
因爲python執行代碼的順序是由前到後, 因此若要引用某函數, 需先在引用以前定義好該函數, 若在定義以前引用函數則會報錯
def u(): pass q() u()#報錯,q() 未定義
def u(): pass q() def q(): pass u() q()#能夠執行
在函數內層繼續定義函數,調用函數的時候只能調用最外層函數,不能直接調用內層函數
做用域在定義函數時就已經固定住了,不會隨着調用位置的改變而改變
n1 = "tom" def n2(): n1 = 123 print(n1)#》》》》123 def n3():#嵌套函數 nonlocal n1 n1 = "aric" n3() print(n1)#》》》》aric print(n1)#》》》》tom n2() print(n1)#》》》》》tom
在函數內部, 能夠調用其餘函數. 若是一個函數在內部調用自身自己, 這個函數就是遞歸函數
遞歸特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞歸時, 問題規模相比上次遞歸都應有所減小
3. 遞歸效率不高,遞歸層次過多會致使棧溢出(在計算機中,函數調用是經過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返 回,棧就會減一層棧幀。因爲棧的大小不是無限的,因此,遞歸調用的次數過多,會致使棧溢出。)
def cl(n): print(n) if (int(n/2)) == 0: return n return cl(int(n/2))#調用函數自己 cl(10)
匿名函數就是不須要顯示的指定函數,直接能夠調用,不須要先定義,形式爲lambda x:x的邏輯體,其中x爲變量,處理結果爲輸出通過x的邏輯體處理過的x的值,即函數中的return,使用匿名函數能夠簡化不少簡單函數
v = lambda x,y,z:(x+1,y+1,z+1)#表示x,y,z分別+1並以列表輸出 print(v(1,2,3))#>>>>(2,3,4)
當下主流的編程方法有三種:函數式,面向過程,面向對象
1.map函數用法:
map(a,b),a爲處理邏輯, b爲要處理的可迭代對象, 處理過程(處理邏輯依次處理b中的元素),在Python2中直接生成列表,在python3中須要list轉換
1 l1 = [1,2,3,4,5,6,7] 2 def redu(x): 3 return x-1 4 print(list(map(redu,l1)))#map(a,b),a爲處理邏輯,b爲要處理的可迭代對象,處理過程(處理邏輯依次處理b中的元素),在python2中直接生成列表,在python3中需用list轉換 5 print(list(map(lambda x:x-1,l1)))#運用匿名函數能夠簡化不少過程
a = "tomp" print(list(map(lambda x:x.upper(),a)))#>>>>>>['T', 'O', 'M', 'P']map能夠處理不少可迭代對象
2.reduce函數用法:遍歷對象,運用邏輯將可迭代對象合併
1 s = [1,2,3,4,5] 2 def reduce_test(func,array,init=None): 3 l=list(array) 4 if init is None: 5 res=l.pop(0) 6 else: 7 res=init 8 for i in l: 9 res=func(res,i) 10 return res 11 print(reduce_test(lambda x,y:x+y,s,50))#>>>>65
3.filter函數用法:至關於一個過濾器,filter(a,b)a至關於處理邏輯以布爾值方式做判斷處理可迭代對象b,符合邏輯的保留,不符合的刪除,生成迭代器,用list轉換爲列表
li = [11,222,333,44,55,66]
print(list(filter(lambda x:x>22,li)))#[33, 44, 55, 66, 77, 88, 99, 200]