码迷,mamicode.com
首页 > 编程语言 > 详细

Python之第十八天的努力--装饰器初识

时间:2020-06-18 21:45:08      阅读:62      评论:0      收藏:0      [点我收藏+]

标签:效率   user   fun   迭代   bin   dex   大小   嵌套   strip   

01 内容回顾

  1. 匿名函数:一句话函数。多与内置函数,列表推导式结合。
  2. 内置函数:***加key的。min max sorted map reduce filter
  3. 闭包:
    1. 内层函数对外层函数非全局变量的使用。
    2. 一定要存在嵌套函数中。
    3. 作用:保证数据安全。自由变量不会再内存中消失,而且全局还引用不到。

02 练习

# 1.看代码分析结果
# func_list = []
#
# for i in range(10):
#     func_list.append(lambda :i)
#
# v1 = func_list[0]()
# v2 = func_list[5]()
# print(v1,v2)
# # 9 9



# 2.看代码分析结果
# func_list = []
#
# for i in range(10):
#     func_list.append(lambda x:x+i)
#
# v1 = func_list[0](2)
# v2 = func_list[5](1)
# print(v1,v2)
# # 11 10



# 3.看代码分析结果
# func_list = []
#
# for i in range(10):
#     func_list.append(lambda x:x+i)
#
# for i in range(0,len(func_list)):
#     result = func_list[i](i)
#     print(result)
# # 0
# # 2
# # 4
# # 6
# # 8
# # 10
# # 12
# # 14
# # 16
# # 18



# 4.看代码写结果(面试题):
# def func(name):
#     v = lambda x:x+name
#     return v
#
# v1 = func(‘太白‘)
# v2 = func(‘alex‘)
# v3 = v1(‘银角‘)
# v4 = v2(‘金角‘)
# print(v1,v2,v3,v4)
# # <function func.<locals>.<lambda> at 0x02EDECD8>
# # <function func.<locals>.<lambda> at 0x02EDEF18>
# # 银角太白
# # 金角alex



# 5.看代码写结果【面试题】
# result = []
# for i in range(10):
#     func = lambda : i      # 注意:函数不执行,内部代码不会执行。
#     result.append(func)
#
# print(i)
# print(result)
# v1 = result[0]()
# v2 = result[9]()
# print(v1,v2)
# # 9
# # [10个地址]
# # 9 9



# 6.看代码分析结果【面试题】
# def func(num):
#     def inner():
#         print(num)
#     return inner
#
# result = []
# for i in range(10):
#     f = func(i)
#     result.append(f)
#
# print(i)
# print(result)
# v1 = result[0]()
# v2 = result[9]()
# print(v1,v2)
# # 9
# # [十个地址]
# # 0
# # 9
# # None None



# 7.看代码写结果【新浪微博面试题】
#
# def func():
#     for num in range(10):
#         pass
#     v4 = [lambda :num+10,lambda :num+100,lambda :num+100,]
#     result1 = v4[1]()
#     result2 = v4[2]()
#     print(result1,result2)
# func()
# # 109 209



# 8.请编写一个函数实现将IP地址转换成一个整数。【面试题,较难,可以先做其他题】
#
# 如 10.3.9.12 转换规则为二进制:
#         10            00001010
#          3            00000011
#          9            00001001
#         12            00001100

# s1 = ‘10.3.9.12‘
# l1 = s1.split(‘.‘)
# # print(l1)
# s = ‘‘
# for i in l1:
#     i = str(bin(int(i)))
#     i = i[2:]
#     i = ‘0‘*(8 - (len(i)) ) + i
#     s += i + ‘\t‘
# print(s)

# 再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
# s1 = ‘00001010 00000011 00001001 00001100‘



# 9.用map来处理字符串列表,把列表中所有人都变成sb,比方alex_sb
# name = [‘oldboy‘,‘alex‘,‘wusir‘]
# ret = map(lambda x:x+‘_sb‘,name)
# print(list(ret))

# print([n+‘_sb‘for n in name])
# print(list(map(lambda x:x+‘_sb‘,name)))



# 10.用map来处理下述l,然后用list得到一个新的列表,列表中每个人的名字都是sb结尾
# l = [{‘name‘:‘alex‘},{‘name‘:‘y‘}]
# ret = map(lambda x:x[‘name‘] + ‘_sb‘,l)
# print(list(ret))

# print(list(map(lambda x:x[‘name‘]+‘sb‘,l)))


