python-day11~12_装饰器

# 三元运算符
# 接收结果的变量 = 条件为真的结果 if 条件 else 条件为假的结果

a if a > b else b

 

1,装饰器

import time
def func():
    time.sleep(0.01)
    print('大家好!')

def timmer(f):  #装饰器函数
    def inner():
        start = time.time()
        f()       #被装饰的函数
        end = time.time()
        print(end - start)
    return inner

func = timmer(func)
func()

# 装饰器的作用 —— 不想修改函数的调用方式 但是还想在原来的函数前后添加功能
# timmer就是一个装饰器函数,只是对一个函数 有一些装饰作用

# 原则: 开放封闭原则
# 开放 : 对扩展是开放的
# 封闭 : 对修改是封闭的。原函数内部不能改

其设计核心就是整个软件框架,对扩展是开放的,对修改是封闭的。也就是说,当软件有新的需求变化的时候,只需要通过对软件框架进行扩展来适应新的需求,而不是对框架内部的代码进行修改。

 

2,语法糖

import time

def timmer(f):  #装饰器函数
    def inner():
        start = time.time()
        f()       #被装饰的函数
        end = time.time()
        print(end - start)
    return inner

@timmer @语法糖,功能与func = timmer(func)一样。要紧贴被装饰的函数
def func(): time.sleep(0.01) print('大家好!') #func = timmer(func) func()

 

3,装饰器的固定模板

from functools import wraps  #以将原函数对象的指定属性复制给包装函数对象

def wrapper(func):  #qqxing

       @wraps(func)   #调用functool import
  def inner(*args,**kwargs):
    ret = func(*args,**kwargs)  #被装饰的函数
    return ret
  return inner

@wrapper  #qqxing = wrapper(qqxing)
def qqxing():
  print(123)

 

# print(wahaha.__name__) #查看字符串格式的函数名,依靠founctool import
# print(wahaha.__doc__) #document

 

4,

装饰器函数最多三层嵌套

#带参数的装饰器
#500个函数
# import time
# FLAGE = False   #用FLAG来控制装饰器是否生效
# def timmer_out(flag):
  # def timmer(func):
    # def inner(*args,**kwargs):
      # if flag:
        # start = time.time()
        # ret = func(*args,**kwargs)
        # end = time.time()
        # print(end-start)
        # return ret
      # else:
        # ret = func(*args, **kwargs)
        # return ret
    # return inner
  # return timmer
# # timmer = timmer_out(FLAGE)
# @timmer_out(FLAGE)   #wahaha = timmer(wahaha)
# def wahaha():
  # time.sleep(0.1)
  # print('wahahahahahaha')
#
# @timmer_out(FLAGE)
# def erguotou():
  # time.sleep(0.1)
  # print('erguotoutoutou')

# wahaha()
# erguotou()

<python核心编程-第二版>

 

5,

#多个装饰器装饰一个函数
def wrapper1(func):
  def inner1():
    print('wrapper1 ,before func')
    ret = func()
    print('wrapper1 ,after func')
    return ret
  return inner1

def wrapper2(func):
  def inner2():
    print('wrapper2 ,before func')
    ret = func()
    print('wrapper2 ,after func')
    return ret
  return inner2

def wrapper3(func):
  def inner3():
    print('wrapper3 ,before func')
    ret = func()
    print('wrapper3 ,after func')
    return ret
  return inner3

@wrapper3
@wrapper2  #第二步,wrapper1 = wrapper2(wrapper1)  = wrapper2(inner1) = inner2
@wrapper1  #第一步,f = wrapper1(f) = inner1
def f():
  print('in f')
  return '哈哈哈'

print(f())

 

作业:

 

'''
# 1.默写:带参数的装饰器。需要标注代码的执行步骤。
# 2.整理作业:函数的知识点以及装饰器相关作业。装饰器作业需要自己写一遍,并给作业加注释。
#1
# def wrapper(fu):
#     def inner(*args,**kwargs):
#         ret = fu(*args,**kwargs)
#         return ret
#     return inner
#
# @wrapper  #func = wrapper(func)
# def func(*args,**kwargs):
#     pass

#分析用户输入的命令,按空格进行分割
#1) select查询功能
#2)定义输出的内容和格式顺序
#3)where操作部分,找出对应的列
#4)按照本处关键字定位列
#5)判断部分,判断为真就输出
#6)判断,或要查找的参数

#1,输入的命令按空格分开
#2,如命令第1个字符串是select,调用select_func函数
    #2.1 检查长度,如等4,调用judge函数
        #2.1.1,judge(),检查字符串中的> < =,执行文件行中的判断查找,并调用show_data函数输出
    #2.2,如长度大于4 ,第5个字符是'like',调用search函数
        #2.2.1,search(),检查对应列中的参数是否存在,并调用show_data函数输出
    #2.3,show_data(),按逗号分割参数,把文件中对应参数的部分打印输出;如是*星号,打印本行即可

#3,命令如是quit就退出
'''



