1. 程式人生 > >python學習之函數學習進階(二)

python學習之函數學習進階(二)

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學習之函數學習進階(二)