# 11.用filter来处理,得到股票价格大于20的股票名字
#
# shares={
#  ‘IBM‘:36.6,
#  ‘Lenovo‘:23.2,
#  ‘oldboy‘:21.2,
#  ‘ocean‘:10.2,
# }
# ret = filter(lambda x:x[1]>20,shares.items())
# for i in ret:
#     print(i[0])



# 12.有下面字典,得到购买每只股票的总价格,并放在一个迭代器中结果:list一下[9110.0, 27161.0,......]
#
# portfolio = [
#   {‘name‘: ‘IBM‘, ‘shares‘: 100, ‘price‘: 91.1},
# {‘name‘: ‘AAPL‘, ‘shares‘: 50, ‘price‘: 543.22},
# {‘name‘: ‘FB‘, ‘shares‘: 200, ‘price‘: 21.09},
# {‘name‘: ‘HPQ‘, ‘shares‘: 35, ‘price‘: 31.75},
# {‘name‘: ‘YHOO‘, ‘shares‘: 45, ‘price‘: 16.35},
# {‘name‘: ‘ACME‘, ‘shares‘: 75, ‘price‘: 115.65}]
# ret = map(lambda x:x[‘shares‘] * x[‘price‘],portfolio)
# print(list(ret))



# 13.用filter过滤出单价大于100的股票。
# portfolio = [
#   {‘name‘: ‘IBM‘, ‘shares‘: 100, ‘price‘: 91.1},
# {‘name‘: ‘AAPL‘, ‘shares‘: 50, ‘price‘: 543.22},
# {‘name‘: ‘FB‘, ‘shares‘: 200, ‘price‘: 21.09},
# {‘name‘: ‘HPQ‘, ‘shares‘: 35, ‘price‘: 31.75},
# {‘name‘: ‘YHOO‘, ‘shares‘: 45, ‘price‘: 16.35},
# {‘name‘: ‘ACME‘, ‘shares‘: 75, ‘price‘: 115.65}]
# ret = filter(lambda x:x[‘price‘] < 100,portfolio)
# print(list(ret))



# 14.有下列三种数据类型,
#
# l1 = [1,2,3,4,5,6]
# l2 = [‘oldboy‘,‘alex‘,‘wusir‘,‘太白‘,‘日天‘]
# tu = (‘**‘,‘***‘,‘****‘,‘*******‘)
#  写代码,最终得到的是(每个元祖第一个元素>2,第三个*至少是4个。)
# [(3, ‘wusir‘, ‘****‘), (4, ‘太白‘, ‘*******‘)]这样的数据。
# li = []
# obj = zip(l1,l2,tu)
# for i in obj:
#     if i[0] > 2 and len(i[2]) >= 4:
#         li.append(i)
# print(li)

# print(list(filter(lambda x: x[0] > 2 and len(x[2]) >= 4, zip(l1,l2,tu))))



# 15.有如下数据类型(实战题):
#
# l1 = [ {‘sales_volumn‘: 0},
#     {‘sales_volumn‘: 108},
#     {‘sales_volumn‘: 337},
#     {‘sales_volumn‘: 475},
#     {‘sales_volumn‘: 396},
#     {‘sales_volumn‘: 172},
#     {‘sales_volumn‘: 9},
#     {‘sales_volumn‘: 58},
#     {‘sales_volumn‘: 272},
#     {‘sales_volumn‘: 456},
#     {‘sales_volumn‘: 440},
#     {‘sales_volumn‘: 239}]
#  将l1按照列表中的每个字典的values大小进行排序,形成一个新的列表。
# l2 = sorted(l1,key=lambda x:x[‘sales_volumn‘])
# print(l2)

# print(sorted(l1,key=lambda x:x[‘sales_volumn‘]))
# print(sorted(l1,key=lambda x:x[‘sales_volumn‘],reverse=True))



# 16.求结果(面试题)
# v = [lambda :x for x in range(10)]
#
# print(v)
# print(v[0])
# print(v[0]())
# [10个地址]
# 一个地址
# 9

# [function 113,function 154561,....个]
# [function 113]
# 9


# 17.求结果(面试题)
# v = (lambda :x for x in range(10))
#
# print(v)
# print(v[0])
# print(v[0]())
# print(next(v))
# print(next(v)())

# 生成器地址
# 报错
# 报错
# 第一个lambda的地址
# 1



