首页 > 编程 > Python > 正文

带你了解python装饰器

2020-02-16 01:43:38
字体:
来源:转载
供稿:网友

1.作用域

 在python中,作用域分为两种:全局作用域和局部作用域。

 全局作用域是定义在文件级别的变量,函数名。而局部作用域,则是定义函数内部。

 关于作用域,我要理解两点:a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改)

 下面我们来看看下面实例:

x = 1def funx():  x = 10  print(x) # 打印出10funx()print(x) # 打印出1

  如果局部没有定义变量x,那么函数内部会从内往外开始查找x,如果没有找到,就会报错

x = 1def funx():  print(x) # 打印出1funx()print(x) # 打印出1x = 1def funx():  def func1():    print(x) # 打印出1  func1()funx()print(x) # 打印出1

  因此,关于作用域的问题,只需要记住两点就行:全局变量能够被文件任何地方引用,但修改只能在全局进行操作;如果局部没有找到所需的变量,就会往外进行查找,没有找到就会报错。

2.高级函数

 我们知道,函数名其实就是指向一段内存空间的地址,既然是地址,那么我们可以利用这种特性来。

 a函数名可以作为一个值

def delete(ps):  import os  filename = ps[-1]  delelemetns = ps[1]  with open(filename, encoding='utf-8') as f_read,/    open('tmp.txt', 'w', encoding='utf-8') as f_write:    for line in iter(f_read.readline, ''):      if line != '/n': # 处理非空行        if delelemetns in line:          line = line.replace(delelemetns,'')        f_write.write(line)  os.remove(filename)  os.rename('tmp.txt',filename)def add(ps):  filename = ps[-1]  addelemetns = ps[1]  with open(filename, 'a', encoding='utf-8') as fp:    fp.write("/n", addelemetns)def modify(ps):  import os  filename = ps[-1]  modify_elemetns = ps[1]  with open(filename, encoding='utf-8') as f_read, /      open('tmp.txt', 'w', encoding='utf-8') as f_write:    for line in iter(f_read.readline, ''):      if line != '/n': # 处理非空行        if modify_elemetns in line:          line = line.replace(modify_elemetns, '')        f_write.write(line)  os.remove(filename)  os.rename('tmp.txt', filename)def search(cmd):  filename = cmd[-1]  pattern = cmd[1]  with open(filename, 'r', encoding="utf-8") as f:    for line in f:      if pattern in line:        print(line, end="")    else:      print("没有找到")dic_func ={'delete': delete, 'add': add, 'modify': modify, 'search': search}while True:  inp = input("请输入您要进行的操作:").strip()  if not inp:    continue  cmd_1 = inp.split()  cmd = cmd_1[0]  if cmd in dic_func:    dic_func[cmd](cmd_1)  else:    print("Error")

 b.函数名可以作为返回值

def outer():  def inner():    pass  return inners = outer()print(s)######输出结果为#######<function outer.<locals>.inner at 0x000000D22D8AB8C8>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表