有参装饰器的引入:

import time
import random
from functools import wraps def timmer(func):
@wraps(func)
def wrapper():
# wrapper.__doc__=func.__doc__
start_time = time.time()
func()
stop_time = time.time()
print('run time is %s' % (stop_time-start_time))
# wrapper.__doc__=func.__doc__
return wrapper @timmer
def index():
'index function'
time.sleep()
print('welcome to index page') # print(index.__doc__)
index()
print(index.__doc__)
结果:
welcome to index page
run time is 3.000171661376953
index function

先来简单介绍一下functools.wraps。

我们在使用 Decorator 的过程中,难免会损失一些原本的功能信息。而functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module____name____doc__,或者通过参数选择。

def foo():
'foo function------------>'
pass print(help(foo))
结果:
foo()
foo function------------> None

help函数python的一个内置函数(它是python自带的函数,任何时候都可以被使)。

help函数能作什么:

在使用python来编写代码时,会经常使用python 调用函数自带函数或模块,一些不常用的函数或是模块的用途不是很清楚,这时候就需要用到help函数来查看帮助。

这里要注意下,help()函数是查看函数或模块用途的详细说明,而dir()函数是查看函数或模块内的操作方法都有什么,输出的是方法列表。

怎么使用help函数查看python模块中函数的用法:

help( )括号内填写参数,操作方法很简单。

使用help函数查看帮助时需要注意哪些问题:

1、查看一个模块的帮助
>>>help('sys')
之后它回打开这个模块的帮助文档

2、查看一个数据类型的帮助
>>>help('str')
返回字符串的方法及详细说明

>>>a = [1,2,3]
>>>help(a)
这时help(a)则会打开list的操作方法
>>>help(a.append)
会显示list的append方法的帮助

下面来几个栗子:

def foo():
'foo fuction'
print(foo.__doc__)
foo.__doc__ = 'asdfasdfasdfasdfsadfasdfasdfsadfasdfasfas'
pass print(help(foo))
结果:
Help on function foo in module __main__: foo()
foo fuction None
def foo():
'foo fuction'
print(foo.__doc__)
foo.__doc__ = 'asdfasdfasdfasdfsadfasdfasdfsadfasdfasfas'
pass print(foo.__doc__)
结果:
foo fuction
def foo():
'foo fuction'
print(foo.__doc__)
foo.__doc__ = 'asdfasdfasdfasdfsadfasdfasdfsadfasdfasfas'
pass foo.__doc__ = 'abcdefg'
print(foo.__doc__)
结果:
abcdefg
def foo():
'foo fuction'
print(foo.__doc__)
foo.__doc__ = 'asdfasdfasdfasdfsadfasdfasdfsadfasdfasfas'
pass foo.__doc__ = 'abcdefg'
print(help(foo))
结果:
Help on function foo in module __main__: foo()
abcdefg None
def foo():
'foo fuction'
print(foo.__doc__)
foo.__doc__ = 'asdfasdfasdfasdfsadfasdfasdfsadfasdfasfas'
pass foo()
print(foo.__doc__)
结果:
foo fuction
asdfasdfasdfasdfsadfasdfasdfsadfasdfasfas

有参装饰器

db_path=r'C:\Users\Administrator\PycharmProjects\untitled4\db.txt'

login_dic = {
'user': None,
'status': False,
}
def deco(auth_type='file'):
def auth(func):
def wrapper(*args, **kwargs):
if auth_type == 'file':
if login_dic['user'] and login_dic['status']:
res = func(*args, **kwargs)
return res name = input('your name: ')
password = input('your password: ')
with open(db_path, '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')
elif auth_type == 'ldap':
print('ldap认证方式')
elif auth_type == 'mysql':
print('mysql认证方式')
else:
print('不知到的认证方式')
return wrapper
return auth @deco(auth_type='abc') #@auth #index=auth(index)
def index():
print('welcome to index') @deco(auth_type='ldap')
def home(name):
print('welcome %s to home page' % name) index() home('egon')
结果:
不知到的认证方式
ldap认证方式
def deco(auth_type='file'):
def auth(func):
def wrapper(*args,**kwargs):
if auth_type == 'file':
print('文件的认证方式')
elif auth_type == 'ldap':
print('ldap认证方式')
elif auth_type == 'mysql':
print('mysql认证方式')
else:
print('不知到的认证方式')
return wrapper
return auth @deco(auth_type='abc') #@auth #index=auth(index)
def index():
print('welcome to index') @deco(auth_type='ldap')
def home(name):
print('welcome %s to home page' % name) index() home('egon')
结果:
不知到的认证方式
ldap认证方式

