python函数:叠加装饰器、迭代器、自定义迭代器、生成式
本文目录:
一、叠加多个装饰器
二、迭代器
三、自定义迭代器
四、xxx生成式
一、叠加多个装饰器
# 加载装饰器就是将原函数名偷梁换柱成了装饰器最内层那个wrapper函数
# 在加载完毕后,调用原函数其实就是在调用wrapper函数 # 当一个被装饰的对象同时叠加多个装饰器时
# 装饰器的加载顺序是:自下而上
# 装饰器内wrapper函数的执行顺序是:自上而下
''' import time def timmer(func): #func=wrapper2的内存地址
def wrapper1(*args, **kwargs):
print('===================================>wrapper1运行了')
start=time.time()
res = func(*args, **kwargs) #===========================>跳到wrapper2去执行了,
stop=time.time()
print('run time is %s' %(stop - start))
return res
return wrapper1 def auth(engine='file'):
def xxx(func): # func=最原始那个index的内存地址
def wrapper2(*args, **kwargs):
print('===================================>wrapper2运行了')
name=input('username>>>: ').strip()
pwd=input('password>>>: ').strip()
if engine == 'file':
print('基于文件的认证')
if name == 'egon' and pwd == '123':
print('login successfull')
res = func(*args, **kwargs)
return res
elif engine == 'mysql':
print('基于mysql的认证')
elif engine == 'ldap':
print('基于ldap的认证')
else:
print('错误的认证源')
return wrapper2
return xxx @timmer # index=timmer(wrapper2的内存地址) #index=wrapper1的内存地址
@auth(engine='file') #@xxx #index=xxx(最原始那个index的内存地址) #index=wrapper2的内存地址
def index():
print('welcome to index page')
time.sleep(2) index() #wrapper1的内存地址()
''' import time def timmer(func): #func=wrapper2的内存地址
def wrapper1(*args, **kwargs):
print('===================================>wrapper1运行了')
start=time.time()
res = func(*args, **kwargs) #===========================>跳到wrapper2去执行了,
stop=time.time()
print('run time is %s' %(stop - start))
return res
return wrapper1 def auth(engine='file'):
def xxx(func): # func=最原始那个index的内存地址
def wrapper2(*args, **kwargs):
print('===================================>wrapper2运行了')
name=input('username>>>: ').strip()
pwd=input('password>>>: ').strip()
if engine == 'file':
print('基于文件的认证')
if name == 'egon' and pwd == '':
print('login successfull')
res = func(*args, **kwargs)
return res
elif engine == 'mysql':
print('基于mysql的认证')
elif engine == 'ldap':
print('基于ldap的认证')
else:
print('错误的认证源')
return wrapper2
return xxx @auth(engine='file')
@timmer
def index():
print('welcome to index page')
time.sleep(2) index() #wrapper1的内存地址()
二、迭代器
1. 什么是迭代器
#迭代指的是一个重复的过程,每一次重复都是基于上一次的结果而来的
li=['a','b','c','d','e']
li=('a','b','c','d','e')
li='hello' i=0
while i < len(li):
print(li[i])
i+=1
#迭代器指的是迭代取值的工具,该工具的特点是可以不依赖于索引取值
2. 为何要用迭代器
为了找出一种通用的&可以不依赖于索引的迭代取值方式
3. 如何用迭代器
可迭代的对象:但凡内置有.__iter__方法的对象都称之为可迭代的对象
迭代器对象:既内置有__iter__方法,又内置有__next__方法
关于__iter__方法:
调用可迭代对象的__iter__会得到一个迭代器对象、
调用迭代器对象的__iter__会得到迭代器本身
4. 总结迭代器的优缺点:
优点:
1. 提供了一种通用的&可以不依赖于索引的迭代取值方式
2. 同一时刻在内存中只有一个值,更加节省内存 缺点:
1. 取指定值不如索引灵活,并且迭代器是一次性的
2. 无法预知迭代器数据的个数
# 可迭代的对象: str,list,tuple,dict,set,文件对象
# 迭代器对象: 文件对象 # 可迭代的对象=====》迭代器对象:调用可迭代对象内置的__iter__方法会有一个返回值,该返回值就是对应的迭代器对象
dic={'x':1,'y':2,'z':3} # iter_dic=dic.__iter__()
# # print(iter_dic)
# res1=iter_dic.__next__()
# print(res1)
#
# res2=iter_dic.__next__()
# print(res2)
#
# res3=iter_dic.__next__()
# print(res3)
#
# res4=iter_dic.__next__()
# print(res4) # print(dic.__iter__().__next__())
# print(dic.__iter__().__next__())
# print(dic.__iter__().__next__()) # dic={'x':1,'y':2,'z':3}
# # dic=['a','b','c']
# iter_dic=dic.__iter__()
#
# # iter_dic=open(r'D:\python笔记\test.txt',mode='rt',encoding='utf-8')
#
# while True:
# try:
# print(iter_dic.__next__())
# except StopIteration:
# break # for准确地说应该是迭代器循环,for循环的原理如下:
#1. 先调用in后面那个值的__iter__方法,得到迭代器对象
#2. 执行迭代器.__next__()方法得到一个返回值,然后赋值给一个变量k,运行循环体代码
#3, 循环往复,直到迭代器取值完毕抛出异常然后捕捉异常自动结束循环 dic={'x':1,'y':2,'z':3}
iter_dic=dic.__iter__()
print(iter_dic)
print(iter_dic.__iter__()) # for k in dic: #iter_dic=dic.__iter__()
# print(k) # with open(r'D:\上海python全栈4期\day13\今日内容',mode='rt',encoding='utf-8') as f:
# for line in f: #iter_f=f.__iter__()
# print(line)
三、自定义迭代器
yield关键字:只能用在函数内
在函数内但凡包含有yield关键字,再去执行函数,就不会立刻运行函数体代码了
会得到一个返回值,该返回值成之为生成器对象,生成器本质就是迭代器 总结yield:
1. 提供一种自定义迭代器的解决方案
2. yield可用于返回值
yield VS return
相同点:都可以用于返回值
不同点:yield可以暂停函数,yield可以返回多次值,而return只能返回值一次值函数就立刻终止
# def func():
# print('=====>第一次')
# yield 1
# print('=====>第二次')
# yield 2
# print('=====>第三次')
# yield 3
# print('=====>第四次')
#
# # print(func)
#
# g=func()
# # print(g.__iter__().__iter__().__iter__() is g)
# # iter(g) #g.__iter__()
# # next(g) #g.__next__()
#
# res1=next(g)
# print(res1)
#
# res2=next(g)
# print(res2)
#
# res3=next(g)
# print(res3)
#
# res4=next(g)
# print(res4) def my_range(start,stop,step=1):
while start < stop:
yield start
start+=step res=my_range(1,5,2) # 1 3 next(res)
next(res)
# print(next(res))
# for item in res:
# print(item) for item in my_range(1,5,2):
print(item)
四、xxx生成式
三元表达式
def max2(x,y):
if x > y:
return x
else:
return y
x=10
y=20
# res='条件成立的值' if x > y else '条件不成立的值'
print(res) res = "条件成立" if x > y else "条件不成立"
列表生成式
l=[]
for i in range(1,11):
if i > 4:
res='egg%s' %i
l.append(res)
print(l)
l=['egg%s' %i for i in range(1,11) if i > 4]
print(l) names=['egon','lxx','yyx','cw','alex','wxx']
l=[]
for name in names:
if name != 'egon':
res='%s_DSB' %name
l.append(res)
print(l) l=['%s_DSB' %name for name in names if name != 'egon']
print(l)
生成器表达式
# res=(i**2 for i in range(3))
# print(res)
# print(next(res))
# print(next(res))
# print(next(res))
# print(next(res)) with open(r'D:\上海python全栈4期\day13\今日内容',mode='rt',encoding='utf-8') as f:
# data=f.read()
# print(len(data)) #1025 # res=0
# for line in f:
# res+=len(line)
# print(res) # res=sum((len(line) for line in f))
# res=sum(len(line) for line in f)
# print(res) # res=max([len(line) for line in f])
# res=max((len(line) for line in f))
res=max(len(line) for line in f)
print(res)
字典生成式
items=[('name','egon'),('age',18),('sex','male')]
dic={}for k,v in items: dic[k]=vprint(dic)
res={k:v for k,v in items if k != 'sex'}print(res)
res={i for i in 'hello'}print(res)
python函数:叠加装饰器、迭代器、自定义迭代器、生成式的更多相关文章
- Python函数06/装饰器
Python函数06/装饰器 目录 Python函数06/装饰器 内容大纲 1.装饰器 1.1 开放封闭原则 1.2 装饰器 2.今日练习 内容大纲 1.装饰器 1.装饰器 1.1 开放封闭原则 扩展 ...
- python函数、装饰器、迭代器、生成器
目录: 函数补充进阶 函数对象 函数的嵌套 名称空间与作用域 闭包函数 函数之装饰器 函数之迭代器 函数之生成器 内置函数 一.函数补充进阶 1.函数对象: 函数是第一类对象,即函数可以当作数据传递 ...
- python——函数之装饰器
1 问题 实际生活中,我们很难一次性就把一个函数代码写得完美无缺.当我们需要对以前的函数添加新功能时,我们应该怎么做? 2 问题解决思路 (1)可以直接修改原来的函数,在函数内直接修改.当我们对多个函 ...
- Python 函数之装饰器
1.函数 #### 第一波 #### def foo(): print 'foo' foo #表示是函数 foo() #表示执行foo函数 #### 第二波 #### def foo(): print ...
- python函数闭包-装饰器-03
可调用对象 callable() # 可调用的(这个东西加括号可以执行特定的功能,类和函数) 可调用对象即 callable(对象) 返回为 True 的对象 x = 1 print(cal ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法: from ...
- Python函数的装饰器修复技术(@wraps)
@wraps 函数的装饰器修复技术,可使被装饰的函数在增加了新功能的前提下,不改变原函数名称,还继续使用原函数的注释内容: 方便了上下文环境中不去更改原来使用的函数地方的函数名: 使用方法 from ...
- Python函数加工厂-装饰器
引言: 函数和装饰器好比程序界的加工厂: 1.函数一般可用来加工一种或者多种数据类型的数据:字符串.数字.列表.字典等 举一个简单例子:已知半径求面积 def s(r): s = 3.14 * r * ...
- Python函数的装饰器
函数的装饰器. 1. 装饰器 开闭原则: 对功能的扩展开放 对代码的修改是封闭 通用装饰器语法: def wrapper(fn): def inner(*args, **kwargs): # 聚合 & ...
- python 函数之装饰器,迭代器,生成器
装饰器 了解一点:写代码要遵循开发封闭原则,虽然这个原则是面向对象开发,但也适用于函数式编程,简单的来说,就是已经实现的功能代码不允许被修改但 可以被扩展即: 封闭:已实现功能的代码块 开发:对扩张开 ...
随机推荐
- SqlServer:SqlServer(服务器磁盘监控,创建管理员账号分配权,添加链接服务器,查询CPU,查询内存)
1.服务器磁盘监控 (1)总链接服务上开启所有链接服务器的RPC: ----------------------总链接服务器上面,开启每个服务器的RPC --exec sp_serveroption ...
- v-for与v-if的优先级
原文地址 永远不要把 v-if 和 v-for 同时用在同一个元素上. 一般我们在两种常见的情况下会倾向于这样做: 为了过滤一个列表中的项目 (比如 v-for="user in users ...
- ImportError: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory
该错误原因是libpython3.6m.so.1.0不存在 解决方案 1.查看/usr/lib/x86_64-linux-gnu/目录下是否存在libpython3.m.so.1.0文件,或者直接全盘 ...
- (转)asp.net mvc 开发环境下需要注意的安全问题(一)
概述 安全在web领域是一个永远都不会过时的话题,今天我们就来看一看一些在开发ASP.NET MVC应用程序时一些值得我们注意的安全问题.本篇主要包括以下几个内容 : 认证 授权 XSS跨站脚本攻击 ...
- [转帖]服务器备份工具:Amanda,Bakula,Clonezilla,Rsnapshot,Mondo Rescue
服务器备份工具:Amanda,Bakula,Clonezilla,Rsnapshot,Mondo Rescue https://ywnz.com/linuxyffq/5270.html 改天试用一下. ...
- 阿里云云计算ACP专业认证考试
阿里云云计算专业认证(Alibaba Cloud Certified Professional,ACP)是面向使用阿里云云计算产品的架构.开发.运维类人员的专业技术认证. 更多阿里云云计算ACP专业认 ...
- Jboss: Using reverse path on top path: /xxx
环境 jboss 5.2 原因 加载资源的协议错误.一般在加载文件的时候,URL 都是以 file: 开头,但是在 jboss 上时,由于其虚拟化了路径,导致协议不一致,并且找不到外部的配置文件. 分 ...
- Android Application的Gradle说明
//引入插件 apply plugin: 'com.android.application' android { compileSdkVersion 29 buildToolsVersion &quo ...
- 减2或减3(很搞的贪心)2019牛客国庆集训派对day6
题意:https://ac.nowcoder.com/acm/contest/1111/D 问你先减二x次的情况下,最少减几次3. 思路: %3不为0的要先减2,然后%3为0的要先减大的(比如9 3 ...
- winform中使用TextBox滚动显示日志信息
代码如下: private void ShowInfo(string msg) { this.BeginInvoke((Action)(() => { textBox1.AppendText(s ...