装饰器语法糖的应用
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
启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序
允许用户根据商品编号购买商品
用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
可随时退出,退出时,打印已购买商品和余额