python中的函數名,閉包,迭代器

一.函數名

函數名是一個變量,但它是一個特殊的變量,與括號配合能夠執行函數的變量,單純print()出的是一個內存地址.html

 

 1 def func():  2     print('你說你有點難追')  3 print(func)   #<function func at 0x000001F812922EA0>
 4 ########################單純打印函數名打印的是一串內存地址##############################
 5 
 6 def func():  7     print('花店玫瑰')  8 other=func  9 print(other)   #<function func at 0x0000013F2D7B2EA0>
10 other()     #花店玫瑰
11 ########################函數名能夠賦值給其餘變量###########################
12 
13 def func1(): 14     print('廣東') 15 def func2(): 16     print('十年') 17 def func3(): 18     print('愛情') 19 def func4(): 20     print('故事') 21 list=[func1,func2,func3,func4] 22 for  i in list: 23  i() 24 ####################函數名能夠當作容器類元素##########################
25 
26 # def func1():
27 # print('大豬蹄兒')
28 # def func2(fn):
29 # print('嘩嘩流油')
30 # fn()
31 # func2(func1)
32 ###############################函數名能夠當作函數的參數###############################
33 
34 def func1(): 35     print('哈哈哈') 36 def func2(): 37     print('呵呵呵') 38     return func1 39 set=func2() 40 set() 41 #######################函數名能夠當作函數的返回值##################

二.閉包

閉包就是內層函數對外層函數(非全局)的變量的引用python

2.1 __closure__用來檢驗函數是否閉包,格式(print(func.__closure__)),有返回值就是閉包,返回none就不是閉包.閉包

 1 def func1():  2     a='小花妹妹'
 3     def func2():  4         print(a)  5         return func2  6     set1=func2()  7     def func3():  8         print('無所謂')  9         return func3      #在此處return func3也算引用外層變量
10     ret2=func3() 11     print(func3.__closure__)    #沒有引用外層變量就不是閉包
12     print(func2.__closure__)     #引用了外層的變量,是閉包
13     print(func1.__closure__)     #能夠查看上一層的函數是否是閉包
14     return ret2 15 # func1()
16 print(func1.__closure__) 17 # print(func2.__closure__) #不能在父層查看子層的函數是否是閉包
18 ret=func1() 19 ret() 20 # func2() #只有閉包外層的才能夠在外層調用內層的函數

2.2 多層嵌套函數

##############################多層嵌套#################################
def func1(): def func2(): def func3(): print('哈哈') return func3 return func2 func1()()() func2() #不能直接調用func2,由於此時內存只加載了func1,沒有加載func2 #爲何要用三個括號:func1()表示調用func1,func1中的return func2語句返回 了func2, # func2加一個括號才能夠調用,執行func2中的return func3, # 還須要載加一個括號才能夠調用func3,func3打印出了哈哈

2.3 閉包的好處url

  1.保護變量不受外界影響spa

  2.能夠讓變量常駐內存(正常狀況下,當一個函數運行完畢後,,這個函數的局部命名空間將會被銷燬,因此,python中規定,若是內層函數中訪問了外層函數中的變量,即閉包的狀況下,這個變量將不會消亡,也就是說,使用閉包,能夠保證外層函數中的變量常駐內存)code

簡易爬蟲htm

 1 def outer():  2     # 常駐內存
 3     s = urlopen("http://www.xiaohua100.cn/index.html").read()  4     def getContent(): # 閉包
 5         return s  6     return getContent  7 print("爬取內容.....")  8 pa = outer()    #此時的pa是getContent的內存地址
 9 print (pa())    #至關於getContent()
10 
11 ret = pa()      #直接調用getContent()
12 print(ret)      #此時的s已常常駐內存,因此再次調用時速度很是快

2.4 閉包的寫法對象

1 def outer(): 2     a=10
3     def inner(): 4         print(a) 5     return inner 6 zx_inner=outer() 7 zx_inner()

三.迭代器

iterable  可迭代的對象,內部包含__iter__()函數blog

object    對象,內部包含__iter__()函數和__next__()函數

 1 l=[1,2,3]  2 l_iter=l.__iter__()  3 # print(l_iter)
 4 from collections import Iterable  5 from collections import Iterator  6 print(isinstance(l,Iterable))   #判斷,前的東西是否是,後的東西的實例
 7 print(isinstance(l,Iterator))  8 print(isinstance(l_iter,Iterator))  9 print(isinstance(l_iter,Iterable)) 10 True False True True 11 
12 ###################for的工做原理########################
13 
14 s='你是否是傻'
15 c=s.__iter__() 16 print(c.__next__())#依次打印出你是否是傻
17 print(c.__next__()) 18 print(c.__next__()) 19 print(c.__next__()) 20 print(c.__next__()) 21 print(c.__next__())#StopIteration
22 
23 #已上會報錯,因此for循環的機制會採用如下方法
24 
25 lst=[1,2,3] 26 lst_iter=lst.__iter__() 27 while True: 28     try: 29         i=lst_iter.__next__() 30         print(i) 31     except StopIteration: 32         break
33 
34 ###################for的工做原理########################

迭代器的特色:

  1.節省內存

  2.惰性機制

  3.不能反覆,只能向下執行

相關文章
相關標籤/搜索