zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    mysql数据库查询库中所有表所占空间大小
    mysql行转列
    mysql重置密码
    POJ1426 Find The Multiple —— BFS
    POJ3279 Fliptile —— 状态压缩 + 模拟
    POJ1077 Eight —— IDA*算法
    POJ1077 Eight —— A*算法
    POJ1077 Eight —— 双向BFS
    POJ1077 Eight —— 反向BFS
    POJ1077 Eight —— 正向BFS
  • 原文地址:https://www.cnblogs.com/surpass123/p/12562135.html
Copyright © 2011-2022 走看看