思考:

  • 缓存多个不同网站的内容:
  • 思路:hash每个url,用得到的值做成文件名,一个网站一个文件名,
  • 然后每次根据传进来的url进行hash得到的结果去寻找文件

迭代器

  • 迭代:
    1. 重复
    2. 下一次重复是基于上一次的结果

'''
python为了提供一种不依赖于索引的迭代方式,
python会为一些对象内置__iter__方法
obj.__iter__称为可迭代的对象
'''

obj.__iter__() 得到的结果就是迭代器

得到的迭代器:既有__iter__又有一个__next__方法

d={'a':,'b':,'c':}

i=d.__iter__() #i叫迭代器
print(i)
print(i.__next__())
print(i.__next__())
print(i.__next__())
# print(i.__next__()) #StopIteration
结果:
<dict_keyiterator object at 0x0000000001DBF2C8>
a
b
c

迭代器的优点:

  • 1:提供了一种不依赖于索引的取值方式
  • 2:惰性计算。节省内存

迭代器的缺点:

  • 1:取值不如按照索引取值方便
  • 2:一次性的。只能往后走不能往前退
  • 3:无法获取长度

迭代器的应用:

  • 1. 提供了一种不依赖索引的统一的迭代方法
  • 2. 惰性计算,比如取文件的每一行
l = [, , ]
for item in l: #i=l.__iter__()
print(item)
结果:
 作业:
编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-- :: f1 run写入到文件中
注意:时间格式的获取
import time
time.strftime('%Y-%m-%d %X') 判断下列数据类型是可迭代对象or迭代器 s='hello'
l=[,,,]
t=(,,)
d={'a':}
set={,,}
f=open('a.txt') 分别用依赖索引和不依赖索引两种方式迭代上述对象 选做题:
基于课上所讲网页缓存装饰器的基础上,实现缓存不同网页的功能
要求,用户提交的不同url,都能缓存下来,对相同的url发起下载请求,优先从缓存里取内容
答案:
# 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-- :: f1 run写入到文件中
# 注意:时间格式的获取
# import time
# time.strftime('%Y-%m-%d %X')
#
# import time
#
# log_path=r'C:\Users\Administrator\PycharmProjects\untitled\log.txt'
# def log_deco(func):
# def wrapper(*args,**kwargs):
# with open(log_path,'w') as f:
# func(*args, **kwargs)
# a = f.write(time.strftime('%Y-%m-%d %X'))
# return a
#
# # res=func(*args,**kwargs)
# # return res
# return wrapper
#
# @log_deco
# def f1():
# print('welcome to f1 page')
#
# f1() # 判断下列数据类型是可迭代对象or迭代器
#
# s='hello'
# l=[,,,]
# t=(,,)
# d={'a':}
# set={,,}
# f=open('a.txt')
#
#字符串,列表,元祖,字典,集合,文件都是可迭代对象,可以object.__iter__
# s='hello'
# s1=s.__iter__()
# print(s1.__next__())
# print(s1.__next__())
# print(s1.__next__())
# print(s1.__next__())
# print(s1.__next__()) # l=[,,,]
# l1=l.__iter__()
# print(l1.__next__())
# print(l1.__next__())
# print(l1.__next__())
# print(l1.__next__()) # t=(,,)
# t1=t.__iter__()
# print(t1.__next__())
# print(t1.__next__())
# print(t1.__next__()) # d={'a':}
# d1=d.__iter__()
# print(d1.__next__()) # set={,,}
# set1=set.__iter__()
# print(set1.__next__())
# print(set1.__next__())
# print(set1.__next__()) # f=open('a.txt')
# f1=f.__iter__()
# print(f1.__next__())
# print(f1.__next__())
# print(f1.__next__())
# print(f1.__next__())
# print(f1.__next__())
# print(f1.__next__()) # 分别用依赖索引和不依赖索引两种方式迭代上述对象
# s='hello'
# l=[,,,]
# t=(,,)
# d={'a':}
# set={,,}
# f=open('a.txt')
#
#
# for i1 in s:
# print(i1)
#
# i1=
# while i1<len(s):
# print(s[i1])
# i1+=
#
#
# for i2 in l:
# print(i2)
#
# i2=
# while i2<len(l):
# print(l[i2])
# i2+=
#
#
# for i3 in t:
# print(i3)
#
# i3=
# while i3<len(t):
# print(t[i3])
# i3+=
#
#
# for i4 in d:
# print(i4) # for i5 in set:
# print(i5)
# # with open('a.txt','r',encoding='utf-8')as f:
# for line in f:
# print(line,end='') #
# 选做题:
# 基于课上所讲网页缓存装饰器的基础上,实现缓存不同网页的功能
# 要求,用户提交的不同url,都能缓存下来,对相同的url发起下载请求,优先从缓存里取内容

