代码改变世界

python学习第三日

2019-07-09 17:52  FriendG  阅读(272)  评论(0)    收藏  举报

学习了嵌套和闭包函数,还有装饰器:

定义函数,无关于该函数是否先进行的定义

比如

def x():

def x():
    print('aa')
    xx()
def xx():
   print('xx')

f()

  该结果为

此时是无关乎函数定义的先后的

作用域的nonlocal和gobal中

nonlocal是代表着局部变量

gobal代表着全局变量

def sum():
    global x
    x = 100
    print(x)
    def s():
        x = 2
        print(x)
    s()
    print(x)
sum()

可以发现全局变量不受嵌套函数中变量改变的影响

但是使用局部变量的话

def sum():
    x = 100
    print(x)
    def s():
        nonlocal x
        x = 2
        print(x)
    s()
    print(x)
sum()

可以发现嵌套函数中的x变量的值将函数内外的值都改变了

但是使用gobal和nonlocal这两个中不能进行直接赋值

需要先改变变量在进行复制否者会提示错误,该变量在python3.6之后才可以使用

修饰器的使用可以在不改变源代码的基础上再给代码附加上一些额外的功能

比如计时这一类的

import time
def timer(func):
    def wrapper(*arg,**kwargs):
        start_time = time.time()
        res=func(*arg,**kwargs)
        stop_time = time.time()
        print(stop_time-start_time)
        return res
    return wrapper
@timer
def xx():
    time.sleep(3)
    print('xx')
xx()

此外还有含参的修饰器

 def auth(driver='file'):
     def auth2(func):
         def wrapper(*arg,**kwargs):
             name = input("user:")
             pwd=input("pwd:")
             if driver == 'file':
                 if name == 'egon' and pwd == '123':
                     print('login successful')
                     res = func(*arg,**kwargs)
                     return res
             elif driver == 'ldap':
                 print('ldap')
         return wrapper
     return auth2

 @auth(driver='file')
 def foo(name):
     print(name)
 foo('egon')