8-day8-列表解析-装饰器-迭代器

 

有参装饰器:

# 既要传函数,又要传参数
dict_1 = {}
print(dict_1)

def deco(keys):
    def add_dict(fun):
        def wrapper():
            dict_1[keys] = fun
            print(dict_1)
        return wrapper
    return add_dict

@deco('shooping_cart')
def shooping_cart():
    print('shopping successful')



@deco('buy_vip')
def buy_vip():
    print('buy vip successful')


@deco('book_tickets')
def book_tickets():
    print('booking ticket successfully')


shooping_cart()
buy_vip()
book_tickets()

装饰器作业:

# 四:编写装饰器,为多个函数加上认证功能


# with open('a.txt', 'r', encoding='utf-8') as f:
#     res = f.read()
#     user_dic = eval(res)

login_dic = {
    'user': None,         # None 为python数据类型,并不完全=0
    'status': False,
}

# 内层函数传参数,外层传函数名


def auth(func):
    def wrapper(*args, **kwargs):
        if login_dic['use r'] and login_dic['status']:
            res = func(*args, **kwargs)
            return res
        name = input('your name: ')
        password = input('your password: ')
        with open('a.txt', '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
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
def get(url):
    res = urlopen(url).read()
    return res
get('http://www.baidu.com')
# print(get('http://www.baidu.com'))


# 六:为题目五编写装饰器,实现缓存网页内容的功能:
#     具体:实现下载的页面存放于文件中,如果文件内有值(文件大小不为0),就优先从文件中读取网页内容,否则,就去下载,然后存到文件中


from urllib.request import urlopen
import os


def make_cache(func):
    def wrapper(*args, **kwargs):
        if os.path.getsize('b.txt'):
            print('=========>有缓存')
            with open('b.txt', 'rb') as f:
                res = f.read()

        else:
            res = func(*args, **kwargs)
            with open('b.txt', 'wb') as f:
                f.write(res)

        return res

    return wrapper


@make_cache
def get(url):
    return urlopen(url).read()

get('http://www.baidu.com')


# 七:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作

func_dic = {}


def deco(key):
    def wrapper(func):
        func_dic[key]=func
    return wrapper


@deco('f1')
def f1():
    print('from f1')


@deco('f2')
def f2():
    print('from f2')

f1('f1')
f2('f2')

print(func_dic)

while True:
    cmd = input('>>:').strip()
    if cmd in func_dic:
        func_dic[cmd]()

装饰器作业:

# 1 整理今天装饰器代码(每人手写一份,注意,是手写,交到小组长手里,明天我检查),准备明天默写
#
# 2 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到文件中
#     注意:时间格式的获取
#         import time
#         time.strftime('%Y-%m-%d %X')
#
# 3 判断下列数据类型是可迭代对象or迭代器
#
# s='hello'
# l=[1,2,3,4]
# t=(1,2,3)
# d={'a':1}
# set={1,2,3}
# f=open('a.txt')
#
# 4 分别用依赖索引和不依赖索引两种方式迭代上述对象
#
# 5 选做题:
#     基于课上所讲网页缓存装饰器的基础上,实现缓存不同网页的功能
#     要求,用户提交的不同url,都能缓存下来,对相同的url发起下载请求,优先从缓存里取内容


# 2 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到文件中
#     注意:时间格式的获取
#         import time
#         time.strftime('%Y-%m-%d %X')

import time


def run_func(func1):
    def print_log():
        with open('run.log', 'a', encoding='utf-8') as f:
            r_time = time.strftime('%Y-%m-%d %H:%M:%S\n')
            f.write(r_time)
            func1()
    return print_log


@run_func
def func2():
    print('函数执行')

func2()


# 3 判断下列数据类型是可迭代对象or迭代器
#
# s='hello'
# l=[1,2,3,4]
# t=(1,2,3)
# d={'a':1}
# set={1,2,3}
# f=open('a.txt')

s = 'hello'  可迭代对象
s.__int__()  迭代器


l=[1,2,3,4]
l.__iter__()
i=l.__iter__()
print(i.__next__())
print(i.__next__())
print(i.__next__())


t=(1,2,3)
t.__iter__()
d={'a':1}
d.__iter__()
set={1,2,3}
set.__iter__()
f=open('a.txt')
f.__iter__()

迭代器

# eg 迭代器,以来索引的迭代
l=[1, 2, 3, 4, 5]
count = 0
while count < len(l):
    print(l[count])
    count += 1

# 不依赖索引的迭代
for count in range(len(l)):
    print(l[count])


# python为了提供一种不依赖索引的迭代方式
# python会为一些对象内置__iter__方法
# obj.__iter__ 称为迭代对象
# obj.__iter__得到的结果就是迭代器
# 得到的迭代器:既有obj.__iter__ 又有obj.__next__
d = {'q': 1, 'd': 2, 'ds': 3}
for i in d :
    print(i)

  有参装饰器习题

#带参数的装饰器和不带参数的装饰器

#!/usr/bin/env python
#encoding: utf-8
def start_info():
    print ('电视剧开头曲.......')
    print ('开始唱歌.......')
def end_info():
    print ('电视剧结束曲.......')

def filter(start_info,end_info): #接收俩函数
    def outer(main_fun): #接收装饰的函数
        def app(*argv,**kwargs): #接收装饰的函数的参数
            print('******************************')
            start_info()
            main_fun(*argv,**kwargs)#接收装饰的函数的参数
            end_info()
            print('******************************')
        return app
    return outer
#先把函数传进去,然后在用里面的函数装饰
#传函数的装饰器必须有三个def ,第一个是接受函数,第二个是装饰函数的,返回第三个函数对象
# 把需要装饰的函数重新定义,然后调用调用
#1: filter(start_info,end_info):
#2: @outer ->  one_info = outer(one_info)
@filter(start_info,end_info) #这里传入俩个函数
def one_info(name,info):
    print ('this is one')
    print('wolcome to tv %s .......' % (name))
    print('wolcome to tv %s .......' % (info))

@filter(start_info,end_info)
def two_info(name,info):
    print('this is two')
    print('wolcome to tv %s .......' % (name))
    print('wolcome to tv %s .......' % (info))

@filter(start_info,end_info)
def three_info(name,info):
    print('this is three')
    print('wolcome to tv %s .......' % (name))
    print('wolcome to tv %s .......' % (info))

if __name__ == "__main__":
    print('三国演义三部曲开始。。。。。。。。')
    print('第一部。。。。。。。。。。。。。。')
    one_info('三国电视剧第一部', '三国大战')

    print('第二部。。。。。。。。。。。。。。')
    two_info('三国电视剧第二部', '三国英雄')

    print('第三部。。。。。。。。。。。。。。')
    three_info('三国电视剧第三部', '三国鼎力')


#!/usr/bin/env python
#encoding: utf-8
def start_info():
    print ('电视剧开头曲.......')
    print ('开始唱歌.......')
def end_info():
    print ('电视剧结束曲.......')

def outer(main_fun): #接收装饰的函数
    def app(*argv,**kwargs): #接收装饰的函数的参数
        print('******************************')
        start_info()
        main_fun(*argv,**kwargs)#接收装饰的函数的参数
        end_info()
        print('******************************')
    return app

#1: @outer ->  one_info = outer(one_info)
@outer
def one_info(name,info):
    print ('this is one')
    print('wolcome to tv %s .......' % (name))
    print('wolcome to tv %s .......' % (info))

@outer
def two_info(name,info):
    print('this is two')
    print('wolcome to tv %s .......' % (name))
    print('wolcome to tv %s .......' % (info))

@outer
def three_info(name,info):
    print('this is three')
    print('wolcome to tv %s .......' % (name))
    print('wolcome to tv %s .......' % (info))

if __name__ == "__main__":
    print ('三国演义三部曲开始。。。。。。。。')
    print ('第一部。。。。。。。。。。。。。。')
    one_info('三国电视剧第一部','三国大战')

    print('第二部。。。。。。。。。。。。。。')
    two_info('三国电视剧第二部','三国英雄')

    print('第三部。。。。。。。。。。。。。。')
    three_info('三国电视剧第三部','三国鼎力')

 

posted @ 2017-06-19 19:17  ccccdc  阅读(160)  评论(0编辑  收藏  举报