zoukankan      html  css  js  c++  java
  • 装饰器,生成器

    1,命名空间

    在定义一个变量 x = 10 的时候,不仅仅 10被开阔了一个内存地址,x也被开阔了一个内存地址

    存放像x这种变量的地方即命名空间

    有以下三种:

    • locals: 是函数内的名称空间,包括局部变量和形参
    • globals: 全局变量,函数定义所在模块的名字空间
    • builtins: 内置模块的名字空间

    不同变量的作用域由其所在的命名空间所决定

      全局范围:全局存在,全局有效

      局部范围:临时存在,局部有效

    作用域的查找顺序:

        L》E》G》B

        

    • locals 是函数内的名字空间,包括局部变量和形参
    • enclosing 外部嵌套函数的名字空间
    • globals 全局变量,函数定义所在模块的名字空间
    • builtins 内置模块的名字空间

    闭包:

       闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域

      

       def k():

        n = 10

          def k1():

            print(n)

        return k1

        s = k()    #这里 s与k1相等

        print(s)

        s()  ##表面来看,在这里调用k1时,外层的k()已经解除内存空间,但由于闭包的存在,所以在调用的时候依旧包裹了一层作用域

    装饰器

        原则:

    装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象。
    强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式
    装饰器的目标:在遵循1和2的前提下,为被装饰对象添加上新功能

    例:
    ##装饰器
    def login(func):
    def inner():
    func()

    return inner


    @login # henan = login(henan)
    def henan():
    print('----河南专区-----')



    henan()

    #装饰器    ###可在调用时,加入参数
    user_state = False
    def login(func):
    def inner(*args,**kwargs):
    global user_state
    if user_state == False:
    username = input('input name')
    password = input('input password')
    if username == 'name' and int(password) == 123:
    user_state = True
    else:
    quit()

    if user_state:
    func(*args,**kwargs)
    return inner

    @login # henan = login(henan)
    def henan(style):
    print('---- fuck you -----',style)

    henan('3p')

    #装饰器 加入'qq'认证
    user_state = False
    def login(author_type):
      def outter(func)
    def inner(*args,**kwargs):
    global user_state
    if user_state == False:
    username = input('input name')
    password = input('input password')
    if username == 'name' and int(password) == 123:
    user_state = True
    else:
    quit()

    if user_state:
    func(*args,**kwargs)
    return inner
      return outter

    @login('qq') # henan = login('qq')(henan)
    def henan(style):
    print('---- fuck you -----',style)

    henan('3p')


    -----------------------------------------------------------------------------
    生成器:

        列表生成器:[i for i in range(10)]
    在python2中 range 生成列表
           xrange 为生成器
    在python3中
          range 即为生成器

    生成器:并不打印一整张列表,而是传入一串算法,只有在调用时才生成所要的数据


    def find1(file,*args): # 1.模糊查询
    with open(file, 'r', encoding='utf-8') as f_r:
    line = f_r.readline() #取出第一行
    l_l = line.split()
    for i in f_r:
    h = (i.split(','))
    user_x = dict(zip(l_l, h))
    if int(user_x['age']) > 22:
    yield user_x ##此处yield的作用,就是冻结函数的同时,返回后面的东西
    for i in find1('员工信息.txt'):
    print(i)
    在这里由于生成器的存在,即没有被if挑选出的数据,虽然已经从文件内容中调出,但由于没有返回值 所以不被打印

    info ="""staff_id name age phone dept enroll_data
    1,Alex Li,22,13651054608,IT,2013-04-01
    2,Jack Wang,28,13451024608,HR,2015-01-07
    3,Rain Wang,21,13451054608,IT,2017-04-01
    4,Mack Qiao,44,15653354208,Sales,2016-02-01
    5,Rachel Chen,23,13351024606,IT,2013-03-16
    6,Eric Liu,19,18531054602,Marketing,2012-12-01
    7,Chao Zhang,21,13235324334,Administration,2011-08-08
    8,Kevin Chen,22,13151054603,Sales,2013-04-01
    9,Shit Wen,20,13351024602,IT,2017-07-03
    10,Shanshan Du,26,13698424612,Operation,2017-07-02"""

    注:这种长的字符串 注意三引号前后是否由空格,如果存在空格,在以后调出时 会出现错误
      

        

  • 相关阅读:
    C#实现通过拼多多分享微信公众号实现查询优惠券、佣金比率
    淘宝客常用接口整理
    京东联盟开发(1) 商品SKUID采集
    Grafana 安装及 Windows 应用程序服务配置工具 NSSM使用
    Windows Server 2008R2 配置网络负载平衡(NLB)
    IIS 日志分析工具:Log Parser Studio
    curl: (25) Failed FTP upload: 550 解决方案
    搭建TFS 2015 Build Agent环境(四)
    Dump中查看dictionary信息的方法
    Dump中查看DataTime时间方法
  • 原文地址:https://www.cnblogs.com/christmassa/p/9037735.html
Copyright © 2011-2022 走看看