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

  • 相关阅读:
    MASM32汇编中关于栈的总结
    《2022牛客寒假算法基础集训营1》
    《Denso Create Programming Contest 2022(AtCoder Beginner Contest 239)》
    最短路 JAVA
    《 Codeforces Round #122 (Div. 1) B》
    AtCoder Regular Contest 135
    《2022牛客寒假算法基础集训营3》
    《整数拼接》
    《AtCoder Regular Contest 134 C》
    java的一些操作
  • 原文地址:https://www.cnblogs.com/shanghongyun/p/9455358.html
Copyright © 2020-2023  润新知