內置函數補充,閉包

內置函數補充,閉包

1、內置函數的補充

  1. zip():拉鍊方法,用於將可迭代對象做爲參數,將對象中對應的元素打包成一個元組,而後返回這些由這些元組組成的內容(迭代器),若是這個可迭代對象的元素個數不一致,則按照長度最短的返回python

    lst1 = [1,2,3]
    lst2 = ['a','b','c','d']
    lst3 = (11,12,13,14,15)
    for i in zip(lst1,lst2,lst3):
        print(i)
    
    結果:  (1, 'a', 11)
          (2, 'b', 12)
          (3, 'c', 13)
  2. sorted():排序安全

    l1 = [7, 4, 1, 6,]
    print(sorted(l1)) # 造成了新的列表
    # 加key
    lst = [
        {'name': 'xiaohong', 'age': 73},
        {'name': 'xiaoming', 'age': 35},
        {'name': 'xiaoli', 'age': 25},
    ]
    print(sorted(lst,key=lambda x:x['age']))  #按照年齡排序
    print(sorted(lst,key=lambda x:x['age'],reverse=True))  #第三個參數,逆序
  3. filter():過濾,至關於生成器表達式的篩選模式,返回一個迭代器閉包

    l1 = [56, 67, 12, 34, 78, 90]
    print(i for i in l1 if i > 60)   #[67,78,90]
    print(list(filter(lambda x:x>60,l1)))   #[67,78,90]
  4. map():至關於生成器表達式的循環模式app

    l1 = [56, 67, 12, 34, 78, 90]
    print(i**2 for i in l1)    #<generator object <genexpr> at 0x000001E97FFFC888>
    print(list(map(lambda x:x**2,l1)))    #[3136, 4489, 144, 1156, 6084, 8100]
  5. reduce(): python3從內置函數剔除了,放到了模塊中函數

    就是把列表,元組的成員按照既定的規則累加code

    from functools import reduce
    print(reduce(lambda x,y:x+y,[1,2,3,4,5]))  #15
    """
    第一次: x,y 1,2 求和 3  記錄到內存
    第二次: x,y 3,3 求和 6  記錄到內齒
    第三次: x,y 6,4 求和 10  記錄到內齒
    第四次: x,y 10,5 求和 15  返回
    """

2、閉包(考點,難點)

  1. 閉包的造成條件:
    • 閉包存在於嵌套函數
    • 內層函數對外層函數非全局變量的引用(修改),產生了自由變量,這個自由變量不會隨着函數的運行結束而消失,保證了數據的安全
    • 函數名逐層返回,直至返回到最外層(參考)
  2. 閉包的應用:
    • 保證數據的安全
    • 裝飾器的本質
# 初版
lst = []     #lst是全局變量,不安全
def func(price):
    lst.append(price)
    return sum(lst)/len(lst)

# 第二版
def func(price):
    lst = []        #自由變量
    lst.append(price)
    return sum(lst)/len(lst)

# 爲了保證數據的安全,閉包
def func():
    lst = []   #自由變量
    def func1(price):
        lst.append(price)
        return sum(lst)/len(lst)
    return func1    #return是給全局複製了一份,獲得了func1的函數地址
avg = func()
print(avg(100000))
print(avg(110000))
print(avg(120000))
print(avg(110000))
# 判斷一個函數是否是閉包--函數中有沒有自由變量
# 函數名.__code__.co_freevars 查看函數的自由變量
相關文章
相關標籤/搜索