day13 有参装饰器/可迭代对象与迭代器对象/迭代器对象的总结

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

  

原文地址:https://www.cnblogs.com/wangmiaolu/p/9155111.html