装饰器、

装饰器实际就是一个函数

定义:在不改变内部代码和调用方式的基础上增加新的功能

了解装饰器需要了解3个内容:

1、函数即变量

2、高阶函数

  1)、把一个函数名当作实参传给另一个函数

  2)、返回值中包含函数名

例1:

def test():  #定义函数test
print('this is test func')   #打印(下方没有调用,所以不打印) def deco(func):  #定义函数deco,赋个形参(=test)
print('this is deco')  #打印
func()  #调用test函数
return func  #返回值
res = deco(test)  #调用test的内存地址
print(res)  #打印test内存地址

运行结果:

例2:

import time
def test():
time.sleep(3) #睡3秒,期间不占内存
print('this is test func') def deco(func): #func = test
start_time = time.time() #开始执行的时间戳
func() #test()
end_time = time.time() #结束执行的时间戳
print('this is run %s' % (end_time-start_time)) #执行所用的时间
return func #把test的内存地址返回给函数 res = deco(test)
print(res)

运行结果:

3、嵌套函数

嵌套函数,调用时需要,一层一层的调用

def test():
def deco():
print('this is test')
deco()
test()

运行结果:

装饰器练习

 例1:普通装饰器

给下面的函数添加新功能

def test():
print('this is test')
test()

需要定义一个新函数进行添加

def deco(func):     #形参
def wrapper():
func()
print('新功能')  #用打印代替新功能
return wrapper

原函数调用新函数

def test():
print('this is test')
result = deco(test) #定义变量接收repper的内存地址
result()

为了不使原函数的调用方式更改,将变量result 换成 test接收

def test():
print('this is test')
test = deco(test)
test()

为了不更改原函数代码,用@放在原函数前,来代替函数中的“rest = drco(test)”

def deco(func):
def wrapper():
func()
print('新功能')
return wrapper @deco
def test():
print('this is test')
test()

运行结果:

例2:带参数的装饰器

如果原函数带传参数的情况

def test(name):
print('my name is %s '% name)
test('aaa')

那么添加新功能时,需要添加参数

def deco(func):
def wrapper(name): #传参数
func(name) #传参数
print('新功能') 
return wrapper

如果原函数参数很多

def test(name, age, job):
print('my name is %s, my age is %s, my job is %s'% (name, age, job))
test('aaa', 18, 'IT')

那么我们添加功能的函数时也要添加所有的参数

def deco(func):
def wrapper(name, age, job): #传参数
func(name, age, job) #传参数
print('新功能') 
return wrapper

因为比较麻烦所以传参数的快捷方式,不用考虑参数个数

def deco(func):
def wrapper(*args, **kwargs):
func(*args, **kwargs)
print('新功能')
return wrapper
@deco
def test(name, age, job):
print('my name is %s, my age is %s, my job is %s'% (name, age, job))
test('aaa', 18, 'IT')

运行结果:

迭代器、迭代的工具

什么是迭代:指的是一个重复的过程,每一次重复称为一次迭代,并且每一次重复的结果是下一次重复的初始值

while True:
print('hello world')

上面这种方式只有重复,结果并不是下一次的初始,所以不是迭代

例:不用for循环,用while循环将下边几种数据类型逐个取出

字符串:s = 'helloworld'

列表:l = ['a','b','c','d','e']

元组:t = ('a','b','c','d','e')

字典:dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}

集合:set1 = {'a','b','c','d','e'}

文件:f = open('a.txt', 'w', encoding='utf-8')

整数:12345 (不能迭代)

1 = 0
while 1 < len(set1):
print(set1[i])
i += 1

如果经过上边的循环进行测试会发现:

对于序列类型的字符串,列表,元组可以依赖于索引来迭代取值,

但是字典,集合,文件却不行,所以,python必须为我们提供一种不依赖于索引取值的方法,就是迭代器

可迭代对象

判断是否是可迭代对象

可以在pycharm软件中试验,如果有"xx.__iter__"这种用法那么就是能变成可迭代对象

"xx.__iter__"就是把一个对象变成可迭代对象"xx.__iter__" 可以简写成 "iter(xx)"

迭代器对象

"xx.__iter__""xx__next__"这两种方法的就是迭代器对象

print(f is f.__iter__())  #f是上边的文件类型

运行结果:由此看出,文件类型本身就是可迭代对象

 next方式取值

dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}
d_items = dict1.__iter__()
res = d_items.__next__()
res1 = d_items.__next__()
res2 = d_items.__next__()
print(res)

可以调取 res,res1,res2,分别是三个key然后就可以根据key的来调取值了,"xx.__next__()" 可以简写成 "next()"

但是它每取一个值要多一条代码,只能一个一个取,迭代器优点:同一时间在内存里只有一个值,节省内存空间

若想一起取,所以我们要采用while方式

dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}
d_items = dict1.__iter__()
while True:
res = d_items.__next__()
print(res)

因为系统会停止迭代报错

运行结果:

异常处理:try....except +错误

dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}
d_items = dict1.__iter__()
while True:
try:
res = d_items.__next__()
print(res)
except StopIteration:
break

运行结果:,这样就可以取值了,

通过以上的步骤,我们知道了取值的原理及过程,这个原理同样也是for循环的原理

dict1 = {'name' : 'aaa', 'age' : 18, 'job' : 'IT'}
for i in dict1: #相当于dict1.__iter__(),即变成可迭代对象
print(i)

运行结果:

总结

可迭代对象不一定是迭代器对象

迭代器对象一定是可迭代对象

python的装饰器,迭代器用法的更多相关文章

  1. Python学习---装饰器/迭代器/生成器的学习【all】

    Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210

  2. Python的装饰器实例用法小结

    这篇文章主要介绍了Python装饰器用法,结合实例形式总结分析了Python常用装饰器的概念.功能.使用方法及相关注意事项 一.装饰器是什么 python的装饰器本质上是一个Python函数,它可以让 ...

  3. Python函数装饰器高级用法

    在了解了Python函数装饰器基础知识和闭包之后,开始正式学习函数装饰器. 典型的函数装饰器 以下示例定义了一个装饰器,输出函数的运行时间: 函数装饰器和闭包紧密结合,入参func代表被装饰函数,通过 ...

  4. Python @函数装饰器及用法

    1.函数装饰器的工作原理 函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: #funA 作为装饰器函数 def funA(fn): #... fn ...

  5. Python @函数装饰器及用法(超级详细)

    函数装饰器的工作原理是怎样的呢?假设用 funA() 函数装饰器去装饰 funB() 函数,如下所示: #funA 作为装饰器函数 def funA(fn): #... fn() # 执行传入的fn参 ...

  6. Python中装饰器的用法

    定义: 装饰器本身就是一个函数 为其他函数提供附加功能 不改变源代码 不改变原调用方式 装饰器=高阶函数+嵌套函数 知识点: 函数本身就是一个变量(意味着可以被复制给一个变量:test=test(1) ...

  7. 简单说明Python中的装饰器的用法

    简单说明Python中的装饰器的用法 这篇文章主要简单说明了Python中的装饰器的用法,装饰器在Python的进阶学习中非常重要,示例代码基于Python2.x,需要的朋友可以参考下   装饰器对与 ...

  8. Python之装饰器、迭代器和生成器

    在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...

  9. Python函数装饰器原理与用法详解《摘》

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  10. python基础——装饰器

    python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...

随机推荐

  1. C#封装成DLL,并在C#中调用

    一.C#封装成DLL 1.在VS中创建项目选择类库,命名 myDll 2.建立好项目后自动生成的代码如下: 代码修改如下,添加自己要封装的C#代码,注意修饰符必须为public using Syste ...

  2. 利用LoadRunner来进行文件下载的测试

    小强创立的“三级火箭”学习方式 1.参加培训班,即报名缴纳学费后,拉入专属QQ群,由老师亲自上课进行讲解,课后仍提供视频 性能测试培训班招生中,报名与咨询QQ:2083503238 python自动化 ...

  3. asp.net mvc--identity知识点

    asp.net identity 特性 one asp.net identity 持久化控制和易于管理 单元测试 自定义角色 基于声明的身份验证 OWIN集成 NuGet包 identity的类图 简 ...

  4. BA-给排水-供水系统自动控制(转载)

    浙江省建筑设计研究院划 杨绍胤 杨庆 摘 要:探讨供水系统变流量和恒压自动控制和设计方法.关键词: 供水系统 自动控制 传统给水系统常在屋顶设置高位水箱.水从地下水箱用水泵打到高位水箱.从高位水箱通过 ...

  5. [SharePoint2010开发入门经典]一、SPS2010介绍

    本章概要: 1.熟悉SPS基本特性 2.理解SPS基础架构 3.开发SPS工具

  6. codeforces Towers 题解

    Little Vasya has received a young builder's kit. The kit consists of several wooden bars, the length ...

  7. 运行shell命令

    首先将shell命令命名为.sh文件 将上面的代码保存为test.sh.并 cd 到对应文件夹: chmod +x ./test.sh #使脚本具有运行权限 ./test.sh #运行脚本 假设报错/ ...

  8. FFMpeg在Windows下搭建开发环境【转】

    本文转载自:http://blog.csdn.net/wootengxjj/article/details/51758621 版权声明:本文为博主原创文章,未经博主允许不得转载. FFmpeg 是一个 ...

  9. 0x26 广搜变形

    电路维修 这道题虽然乍一看就会想斜对角的两点之间边权受初始电路的影响要么为0要么为1,但是有一个思考点就是可以通过奇偶性,证明相邻的两个点是不可能在同一个电路中.练习一下双端队列. #include& ...

  10. 51nod-1462: 树据结构

    [传送门:51nod-1462] 简要题意: 给出一棵n个点的树,每个点有两个权值v,t 有Q个操作,有两种操作: 1.将x到根上的路径上的点的v值都加上d 2.将x到根上的路径上的点的t值都加上每个 ...