python note 11 函数名的使用、闭包、迭代器
生活随笔
收集整理的這篇文章主要介紹了
python note 11 函数名的使用、闭包、迭代器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、函數名就是一個變量
def func():print("我是一個小小的函數") a = func print(a) #輸出變量存放地址 <function func at 0x00000251AD780048> func() #func()等同于a(),輸出 我是一個小小的函數2、函數名是變量名
def func1():print("我是1") def func2():print("我是2") def func3():print("我是3") lst = [func1, func2, func3] for el in lst:el() #輸出 我是1 我是2 我是33、函數名可以作為參數傳遞給函數
def my():print("我是my") def proxy(fn): # 代理模式. 裝飾器print("在處理之前")fn()print("在處理之后") proxy(my) # 把函數名作為參數傳遞給另一個函數 #輸出 在處理之前 我是my 在處理之后?
def func1():print("我是func1") def func2():print("我是func2") def func(fn, gn): # 函數名可以作為參數進行傳遞print("我是func")fn()gn()print("哈哈哈") func(func1, func2)func()()用法
def func():print("我是func")a = 10 # 變量def inner():print("我是inner")return inner ret = func() ret() func()() # 先運行func() 然后在返回值上加(),等于上一個寫法 #輸出 我是func 我是inner4、閉包
#閉包. 在內層函數中訪問外層函數的變量
# 閉包的作用:
# 1. 可以保護你的變量不收侵害
# 2. 可以讓一個變量常駐內存
如果不閉包全局變量是不安全的
a = 10 # 不安全的 def outer():global aa = 20 def outer_2():global aa = 30 outer_2() outer() print(a) #輸出 20 #如果交換outer_2()和outer(),那么輸出會變為30閉包變量會常駐內存
def outer():a = 10 # 常駐內存, 為了inner執行的時候有值.def inner():print(a)return inner fn = outer() fn() # 調用的時機是不定的. #輸出 10超簡易爬蟲
from urllib.request import urlopen def outer():# 常駐內存s = urlopen("http://www.xiaohua100.cn/index.html").read()def getContent(): # 閉包return sreturn getContent print("爬取內容.....") pa = outer() ret = pa() print(ret)查看是否閉包
def func():a = 10def inner():print(a)print(inner.__closure__) func() # 如果打印的是None. 不是閉包. 如果不是None, 就是閉包?
5、迭代器
#? dir查看xx類型的數據可以執行哪些方法?print(dir(str))、print(dir(list))、print(dir(int))
# 所有的帶__iter__可以使用for循環的, 可迭代對象。print(dir(int)) 沒有__iter__
# 可迭代對象可以使用__iter__()來獲取到迭代器 # 迭代器里面有__next__() # s = "石可心喜歡趙一寧" # it = s.__iter__() # 獲取迭代器 # print(dir(it)) # 迭代器里有__iter__ 還有__next__迭代器特性
# 1. 只能向前.
# 2. 幾乎不占用內存, 節省內存(需要明天生成器)
# 3. for循環
# 4. 惰性機制 (面試題,難度系數比較高)
迭代器模擬for循環
lst = ["趙一寧", "石可心", "朱奎峰", "姚明","潘長江"] for el in lst: # 底層用的是迭代器print(el)?不輸出錯誤
lst = ["趙一寧", "石可心", "朱奎峰", "姚明","潘長江"] it = lst.__iter__() # 獲取迭代器 while 1:try: # 嘗試執行el = it.__next__() # 獲取下一個元素print(el)except StopIteration: # 處理錯誤,不顯示break判斷是否為迭代器
偏方
# print("__iter__" in dir(it)) # print("__next__" in dir(it)) # 可以通過dir來判斷數據是否是可迭代的, 以及數據是否是迭代器官方方案
# from collections import Iterable # 可迭代對象 # from collections import Iterator # 迭代器 # # print(isinstance(lst, Iterable)) # print(isinstance(lst, Iterator)) # # print(isinstance(it, Iterable)) # print(isinstance(it, Iterator))?
轉載于:https://www.cnblogs.com/P-Z-W/p/10745217.html
總結
以上是生活随笔為你收集整理的python note 11 函数名的使用、闭包、迭代器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSAPP lab2 二进制拆弹 bin
- 下一篇: 11 mybatis-高级应用