函数名是一个变量,但它是一个特殊的变量,与括号配合能够执行函数的变量,单纯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.不能反复,只能向下执行