python 装饰器、生成器、迭代器
# 装饰器
'''
由高阶函数(把一个函数名当作实参传递给另一个函数,返回值中包含函数名)
和
嵌套函数(函数中嵌套函数)组成
功能:在不更改原函数的代码和调用方式的前提下添加新的功能 装饰器本身就是一个函数。使用方法如 装饰器函数 1、自动执行装饰器函数login并且被装饰的函数名(index)当做参数传递给函数(fun = index)
2、将装饰函数login的返回值auto重新赋值给被装饰的函数
'''
example
# 如果被装饰的函数带参数
def login(fun):
def auto():
print("add new Function")
fun()
return auto @login
def index():
print("in the index") index()
# *args, **kwargs 万能参数, *args 传位置参数并将参数转换成为一个元组格式, **kwargs 传关键字参数,并转换成字典格式
def login(fun):
def auto(*args, **kwargs):
print("add new Function")
fun(*args, **kwargs)
return auto @login
def admin(name):
print("the admin user name is {_name}".format(_name=name)) admin("babi")
# 场景应用,三个页面(index,admin,information)进入首页不用登录,进入后台和用户信息页面需要登录
name, pwd = "jian", "0325" def login(fun):
def demo(*args, **kwargs):
usname = input("Username:").strip()
passwd = input("Password:").strip()
if usname == name and passwd == pwd:
print("welcome to shopping car!")
return fun(*args, **kwargs)
else:
print("Input error")
return demo def index():
print("in the index...........") @login
def admin():
print("in the admin===================")
return "admin" @login
def information(fuck):
print("in the information-----------------{fa}".format(fa=fuck)) index() admin() information('fuck fuck fuck')
# 生成器 generator
可以在函数执行的过程中执行其他操作
'''
生成器本身也是一个函数,加上yield就变成了一个生成器,执行只能通过next一步步执行
一般函数执行的时候都是一次性把整个函数执行完才能去执行其他的命令,而生成器是可以自由的进出函数内部,在执行过程中增加其他操作
'''
# example:
# 普通函数
def fun():
for i in range(4):
print(i) fun() # 0 1 2 3
# 生成器函数,需要调用next才能一步步执行 def test1():
for j in range(3):
print(j)
yield yi = test1() # test1() = <generator object test1 at 0x00000272AD062DB0> 生成器对象
yi.__next__()
print("做点其他事情")
yi.__next__()
# 生成器捕获异常方法
def fib(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b # 相当于 c = (b, a+b) a = c[0] b=c[1]
n += 1
return 'done' # 直接使用__next__函数,如果调用的次数超过应有的次数,就会抛一个异常StopIteration,return指定报异常的值 fi = fib(5)
# try except 捕获error 并自定义 error 输出的警告代码, except 后指定报错的类型(StopIteration)
while True:
try:
x = next(fi)
print(x)
except StopIteration as e:
print('Error code return value', e.value)
break
# 迭代器
from collections import Iterable # 引用迭代对象
from collections import Iterator # 引用迭代器对象
# Iterable 迭代对象(可循环的对象)
'''
string、列表、集合、元组、字典等
''' # Iterator 迭代器对象 可以被next()函数调用并返回下一个值的对象 (迭代对象有next方法就成为迭代器对象:
例如:a=[1,2,3],dir(a)不包含next方法,就不是迭代器对象),可以用isinstance判断是否是
print(isinstance([], list)) # True
print(isinstance([], Iterator)) # False # 迭代对象可以通过iter()函数转换为 迭代器对象
print(isinstance(iter([]), Iterator)) # True
python 装饰器、生成器、迭代器的更多相关文章
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- Python装饰器、迭代器&生成器、re正则表达式、字符串格式化
Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...
- python装饰器、迭代器、生成器
装饰器:为已存在的函数或者或者对象添加额外的功能 def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事' ...
- 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化
文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...
- python三大器(装饰器/生成器/迭代器)
1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...
- python — 装饰器、迭代器
目录 1 装饰器 2 迭代器 3 可迭代对象 1 装饰器 1.1目的.应用场景: 目的: 在不改变原函数内部代码的基础上,在函数执行前后自定义功能. 应用场景: 想要为函数扩展功能时,可以选择用装饰器 ...
- python第六章:三大利器(装饰器,迭代器,生成器)--小白博客
python装饰器 什么是装饰器?在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上 # 原理(个人理解):将原函数(bar)的内存地址重新赋值,进行覆盖.新值为装饰器 ...
- Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)
Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数
- Python之装饰器、迭代器和生成器
在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...
- python装饰器,迭代器,生成器,协程
python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...
随机推荐
- Android 官方文档:(二)应用清单 —— 2.2 <action>标签
syntax: <action android:name="string" /> contained in: <intent-filter> descrip ...
- 读取一个文件,将其Base64编码,每76个字符加一个换行(转)
echo chunk_split(base64_encode(file_get_contents('base64.txt'))); 例子 1 本例分隔每个字符,并添加 ".": & ...
- timestamp ---自动更新修改时间 与 记录首次插入时间
自动更新修改时间: mysql> create table z(a int ,b timestamp on update current_timestamp); mysql> insert ...
- 使用 Acegi 保护 Java 应用程序
第 1 部分: 架构概览和安全过滤器 Acegi Security System 是一种功能强大并易于使用的替代性方案,使您不必再为 Java 企业应用程序编写大量的安全代码.虽然它专门针对使用 Sp ...
- objective-c IBOutletCollection介绍
objective-c IBOutletCollection介绍 将UI控件和源码进行链接时,方法的表示方法是IBAction,控件属性对象是IBOutlet.如果想将一个同类型的UI控件作为一个组放 ...
- 亲测linux上安装mysql
1.rpm -ivh MySQL-server-5.6.19-linux_glibc2.5.x86_64.rpm(这是复制过来的,用Tab键自动补齐吧)2.rpm -ivh MySQL-client- ...
- [转] 用管道获得shell 命令的输出
用管道: 通过fgets(buf, n, ptr)buf就可以得到命令“ps -ef"一样的信息, 读帮助”man popen": char *cmd = "ps -ef ...
- Android微信智能心跳方案
前言:在13年11月中旬时,因为基础组件组人手紧张,Leo安排我和春哥去广州轮岗支援.刚到广州的时候,Ray让我和春哥对Line和WhatsApp的心跳机制进行分析.我和春哥抓包测试了差不多两个多礼拜 ...
- matlab切比雪夫拟合
matlab中没有切比雪夫拟合的现成算法,这里把我程序中的这部分抽出来,说一下. 1.首先是切比雪夫计算式 function [ res ] = ChebyShev(num,i) res=; else ...
- ASP.NET Boilerplate Castle容器无缝添加日志功能
以添加log4net日志框架为例进行讲解 1.通常log4net的配置参数放在单独的配置文件中,但也可以写在web.config中,这里在我们的web项目中添加log4net.config应用配置文件 ...