zoukankan      html  css  js  c++  java
  • 12 函数名的应用 闭包 迭代器

    主要内容:

    1. 函数名的应用,第一类对象

      函数名可以像变量一样使用

      a . 函数名的内存地址

    # 1.函数名的内存地址
    def func():
        print("呵呵")
    print(func)
    # 结果: <function func at 0x1101e4ea0>
    

      b. 函数名可以赋值给其他变量 

    #2函数名可以赋值给其他变量
    def func():
        print("呵呵")
    a = func    # 把函数当成⼀个变量赋值给另一个变量
    a()         # 函数调用 func()

      c. 作为list元素

    def f1():
        print("我是马化腾")
    def f2():
        print("我是马云")
    def f3():
        print("我是马赛克")
    lst = [f1(),f2(),f3()]
    print(lst) 
    '''我是马化腾        #调用f1的结果
    我是马云             #调用f2的结果
    我是马赛克           #调用f3的结果
    [None, None, None]   #因为函数没有返回值,返回none
    

        可以用for循环遍历列表中的元素

    def f1():
        print("我是马化腾")
    def f2():
        print("我是马云")
    def f3():
        print("我是马赛克")
    lst = [f1,f2,f3]    #循环遍历列表
    for c in lst:
        c()             #调用每一个函数
    ''' 我是马化腾
        我是马云
        我是马赛克
    '''

       函数名可以当作函数的参数.

    # 函数名可以当作函数的参数
    def func():
        print("吃了么")
    def func2(fn):
        print("我是func2")
        fn()    # 执⾏行行传递过来的fn    #
        print("我是func2")
    func2(func)     # 把函数func当成参数传递给func2的参数fn.

       作为返回值

    # def func():
    #     def inner():
    #         print("火锅不让吃了. 吃了上火")
    #     return inner
    # ret = func()    # 这里func()执行之后获取到的是inner函数
    # ret()   # 这里是让inner函数执行

    2. 闭包:内部函数访问外部函数的局部变量

    def func():
        name = "alex"   # 常驻内存  防止其他程序改变这个变量
        def inner():
            print(name) # 在内层函数中调用了外层函数的变量,叫闭包, 可以让一个局部变量常驻内存
        return inner
    ret = func()
    ret() # 执行的是inner()

      使用__closure__来检测函数是不是闭包,使用函数名.__closure__,返回cell是闭包,返回none就不是闭包.

    def func1():
        name = "alex"
        def func2():
            print(name)     # 闭包
        func2()
        print(func2.__closure__)    # (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)
    func1()
    # alex
    # (<cell at 0x0000019CE3567588: str object at 0x0000019CE35F8148>

      好处:

       安全

       常住内存,提高效率

    3. 迭代器

      dir()来查看一个对象,数据类型中包含了哪些东西

    lst = [1,2,3]
    print(dir(lst))
    s = '王尼玛'
    print('__iter__'in dir(s))
    print('__iter__'in dir(lst))
    print('__iter__'in dir(123))

      isinstance(对象,类型)                  判断什么对象是否是什么类型

    lst = [1,2,3]
    from collections import Iterable     #可迭代的
    from collections import Iterator     #迭代器
    print(isinstance(lst,Iterable))
    print(isinstance(lst,Iterator))

      

    lst = [1,2,3]
    from collections import Iterable     #k可迭代的
    from collections import Iterator     #迭代器
    it = lst.__iter__()
    print(isinstance(it,Iterable))   #判断是否是可迭代的,迭代器一定是可迭代的
    print(isinstance(it,Iterator))   #迭代器里面一定有__next__(),__iter__()
    print('__iter__'in dir(lst))    #确定是可迭代的
    print('__next__'in dir(lst))    #确定不是一个迭代器  

      可迭代对象(iterable):内部包含__iter__().

      迭代器(iterator):内部含有__iter__和__next__

      可迭代对象: str  list  tuple  set  dict  range

      迭代器:   f(句柄)  

      模拟for循环

    lst = ["皇阿玛", "皇额娘", "容嬷嬷", "紫薇"]
    # 模拟for循环
    it = lst.__iter__()               #获取迭代器
    while True:
        try:
            name = it.__next__()      #迭代器往外拿元素
            print(name)
        except StopIteration: # 拿完了
            break
    

      迭代器的特点:

        省内存

        惰性机制

        只能向前

      

  • 相关阅读:
    注意!!Java-File类
    Hello boke!
    Python 知识要点:变量 可变和不可变
    Python 知识要点:变量及引用
    Python 知识要点:名片管理系统 2.0
    java中x^=y^=x^=y交换整形数据Bug
    servlet读取WEB-INF下txt文件的方法
    设置 load-on-startup 时出错:cvc-complex-type.2.4.a Invalid content was found starting with element 'load
    MyEclipse上访问servlet显示404的问题
    The tomcat server configuration at ServersMyEclipse Tomcat v7.0-config is missinng解决方案
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9325424.html
Copyright © 2011-2022 走看看