python中的函数名,闭包,迭代器

一.函数名

函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量,单纯print()出的是一个内存地址.

 

 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 #######################函数名可以当做函数的返回值##################

二.闭包

闭包就是内层函数对外层函数(非全局)的变量的引用

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 闭包的好处

  1.保护变量不受外界影响

  2.可以让变量常驻内存(正常情况下,当一个函数运行完毕后,,这个函数的局部命名空间将会被销毁,所以,python中规定,如果内层函数中访问了外层函数中的变量,即闭包的情况下,这个变量将不会消亡,也就是说,使用闭包,可以保证外层函数中的变量常驻内存)

简易爬虫

 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__()函数

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.不能反复,只能向下执行

原文地址:https://www.cnblogs.com/shanghongyun/p/9455358.html