装饰器语法糖的应用 def auth(func): def wrapper(*args,**kwargs): username=input('请输入用户名').strip() pwd=input('请输入密码').strip() if username=='egon'and pwd=='123': print('登录成功') res=func(*args,**kwargs) return res else: print('用户名和密码错误') return wrapper @auth def index(): time.sleep(3) print('延迟三秒') return 123 index()
#什么也不做的装饰器 import time def deco(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper @deco def index(): print('welcome to index page') time.sleep(3) @deco def home(name): print('welcomet %s to home page') time.sleep(2) index() home('egon') 认证功能的装饰器 import time current_usre={'user':None} def deco(func): #什么也不做的装饰器 def wrapper(*args,**kwargs): username=input('请输入用户名<<:').strip() pwd=input('请输入密码<<:').strip() if username=='egon' and pwd=='123': print('登录成功') current_usre['user']=username res = func(*args, **kwargs) return res else: print('登录失败') return wrapper @deco def index(): print('welcome to index page') time.sleep(3) @deco def home(name): print('welcome %s to home page'%name) time.sleep(2) index() home('egon')
有参装饰器
1.什么是迭代:迭代是一个重复的过程,并且每一次重复都是基于上一次结果来的
迭代器 迭代的工具
迭代:
l=['a','b','c'] def iterator(item): i=0 while i < len(item): print(l[i]) i+=1
可迭代的对象:在python中但凡内置有__iter__方法的对象都是可迭代的对象 字符串、列表、元组、字典、集合、文件都是可迭代的对象 (除了数字之外都是) str='hello' l=[1,2,3] tup1=(1,2,3) dic={'x':1} s1={'a','b','c'} f=open('a.txt','w',encoding='utf-8')
找到一种不依赖索引的迭代取值的方式,这就用到了迭代器
迭代器:迭代取值工具,可迭代的对象执行__iter__的方法得到的返回值就是迭代器对象 dic={'x':1,'y':2,'z':3} iter_dic=dic.__iter__() #iter_dic是迭代器 print(iter_dic.__next__()) #x print(iter_dic.__next__()) #y print(iter_dic.__next__()) #z
有了迭代器之后得到一种不依赖索引,统一的取值方式,
while 迭代取值
info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'} # info=[1,2,3,4,5] info_iter=info.__iter__() while True: print(info_iter.__next__()) #这种方式会报错 info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'} # info=[1,2,3,4,5] info_iter=info.__iter__() while True: try: print(info_iter.__next__()) except StopIteration: break
文件的迭代取值 l=open('a.txt','r',encoding='utf-8') iter_1=l.__iter__() while True: try: print(iter_1.__next__()) except StopIteration: break
迭代器的优点
提供了一种可不依赖于索引取值的方式
1.获取可迭代对象的方式:无须获取.python内置str,list,tuple,dict,set,file都是可迭代对象
2.特点:
内置有__iter__方法都是可迭代的对象,执行该方法会拿到一个迭代器对象
迭代器对象
1、获取迭代器对象的方式
执行可迭代对象__iter__方法,拿到的返回值就是迭代器对象
迭代器对象:文件对象本身就是迭代器对象
2、特点
内置有__next__的方法。执行该方法会拿到迭代器对象中的一个值
内置有__iter__的方法,执行该方法会拿到迭代器本身
'''
x='hello' iter_x=x.__iter__() print(iter_x.__iter__().__iter__().__iter__()is iter_x)
for循环叫迭代器循环
迭代器更加节省内存
迭代器的缺点:
取值麻烦,只能一个一个取,只能往后取
并且是一次性的,无法用len获取长度for循环原理分析:
1、for 循环称之为迭代器循环,in后跟的必须是可迭代的对象
2、for循环会执行in后对象的__iter__方法,拿到迭代器对象
3、然后调用迭代器对象的__next__方法,拿到一个返回值赋值给line,执行一次循环体
4、周而复始,直到取值完毕,for循环会检测到异常自动结束循环
作业: 一:编写注册功能 要求用户输入账号 然后对账号进行合法性校验,必须是字母,并且用户名不能重复,否则重新输入 要求用户输入密码 然后对密码进行合法性校验,长度至少6位,连续输入两次,两次输入不一致则重新输入 将合法的账号密码写入文件 二 编写用户认证装饰器,要求输入一次密码成功后记录用户状态,下次无需重复输入账号密码,如果连续输错三次账号密码则退出 三 实现转账功能 编写有参函数,传入源账户名和目标账户名,实现原账户减去money,目标账户加上money def transfer(src_user,dst_user,money): pass 选做作业:参考答案http://www.cnblogs.com/linhaifeng/articles/7532497.html#_label6 一:编写下载网页内容的函数,要求功能是:用户传入一个url,函数返回下载页面的结果 二:为题目五编写装饰器,实现缓存网页内容的功能: 具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中 扩展功能:用户可以选择缓存介质/缓存引擎,针对不同的url,缓存到不同的文件中 三:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作 四:编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定 注意:时间格式的获取 import time time.strftime('%Y-%m-%d %X') 明日默写: 基于file、mysql、ldap的有参装饰器 预习内容:http://www.cnblogs.com/linhaifeng/articles/7580830.html 生成器 三元表达式 列表生成式、字典生成式、生成器表达式 递归 今晚考试:编写购物车程序 用户名和密码存放于文件中,格式为:egon|egon123 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额