def select_func(*args):
    #分析指令和参数
    #查找文件内容并输出
    '''
    用途:select函数
    变量列表:
    com_item为要判断的列
    com_value为要判断的值
    com_print_index为要打印输出列的索引值
    命令行命名com_list:select com_print_index where com_item>com_value
    com = 'select * where age>22'
    :param args:
    :return:
    '''

    def get_index(i):
        # if count == 0:  # 确认是第一行,即格式行,任务:1查找输出项索引值;2找到判断项索引值
        context_head_list = i.split(',')
        context_head_length = len(context_head_list)
        count1 = 0
        flage = False
        com_item_index = 0
        while flage == False and len(context_head_list) > count1:  # 找到要判断列的索引值
            if com_item in context_head_list[count1]:
                com_item_index = count1  # 拿到判断项的索引值
                flage = True
            count1 += 1
        if count1 == context_head_length:
            print('你要找的项中,有的不存在')
        # 找到输出项列的索引值
        com_list_item = com_list[1].split(',')
        if com_list[1] == '*':
            for ii in range(0, len(context_head_list)):
                com_print_index.append(ii)
        else:
            for ii in com_list_item:  # 对命令行输出项格式进行循环
                count2 = 0
                flag = False
                while flag == False and context_head_length > count2:  # 找要查找的列的索引值
                    if ii == context_head_list[count2]:
                        com_print_index.append(count2)  # 拿到要输出项列的索引值
                        flag = True
                    count2 += 1
                if count2 == context_head_length:
                    print('你要找的项中,有的不存在')
        return com_print_index, com_item_index

    def show_data(com_fomat, line):
        # print(com_fomat,line)
        line_print2 = []
        if com_fomat == '*':
            print(line.replace('\n', ''))
        else:
            line_print1 = line.replace('\n', '').split(',')
            for i in list(com_fomat):
                line_print2.append(line_print1[i])
            print(' '.join(line_print2))

    com_list = list(args)
    # print(com_list)
    with open('员工信息表.txt', mode='r', encoding='utf-8') as f:
        count = 0
        com_print_index = []
        com_item_index = 0
        context_head_list = []
        if len(com_list) == 4:  # 说明是<>=的判断操作
            if '>'in com_list[3]:  #说明是>查找
                com_item,com_value = com_list[3].split('>')
                for i in f:
                    # print('这是i', i,'还没有判断')
                    if count == 0:  # 确认是第一行,即格式行,任务:1查找输出项索引值;2找到判断项索引值
                        com_print_index, com_item_index = get_index(i)
                    else:  # 正式数据,非格式行,进行内容判断查找并打印
                        # print(count,context_head_list)
                        # 满足select中的查找条件时打印
                        context_list = i.replace('\n', '').split(',')
                        if int(context_list[com_item_index]) > int(com_value):  # <>=运算,转成整型后运算
                            show_data(com_print_index, i)
                    count += 1
            elif '<'in com_list[3]:
                # print('处理<=部分')
                com_item, com_value = com_list[3].split('<')
                for i in f:
                    # print('这是i', i,'还没有判断')
                    if count == 0:  # 确认是第一行,即格式行,任务:1查找输出项索引值;2找到判断项索引值
                        com_print_index, com_item_index = get_index(i)
                    else:  # 正式数据,非格式行,进行内容判断查找并打印
                        # print(count,context_head_list)
                        # 满足select中的查找条件时打印
                        context_list = i.replace('\n', '').split(',')
                        if int(context_list[com_item_index]) < int(com_value):  # <>=运算,转成整型后运算
                            show_data(com_print_index, i)
                    count += 1
            else:
                # print('处理剩下的=部分,不用再if语句判断了')
                com_item, com_value = com_list[3].split('=')
                for i in f:
                    # print('这是i', i,'还没有判断')
                    if count == 0:  # 确认是第一行,即格式行,任务:1查找输出项索引值;2找到判断项索引值
                        com_print_index, com_item_index = get_index(i)
                    else:  # 正式数据,非格式行,进行内容判断查找并打印
                        # print(count,context_head_list)
                        # 满足select中的查找条件时打印
                        context_list = i.replace('\n', '').split(',')
                        if context_list[com_item_index] == com_value:  # =运算,可能是str或int
                            show_data(com_print_index, i)
                    count += 1
        elif len(com_list) == 6 and 'like' in com_list:  # 说明是like的判断操作
            com_item, com_value = com_list[3], com_list[5]
            for i in f:
                # print('这是like', com_item, com_value)
                if count == 0:  # 确认是第一行,即格式行,任务:1查找输出项索引值;2找到判断项索引值
                    com_print_index, com_item_index = get_index(i)
                else:  # 正式数据,非格式行,进行内容判断查找并打印
                    # print(count,context_head_list)
                    # 满足select中的查找条件时打印
                    context_list = i.replace('\n', '').split(',')
                    if com_value in context_list[com_item_index]:  # <>=运算,转成整型后运算
                        show_data(com_print_index, i)
                count += 1


us_command = input('**员工信息表程序**\n>>>').strip()
us_command = us_command.split()
# print(us_command,len(us_command))
if us_command[0].lower() == 'select':
    select_func(*us_command)
else:
    print('对不起,命令无法识别!')
员工信息表程序

 


 

 

 

 


posted @ 2018-12-19 08:51  烟云过眼  阅读(178)  评论(0)    收藏  举报