python學習之函數學習進階(二)
阿新 • • 發佈:2017-05-31
python學習之函數進階二
一、內置函數 zip函數: zip()是Python的一個內建函數,它接受一系列可叠代的對象作為參數,將對象中對應的 元素按順序組合成一個tuple,每個tuple中包含的是原有序列中對應序號位置的元素,然後返回由 這些tuples組成的list。若傳入參數的長度不等,則返回list的長度和參數中長度最短的對象相同。 在所有參數長度相同的情況下,zip()與map()類似,沒有參數的情況下zip()返回一個空list 例子: l1 = [1,2,3,4] l2 = [‘a‘,‘b‘,‘c‘,‘d‘] for i in zip(l1,l2): print(i) 返回結果:[(1,‘a‘),(2,‘b‘),(3,‘c‘),(4,‘d‘)] filter函數: filter函數是 Python 內置的另一個有用的高階函數,filter()函數接收一個函數 f和一個list,這個函數 f 的作用是對每個元素進行判斷,返回 True或 False,filter() 根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list. 例子: def add(n):return n / 2 == 1 for i in filter(add, [1,2,3,4]): print(i) #打印2 map函數: map()是 Python 內置的高階函數,它接收一個函數 f 和一個 list,並通過把函數f依次 作用在 list 的每個元素上,得到一個新的 list 並返回。 例子: l = [1,2,3,4] def add(x): return x+1 for i in map(add,l): print(i) reduce函數: reduce()函數接收的參數和 map()類似,一個函數 f,一個list,但行為和 map()不同, reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反復調用函數f, 並返回最終結果值 例子: from functools import reduce l = [1,2,3,4,5] print(reduce(lambda x,y: x+y, l, 10)) #參數10是可選參數,作為初始值 二、匿名函數lambda 1.lambda只是一個表達式,函數體比def簡單很多。 2.lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。 3.lambda表達式是起到一個函數速寫的作用。允許在代碼內嵌入一個函數的定義。 例子: f = lambda x,y: x+y #x,y是參數,x+y是表達式,然後賦值給f print(f) #返回f的內存地址 print(f(1,2)) #返回表達式的值 l = [‘alex‘, ‘wupeiqi‘, ‘yuanhao‘] res = map(lambda x: x + ‘_SB‘, l) print(res) print(list(res)) nums = [2,4,6,9] res1 = map(lambda x: x**2, nums) print(list(res1)) 三、遞歸調用 在函數調用過程中,直接或間接調用函數本身,這就是函數的遞歸調用 例子: def age(n): if n == 1: return 18 return age(n-1) + 2 print(age(5)) l = [1, 2, 10,33,53,71,73,75,77,85,101,201,202,999,11111] def search(find_num,seq): if len(seq) == 0: print(‘not exists‘) return mid_index=len(seq)//2 mid_num=seq[mid_index] print(seq,mid_num) if find_num > mid_num: #in the right seq=seq[mid_index+1:] search(find_num,seq) elif find_num < mid_num: #in the left seq=seq[:mid_index] search(find_num,seq) else: print(‘find it‘) search(77,l) 四、包、模塊 import spam import 導入模塊做三件事 1.產生新的名稱空間 2.以新建的名稱空間為全局名稱空間,執行文件代碼 3.拿到一個模塊名spam,指向spam.py產生的名稱空間 import spam as x #將spam用x代替,適合模塊名過長時使用 from ... import ... 優點: 方便、不用加前綴 缺點: 容易跟當前的文件名稱沖突 包: 將有聯系的模塊組織到一起,有效避免模塊名稱沖突問題,讓組織結構更加清晰。 一個標準的應用程序結構: app/ __init__.py #__init__.py做一些初始化工作可以是空文件,也可以寫一些初始配置 a/ __init__.py a.py b/ __init__.py b.py from app.a import a from app.b.b import test # "."左邊必須是包名 a.test() test() 可以將包加入sys.path環境變量的位置,或者把包所在的位置加入到環境變量
本文出自 “linux技術” 博客,請務必保留此出處http://xiaojishu.blog.51cto.com/4278020/1930999
python學習之函數學習進階(二)