day18---作业

1、编写课上讲解的有参装饰器准备明天默写

(1)案例1

from functools import wraps

def outter(func):
    @wraps(func)
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return wrapper

@outter
def student(name,age=18):
    """学生资料查询"""
    print(name,age)
    return name

student('姜春',age=20)
print(student.__name__)
print(student.__doc__)

效果如下:

姜春 20
student
学生资料查询

(2)案例2

def auth(login_type):
    def check_login(func):
        def wrapper(*args,**kwargs):
            if login_type == 'file':
                print('基于文件认证!')
                res = func(*args,**kwargs)
            elif login_type == 'mysql':
                print('基于数据库认证!')
                res = func(*args,**kwargs)
            elif login_type == 'ldap':
                print('基于ldap域认证!')
                res = func(*args,**kwargs)
            else:
                print('去TM,你输的什么鬼!')
                res = None
            return res
        return wrapper
    return check_login

@auth('file')
def student(name,age=18):
    print(name,age)
    return name

@auth('mysql')
def read(name,book='《python从入门到放弃》'):
    print(name,book)
    return book

@auth('ldap')
def openstack_desktop(name,way='GPU'):
    print(name,way)
    return way

student('jiangchun')
read('egon')
openstack_desktop('tank')

运行效果:

基于文件认证!
jiangchun 18
基于数据库认证!
egon 《python从入门到放弃》
基于ldap域认证!
tank GPU

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

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from prettytable import PrettyTable

user_dict = {}


def outter(key):
    def loadname(func):
        user_dict[key] = [func, func.__doc__]
    return loadname


@outter('0')
def login():
    """登录"""
    print('登录')


@outter('1')
def register():
    """注册"""
    print('注册')


@outter('2')
def transfer():
    """转账"""
    print('转账')


@outter('3')
def query():
    """查询"""
    print('查询')


@outter('4')
def recharge():
    """充值"""
    print('充值')


tb = PrettyTable(field_names=['功能编号', '功能名称'])
for k in user_dict:
    tb.add_row([k,user_dict[k][1]])
flag = True
while flag:
    print(tb)
    cmd = input('请输入功能编号:').strip()
    if cmd.isdigit():
        if cmd in user_dict:
            user_dict[cmd][0]()
        else:
            print('该功能尚未开发')
    else:
        print('请输入一个整数')
    _continue = input('是否继续选择功能(y,n):').strip()
    flag = False if _continue.lower() == 'n' else True

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

import time, os
from functools import wraps

logfile = os.path.dirname(os.path.abspath(__file__)) + '/run.log'


def loginfo(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        with open(logfile, mode='a', encoding='utf-8') as f:
            f.write('[%s]:%s is running
' % (time.strftime('%Y-%m-%d %X'),func.__name__))
        res = func(*args,**kwargs)
        return res
    return wrapper

@loginfo
def student(name,age=18,gender='male'):
    print('姓名:{}
年龄:{}
性别:{}'.format(name,age,gender))
    return name

student('姜春憨批',age=20,gender='female')

效果:

[root@Surpass day18]# cat run.log 
[2020-03-24 20:25:50]:student is running
[2020-03-24 20:26:02]:student is running

4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象

(1)字符串

str_obj = 'hello world!
'
str_iter = iter(str_obj)

while 1:
    try:
        print(next(str_iter))
    except StopIteration:
        break

(2)列表

list_obj = [i for i in range(10) if i%2 == 0]
list_iter = iter(list_obj)

while 1:
    try:
        print(next(list_iter))
    except StopIteration:
        break

(3)元组

tuple = (i for i in range(20) if i%2 ==1)
tuple_iter = iter(tuple)

while 1:
    try:
        print(next(tuple_iter))
    except StopIteration:
        break

(4)字典

dic_obj = {'name':'egon','age':18,'gender':'male'}
dic_iter = iter(dic_obj)
while 1:
    try:
        print(next(dic_iter))
    except StopIteration:
        break

(5)集合

s = {1,3,5,7,9}
s_iter = iter(s)
while 1:
    try:
        print(next(s_iter))
    except StopIteration:
        break

(6)文件对象

f = open('run.log', mode='r', encoding='utf-8')
f_iter = iter(f)
while 1:
    try:
        print(next(f_iter))
    except StopIteration:
        break

5、自定义迭代器实现range功能

ef my_range(start, stop, step=1):
    while abs(start - stop) > 0:
        try:
            yield start
            start += step
        except StopIteration:
            break


for i in my_range(1, 8):
    print(i)

运行结果:

1
2
3
4
5
6
7



原文地址:https://www.cnblogs.com/surpass123/p/12562135.html