Python中的函數與變量
本節內容
函數的定義方法
函數功能
函數的返回值
函數的形參與實參
全局變量與局部變量
遞歸
函數的作用域
匿名函數lambda
函數式編程
常用內置函數
其他內置函數
函數
函數的定義方法
函數就相當於一個文件,這個文件有他特定的功能可以減少代碼的重寫
1 def 函數名 (參數): 2 "函數的註釋" 3 函數體 4 return x
若命名了相同的函數名,則調用函數時下面的函數會覆蓋掉上面的函數
函數的功能
1.代碼重用
2.保持一致性,易維護
3.可擴展性
函數的返回值
1.返回值數值 = 0 >>>>>返回None
2.返回值數 = 1 >>>>> 返回object 字典的對象
3.返回值數 > 1 >>>>> 返回元組
函數的參數
1.形參:不占內存,用完釋放
2..實參
3.位置參數和關鍵字參數
位置參數:按順序一一對應
關鍵字參數:可指定參數對應,可無序
位置參數與關鍵字參數混合使用:位置參數應在關鍵字參數左邊 ,否則報錯
4.默認參數
若函數定義時指定了默認參數,則函數調用時,可不寫參數就用默認參數,寫了參數就修改默認參數
5.參數組:*列表 **字典
使用參數組的好處:函數未來擴展功能需傳多個值或者你不確定傳幾個值
全局變量與局部變量
全局變量為定義在函數外部的變量
局部變量為定義在函數內部的變量
所以書寫時全局變量大寫,局部變量小寫
golobal 指定全局變量
nonlocal 指定上一級變量
總結:
有聲明局部變量:使用局部變量
無聲明局部變量:
無global | 優先讀取局部變量,只讀全局變量不對全局變量賦值 |
有global | 變量本質上就是全局變量可讀可賦值 |
當使用global定義變量時,global應上提,防止報錯
a = [‘c‘,‘d‘] def test(): a = ‘我‘ global a #報錯!因為global在下面不知道去哪找a所以global應該上提 print(a)
遞歸特性
遞歸就是函數內部不斷的調用自己
1.必須有一個明確的結束條件,否則死循環
2.每次進入更深一層遞歸,問題規模相應比上次少
3.遞歸的效率不高,層次過大會導致棧溢出
寸到
函數的作用域
程序是從上到下一直讀下去的,其實當程序讀到def ...定義函數部分時,只是把函數部分全部轉換成字符串存到內存當中,不讀取,直到調用函數時才讀取。
匿名函數lambda
匿名函數只使用於定義簡單邏輯的函數
def test(x): return x+1 #使用匿名函數: lambda x:x+1
#若匿名函數接收多個參數,返回多個值則需加括號 lambda x,y,z:(x+1,y+1,z+1)
匿名函數不獨立使用,若真要獨立使用就得給他起個名字才能運行
fuc = lambda x:x+1 fuc(10)
函數式編程
1.不可變數據
2.第一類對象:函數即為變量
3.尾調用優化(尾遞歸)
例一:不可變,不用變量保存狀態,不修改變量
#非函數式: a = 1 def test(): global a a += 1 return a test() print(a)
#函數式編程 a = 1 def test(n): return n+1 print(test(a) print(a)
高階函數有一下兩個特性,有任何一即為高階函數
#1.函數的傳入參數是一個函數名 def foo(n) print(n) def bar(name) print(‘my name is %s‘ %name) foo(bar(‘echo‘)) #先運行bar()無返回值
#2.返回值中包含函數 def bar (): print(‘from bar‘) def foo(): print(‘from bar ‘) return bar #返回bar的內存地址 n = foo() n() #調用bar函數
常用函數 ------轉自林海峰
1.map函數的起源及其用法
map函數就是在原有的數據上處理下數據
array=[1,3,4,71,2] ret=[] for i in array: ret.append(i**2) print(ret) #如果我們有一萬個列表,那麽你只能把上面的邏輯定義成函數 def map_test(array): ret=[] for i in array: ret.append(i**2) return ret print(map_test(array)) #如果我們的需求變了,不是把列表中每個元素都平方,還有加1,減一,那麽可以這樣 def add_num(x): return x+1 def map_test(func,array): ret=[] for i in array: ret.append(func(i)) return ret print(map_test(add_num,array)) #可以使用匿名函數 print(map_test(lambda x:x-1,array)) #上面就是map函數的功能,map得到的結果是可叠代對象 print(map(lambda x:x-1,range(5)))
2.filter函數是過濾,默認保留指定參數
#電影院聚集了一群看電影bb的傻逼,讓我們找出他們 movie_people=[‘alex‘,‘wupeiqi‘,‘yuanhao‘,‘sb_alex‘,‘sb_wupeiqi‘,‘sb_yuanhao‘] def tell_sb(x): return x.startswith(‘sb‘) def filter_test(func,array): ret=[] for i in array: if func(i): ret.append(i) return ret print(filter_test(tell_sb,movie_people)) #函數filter,返回可叠代對象 print(filter(lambda x:x.startswith(‘sb‘),movie_people))
3.reduce函數:壓縮數據為一個所以reduce
reduce在py3中要引用模塊
from functools import reduce
from functools import reduce #合並,得一個合並的結果 array_test=[1,2,3,4,5,6,7] array=range(100) #報錯啊,res沒有指定初始值 def reduce_test(func,array): l=list(array) for i in l: res=func(res,i) return res # print(reduce_test(lambda x,y:x+y,array)) #可以從列表左邊彈出第一個值 def reduce_test(func,array): l=list(array) res=l.pop(0) for i in l: res=func(res,i) return res print(reduce_test(lambda x,y:x+y,array)) #我們應該支持用戶自己傳入初始值 def reduce_test(func,array,init=None): l=list(array) if init is None: res=l.pop(0) else: res=init for i in l: res=func(res,i) return res print(reduce_test(lambda x,y:x+y,array)) print(reduce_test(lambda x,y:x+y,array,50))
map ,filtet,reduce 總結
當然了,map,filter,reduce,可以處理所有數據類型 name_dic=[ {‘name‘:‘alex‘,‘age‘:1000}, {‘name‘:‘wupeiqi‘,‘age‘:10000}, {‘name‘:‘yuanhao‘,‘age‘:9000}, {‘name‘:‘linhaifeng‘,‘age‘:18}, ] #利用filter過濾掉千年王八,萬年龜,還有一個九千歲 def func(x): age_list=[1000,10000,9000] return x[‘age‘] not in age_list res=filter(func,name_dic) for i in res: print(i) res=filter(lambda x:x[‘age‘] == 18,name_dic) for i in res: print(i) #reduce用來計算1到100的和 from functools import reduce print(reduce(lambda x,y:x+y,range(100),100)) print(reduce(lambda x,y:x+y,range(1,101))) #用map來處理字符串列表啊,把列表中所有人都變成sb,比方alex_sb name=[‘alex‘,‘wupeiqi‘,‘yuanhao‘] res=map(lambda x:x+‘_sb‘,name) for i in res: print(i)
其他內置函數
詳細請查看http://www.runoob.com/python/python-built-in-functions.html
1.abs() 取絕對值
2.布爾運算
bool() | 將括號內元素轉換為布爾值 |
all() |
將括號內元素全部進行布爾運算,全真才為真 |
any() | 將括號內元素全部進行布爾運算,一個真則真 |
3.進制轉換
bin() | 轉為二進制 |
hex() | 轉為16進制 |
oct() | 轉為8進制 |
4.bytes()查看多少字節,可指定編碼解碼,也可不指定
name = ‘您好‘ print(bytes(name ,encoding = ‘utf-8‘,decode‘utf-8))
5.ASCII碼處理
chr() | 打印ASCII碼 |
ord() | 與chr()相反,解asci碼 |
6.數字處理
divmod() | 傳入兩個參數,取商與余 |
pow() | 可穿三個參數,最少傳2個,若傳pow(3,3,2)則求3的3次方後對2取余 |
round() | 四舍五入 |
7.查看函數使用
dir() | 查看參數的屬性 |
help | 查看函數的使用 |
8.eval
第一個功能就是把字符串中的數據結構提取出來
第二個功能就是把字符串中表達式計算
9.hash:可hash的數據類型就是不可變數據類型
10.isinstance:輸入兩個參數,一個是變量,一個 是指定數據類型,查看是否變量是否為指定類型
11.globals()和locals() 聯合print()打印本地與局部
12.max()與min()
for循環依次去出元素比較,若開頭已比較出結果則後面不比較(比較字符串時或其他)
註意不可有多種數據類型
其返回的是內存地址
12.1.max函數處理的是可叠代對象,相當於一個for循環取出每個元素進行比較。不同數據類型間不能進行比較
12.2.每個元素進行比較,若字符串則從第一個字符開始,若第一個位置分出大小,則後面不比較
#終極玩法 people= [ {‘name ‘ =‘haha‘, ‘age‘ = 100} {‘name‘ = ‘echo‘ , ‘age‘ = 500} ] print(max(people,key=lambd dic:dic[‘age‘]))
key 代表告訴max通過什麽方法去比較出每個對象的大小
13.zip() 拉鏈:輸入兩個參數,這兩個參數為序列然後一一對應轉為元組,有多不顯示不報錯,返回內存地址要用list查看
14.reverse 反轉 ,可以反轉列表
15.slice 切片:指定切片
l = ‘hello‘ s1 = slice(1,4,2) print(l(s1)) print(s1.start) print(s1.end) print(s1.step) #查看步長
16.sorted 排序:本質比較大小,不同類型不能排序
17 sum :求和
18.type : 查看參數是那種類型
Python中的函數與變量