# 18.map(str,[1,2,3,4,5,6,7,8,9])输出是什么? (面试题)
# map(str,[1,2,3,4,5,6,7,8,9])
# print(map(str,[1,2,3,4,5,6,7,8,9]))                 # <map object at 0x0340DE70>
# print(list(map(str,[1,2,3,4,5,6,7,8,9])))           # [‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘]



# 19.求结果:(面试题,比较难,先做其他题)
#
# def num():
#  return [lambda x:i*x for i in range(4)]
# print([m(2)for m in num()])



# 20.有一个数组[34,1,2,5,6,6,5,4,3,3]请写一个函数,找出该数组中没有重复的数
# 的总和(上面数据的么有重复的总和为1+2=3)(面试题)
# l1 = [34,1,2,5,6,6,5,4,3,3]
# list



# 21.写一个函数完成三次登陆功能:
#
# 用户的用户名密码从一个文件register中取出。
#
# register文件包含多个用户名,密码,用户名密码通过|隔开,每个人的用户名密码占用文件中一行。
#
# 完成三次验证,三次验证不成功则登录失败,登录失败返回False。
#
# 登陆成功返回True。
def get_user_pwd():
    user_dict = {}
    with open(‘register‘, encoding=‘utf-8‘) as f:
        for line in f:
            line_list = line.strip().split(‘|‘)
            user_dict[line_list[0].strip()] = line_list[1].strip()
    return user_dict

def login():
    u_dict = get_user_pwd()
    count = 1
    while count < 4:
        username = input(‘请输入用户名:‘).strip()
        password = input(‘请输入密码:‘).strip()
        if username in u_dict and password == u_dict[username]:
            print(‘登录成功‘)
            return True
        else:
            print(‘用户名密码错误。请重新登录‘)
        count += 1
    return False
login()

03 装饰器初识

# 装饰器:装饰,装修
# 增加新的功能

# 开放封闭原则:
# 开放:对代码的拓展封闭。
# 封闭:对源码的修改是封闭的。

# 装饰器:完全遵循开放封闭原则。
# 装饰器:在不改变原函数的代码以及调用方式的前提下,为其增加新的功能。



# 版本一:写一些代码测试一下index函数的执行效率。
# def index():
#     ‘‘‘有很多代码.....‘‘‘
#     time.sleep(2)
#     print(‘欢迎登陆博客园首页‘)
#
# def dariy():
#     ‘‘‘有很多代码.....‘‘‘
#     time.sleep(2)
#     print(‘欢迎登陆博客园日记页面‘)

import time
# print(time.time())      # 格林威治时间。
# print(111)
# time.sleep(2)
# print(222)

# start_time = time.time()
# index()
# end_time = time.time()
# print(end_time-start_time)

# start_time = time.time()
# dariy()
# end_time = time.time()
# print(end_time-start_time)

# 版本一问题:如果测试别人的代码,必须重新赋值粘贴。



# 版本二:利用函数,解决代码重复使用的问题
# import time
# def index():
#     ‘‘‘有很多代码.....‘‘‘
#     time.sleep(2)
#     print(‘欢迎登陆博客园首页‘)
#
# def dariy():
#     ‘‘‘有很多代码.....‘‘‘
#     time.sleep(2)
#     print(‘欢迎登陆博客园日记页面‘)
#
#
# def timmer(f):
#     start_time = time.time()
#     f()
#     end_time = time.time()
#     print(end_time - start_time)
#
# timmer(index)

# 版本二的问题:原来index函数源码没有变化,给原函数添加了一个新的功能测试原函数的执行效率
# 原函数的调用方式改变了



# 版本三:不能改变原函数的调用方式
import time
def index():
    ‘‘‘有很多代码.....‘‘‘
    time.sleep(2)
    print(‘欢迎登陆博客园首页‘)

def timmer(f):
    def inner():
        start_time = time.time()
        f()                     # index()
        end_time = time.time()
        print(end_time - start_time)
    return inner

# timmer(index)  ---->  index()
# ret = timmer(index)   # inner
# ret()               # inner()
index = timmer(index)
index()


# def func():
#     print(‘in func‘)
#
# def func1():
#     print(‘in func1‘)
#
# func()
# func = 666
# func()

Python之第十八天的努力--装饰器初识

标签:效率   user   fun   迭代   bin   dex   大小   嵌套   strip   

原文地址:https://www.cnblogs.com/szheng/p/13159912.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!