python--有参装饰器、迭代器的更多相关文章

  1. python 有参装饰器与迭代器

    1.有参装饰器 模板: def auth(x): def deco(func): def timmer(*args,**kwargs ): res = func(*args,**kwargs ) re ...

  2. python带参装饰器的改良版

    简单点就是这种 def deco2(param=1): def _deco2(fun): def __deco2(*args, **kwargs): print (param) fun(*args, ...

  3. Python中的装饰器,迭代器,生成器

    1. 装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的 ...

  4. python中的装饰器迭代器生成器

    装饰器: 定义:本质是函数(装饰其它函数) 为其它函数添加附加功能 原则: 1 不能修改被装饰函数源代码    2 不修改被装饰函数调用方式 实现装饰器知识储备: 1 函数即‘’变量‘’ 2 高阶函数 ...

  5. Python无参装饰器

    需求:想要在test_func函数前后执行一些代码   1.第一步(定义函数,将调用原函数,使用新函数替换) def test_func(): return 'test_func' def test_ ...

  6. python基础语法8 叠加装饰器,有参装饰器,wraps补充,迭代器

    叠加装饰器: 叠加装饰器 - 每一个新的功能都应该写一个新的装饰器 - 否则会导致,代码冗余,结构不清晰,可扩展性差 在同一个被装饰对象中,添加多个装饰器,并执行. @装饰1 @装饰2 @装饰3 de ...

  7. python学习Day14 带参装饰器、可迭代对象、迭代器对象、for 迭代器工作原理、枚举对象、生成器

    复习 函数的嵌套定义:在函数内部定义另一个函数 闭包:被嵌套的函数 -- 1.外层通过形参给内层函数传参 -- 2.返回内部函数对象---->  延迟执行, 开放封闭原则: 功能可以拓展,但源代 ...

  8. python函数、装饰器、迭代器、生成器

    目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象:  函数是第一类对象,即函数可以当作数据传递 ...

  9. python基础之装饰器扩展和迭代器

    wraps模块 让原函数保留原来的说明信息 import time import random from functools import wraps def auth(func): '''auth ...

随机推荐

  1. PHP计算经纬度在百度多边形区域内

    最近做一个项目需要使用到区域,并且要判断当前的经纬度是否在区域内,已便对应业务需求变化.废话不多说直接上代码: /** * 验证区域范围 * @param array $coordArray 区域 * ...

  2. springBoot01-helloworld-完成一个简单的RESTful API

    1.访问http://start.spring.io/ 2.选择构建工具Maven Project.Spring Boot版本 2.0.1,以及一些工程基本信息 ,最后点击Generate Proje ...

  3. spring-cloud:eureka server单机、双机、集群示例

    1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.GITHUB地址 https://github.com/nbfujx/springCl ...

  4. HDU 6058 Kanade's sum —— 2017 Multi-University Training 3

    Kanade's sum Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  5. 【Linux】批量结束某一脚本的进程

    ps -ef | grep **.sh |grep -v grep | awk '{print $2}' | xargs kill -9

  6. LOJ 3094 「BJOI2019」删数——角标偏移的线段树

    题目:https://loj.ac/problem/3094 弱化版是 AGC017C . 用线段树维护那个题里的序列即可. 对应关系大概是: 真实值的范围是 [ 1-m , n+m ] :考虑设偏移 ...

  7. CodeForces - 1051D (线性DP)

    题目:https://codeforces.com/problemset/problem/1051/D 题意:一个2行n列的矩形,上面有黑白块,然后问你怎么布置才能有k个连通块,问有多少种方案数 思路 ...

  8. python中冒泡 排序法练习题

    # 第四题:写出冒泡排序函数,可以排序任意类型的元素,可以逆序 # 1.实现冒泡排序算法 # 2.可以排序任意类型的元素 # 3.能够通过参数设置进行逆序,默认升序 def my_sort(lt,ke ...

  9. 经典JS 判断上传文件大小和JS即时同步电脑时间

    我也是新手,还是一个JS笨,有一些网站要实现的功能要自己写么? 答案是不会,去问同事大佬吧,闲简单.就在晚上看了一些其他大佬们写的JS效果, 代码很少.占用网站CPU也小的多.可以一用, 废话少扯.代 ...

  10. STM32时钟配置方法详解

      一.在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. ①HSI是高速内部时钟,RC振荡器,频率为8MHz. ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源, ...