装饰器,生成器

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"""

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

    

原文地址:https://www.cnblogs.com/christmassa/p/9037735.html