zoukankan      html  css  js  c++  java
  • 函数名的运用,装饰器语法糖的运用

    函数名的作用:函数也是第一类对象

      1.函数名就是函数的内存地址

      2.函数名可以作为变量

      3.函数名可以作为函数的参数

      4.函数名还可以当做函数的返回值

      5.函数名可以作为容器类型的元素(列表中的一个元素)

    globals()    locals()

      globals()   #作用是  返回全局变量的一个字典

      locals() # 返回当前位置的局部变量的字典

    def func1():
        a =1
        b = 2
        print(globals())
        print(locals())    #{'b': 2, 'a': 1}
    func1()
    #{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__':
    <_frozen_importlib_external.SourceFileLoader object at 0x0000026005C0D240>,
    '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__':
    'G:/骑士计划/2018-8-17/8-17草稿.py', '__cached__': None, 'lis': [1, 2, 3, 4], 'func1': <function func1 at 0x0000026005BB2EA0>}
    #{'b': 2, 'a': 1}

    闭包:即在函数内部,内层函数对外层函数的变量(非全局变量)的引用,并返回这样就形成了一个闭包

      判断这个函数是否形成了闭包,用    函数名.__closure__       来进行判断

    def wraaper():
        name = 'alex'
        def inner():
            print(name)
        print(inner.__closure__)    #输出结果不是None,就说明形成了闭包
        inner()
        return inner
    wraaper()
    输出结果#(<cell at 0x00000254669A85B8: str object at 0x0000025466A39110>,)
    alex    
    a = "alex"
    def func1(b):
        # a = "alex"    #即相当于在函数内部定义了一个变量a = "alex”
        def func2():
            print(b)
        print(func2.__closure__)
        func2()
    func1(a)  #运行时将外部的变量a加载到函数内
    #输出结果为(<cell at 0x0000025E4A4285B8: str object at 0x0000025E4A4B9110>,)
    alex
    #所以这种情况是一个闭包

      闭包的作用:当程序运行时,遇到函数执行,他就会在内存中开辟一个空间,(局部名称空间),如果这个函数内部形成了闭包。那么他就不会随着函数的结束而消失。

    可迭代对象  迭代器

      可迭代对象定义:对象内部含有__iter__方法的就是可迭代对象。(str,list,dict,tuple,tange())

              而当可迭代对象签订了可迭代协议就形成了迭代器

      迭代器定义:内部含有__iter__和__next__的方法就是迭代器。即存在__next__的方法就是迭代器

      可迭代对象与迭代器的区别:

      1.可迭代对象不能直接取值,而迭代器可以直接取值

      2.迭代器非常节省内存,

      3.迭代器每次只能去一个值

      4,迭代器是单向的,一直到底

    判断一个对象是否是可迭代对象的方法:

      1.判断__iter__是否在这个对象里

    lis = [1,2,3]
    print("__iter__" in dir(lis))    #返回结果为True则说明该对象是可迭代对象

      dir()  显示出你这个参数的所有方法,装在一个列表里

      2.from collections import Iterable     在 文件(colletions) 导入 这个  可迭代的(Iterable)

       from collections import Iterator   在文件(colletions)导入  这个    迭代器( Iterator)  (自我理解,非专业术语)

    from collections import Iterable
    from collections import Iterator
    
    print(isinstance('alex',Iterable))  # True 
    print(isinstance('alex',Iterator))  # False    是否是迭代器
    #isinstance() 判断类型,即“alex”是不是可迭代对象    (自我解释,非专业)

    可迭代对象转换成迭代器的方法

      1.lis.__iter__()

      2.iter(lis)

    # lis = [1, 2, 3]  # 可迭代对象
    # # ite1 = lis.__iter__()  # 迭代器  <list_iterator object at 0x0000027A183BFFD0>
    # ite1 = iter(lis)  # 迭代器  <list_iterator object at 0x0000027A183BFFD0>
    # print(ite1)

    迭代器取值:next(),或者 对象.__next__()

    lis = [1,2,3]
    l1 = lis.__iter__()
    print(l1)
    print(l1.__next__())    #1
    print(next(l1))        #2

    例题,用while循环模拟出for循环的过程(了解,)

    # iter1 = s1.__iter__()
    #
    # while 1:
    #     try:  
    #         print(iter1.__next__())
    #     except StopIteration: # StopIteration报错原因
    #         break  #遇到抱歉就结束循环
    先了解。

     装饰器语法糖

    相当于

  • 相关阅读:
    JavaScript中的闭包
    SQL 备忘
    SqlServer 2005 升级至SP2过程中出现"身份验证"无法通过的问题
    unable to start debugging on the web server iis does not list an application that matches the launched url
    Freebsd 编译内核
    Freebsd 6.2中关于无线网络的设定
    【Oracle】ORA01219
    【Linux】Windows到Linux的文件复制
    【Web】jar命令行生成jar包
    【Linux】CIFS挂载Windows共享
  • 原文地址:https://www.cnblogs.com/yuncong/p/9494369.html
Copyright © 2011-2022 走看看