python学习--day11(函数的进阶)
1.三元运算
c=a if a>b else b
条件成立,取if前面的,条件不成立,取else后面的。
c等于两者中的大较大的
2.命名空间
(1)内置命名空间:python中内置的函数
(2)全局命名空间:除了函数的颞部名字之外,我们 自己代码里所有的名字
(3)局部命名空间:函数内部的名字
3.作用域
(1)内置的命名空间,在任何地方都可以用
(2)全局的命名空间,在自己写的的代码部分可以用
(3)局部的命名空间,只能在自己写的函数内使用
4.作用域的作用范围
(1)范围大小:内置>全局>局部--局部(嵌套)
(2)作用域链:在局部内可以使用全局命名空间内的名字,在全局内部不能使用局部命名空间内的名字,
(3)对于局部变量来说,自己有的变量就用自己的,没有就往上寻找
5.关键字global和nonlocal的作用
(1)global 修改全局空间里的变量值
(2)nonlocal 只修改局部命名空间里的,只往上修改一层
6.函数名的本质(可以当中变量使用,函数名是第一类对象概念)
(1)首先是一个函数的内存地址
(2)可以赋值,也可以作为列表等可变容器的元素。
(3)可以作为函数的参数,返回值
7.闭包
(1)内部函数引用了外部函数的变量,内部的函数就叫做闭包。
(2)装饰器是闭包闭包的一种应用
(3)闭包的作用
8.装饰器函数
(1)装饰器的作用:在函数前后添加功能,可以改善函数的使用效果。
装饰器作业:
#编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件),要求登录成功一次,后续的函数都无需再输入用户名和密码 # 注意:从文件中读出字符串形式的字典,可以用eval('{"name":"egon","password":"123"}')转成字典格式 user_dic={ 'egon':'123', 'alex':'alex3714', 'wupeiqi':'wu13', 'yuanhao':'123123' } with open('db.txt','w',encoding='utf-8') as f: f.write(str(user_dic)) with open('db.txt','r',encoding='utf-8') as f: res=f.read() # print(res,type(res)) user_dic=eval(res) #eval()的功能是可以在字符串中提取python的命令,并且执行 print(user_dic,type(user_dic)) # 定义一个路径,以后文件不在同一路径的时候只要修改这里就可以了 db_path=r'路径t' login_dic={ 'user':None, #可以在后面设置登录者的姓名 'status':False, #相当于设置一个登录的状态 } def auth(func): def wrapper(*args,**kwargs): if login_dic['user'] and login_dic['status']: res = func(*args, **kwargs) return res name=input('your name: ') password=input('your password: ') with open(db_path,'r',encoding='utf-8') as f: user_dic=eval(f.read()) if name in user_dic and password == user_dic[name]: print('login ok') login_dic['user']=name #一次登录成功后,修改姓名 login_dic['status']=True #一次登录成功后,并且修改登录的状态 res=func(*args,**kwargs) return res else: print('login err') return wrapper @auth #auth(index) def index(): print('welecome to index') @auth def home(name): print('welecome %s to home page' %name) index() home('egon')
''' 编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果 ''' from urllib.request import urlopen import os cache_path=r'路径' def make_cache(func): def wrapper(*args,**kwargs): if os.path.getsize(cache_path):#可以通过os模块获取文件的大小 #有缓存 print('\033[45m=========>有缓存\033[0m') with open(cache_path,'rb') as f: res=f.read() else: res=func(*args,**kwargs) #下载 with open(cache_path,'wb') as f: #制作缓存 f.write(res) return res return wrapper @make_cache def get(url): return urlopen(url).read() # 本体思路,可以通过判断文件是否存在,如果存在,则去文件中读取 # 不存在,则去网上下载 # print('================>first') # print(get('https://www.python.org')) # print('================>second') # print(get('https://www.python.org')) # print('================>third') # print(get('https://www.python.org')) # 扩展思路: #缓存多个不同网站的内容: #思路:hash每个url,用得到的值做成文件名,一个网站一个文件名, # 然后每次根据传进来的url进行hash得到的结果去寻找文件
9.有参数的装饰器
# 有参数的装饰器 def deco(auth_type='file'): def auth(func): def wrapper(*args,**kwargs): if auth_type == 'file': print('文件的认证方式') elif auth_type == 'ldap': print('ldap认证方式') elif auth_type == 'mysql': print('mysql认证方式') else: print('不知到的认证方式') return wrapper return auth @deco(auth_type='abc') #@auth #index=auth(index) def index(): print('welecome to index') @deco(auth_type='ldap') def home(name): print('welecome %s to home page' %name) index() home('egon')

浙公网安备 33010602011771号