# 装饰器
'''
由高阶函数(把一个函数名当作实参传递给另一个函数,返回值中包含函数名)

嵌套函数(函数中嵌套函数)组成
功能:在不更改原函数的代码和调用方式的前提下添加新的功能 装饰器本身就是一个函数。使用方法如 装饰器函数 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 装饰器、生成器、迭代器的更多相关文章

  1. Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle

    目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...

  2. Python装饰器、迭代器&生成器、re正则表达式、字符串格式化

    Python装饰器.迭代器&生成器.re正则表达式.字符串格式化 本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用 ...

  3. python装饰器、迭代器、生成器

    装饰器:为已存在的函数或者或者对象添加额外的功能 def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事' ...

  4. 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化

    文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...

  5. python三大器(装饰器/生成器/迭代器)

    1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...

  6. python — 装饰器、迭代器

    目录 1 装饰器 2 迭代器 3 可迭代对象 1 装饰器 1.1目的.应用场景: 目的: 在不改变原函数内部代码的基础上,在函数执行前后自定义功能. 应用场景: 想要为函数扩展功能时,可以选择用装饰器 ...

  7. python第六章:三大利器(装饰器,迭代器,生成器)--小白博客

    python装饰器 什么是装饰器?在不修改源代码和调用方式的基础上给其增加新的功能,多个装饰器可以装饰在同一个函数上 # 原理(个人理解):将原函数(bar)的内存地址重新赋值,进行覆盖.新值为装饰器 ...

  8. Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)

    Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数

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

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

  10. python装饰器,迭代器,生成器,协程

    python装饰器[1] 首先先明白以下两点 #嵌套函数 def out1(): def inner1(): print(1234) inner1()#当没有加入inner时out()不会打印输出12 ...

随机推荐

  1. iframe 中嵌套刷新

    if(top.frames.length>0){top.location.href = window.location.href;}

  2. MyEclipe10中集成Tomcat7

    1.MyEclipse|Servers|Tomcat|Tomcat 7.x 2.Enable 3.Browse:D:\Tomcat 7.0 4.JDK:下拉选择JDK7.0,注意:千万不能在此处右键A ...

  3. tcpdump抓包以及port查看的一些操作

    1.tcpdump. nginx开启后会占用80端口,此时运行命令:tcpdump tcp port 80 结果例如以下: [syswj@host ~]$ sudo tcpdump tcp port ...

  4. Linux内核之mmc子系统-sdio

    现在的Linux内核中,mmc不仅是一个驱动,而是一个子系统.这里通过分析Linux3.2.0内核,结合TI的arm335x平台及omap_hsmmcd host分析下mmc子系统,重点关注sdio及 ...

  5. VirtualBox 运行失败

    运行 VirtualBox --help 安装 VirtualBox 后 运行 报错内核没加载问题 需要设置环境变量 内核加载的环境变量 export KERN_DIR=/usr/src/kernel ...

  6. Merge into的使用具体解释-你Merge了没有

    Merge是一个很实用的功能,相似于Mysql里的insert into on duplicate key. Oracle在9i引入了merge命令,  通过这个merge你可以在一个SQL语句中对一 ...

  7. rsyslog官方文档

    http://www.rsyslog.com/doc/v8-stable/configuration/index.html

  8. 亲测linux 上安装php

    亲测安装php1.tar zvxf php-5.3.8.tar.gz 2.cd php-5.3.83../configure \ --prefix=/usr/local/php \--with-mys ...

  9. git subproject commit xxxxxxxxxxxxxxxxxxxxx -dirty

    -Subproject commit 8c75e65b647238febd0257658b150f717a136359 +Subproject commit 8c75e65b647238febd025 ...

  10. 11.2 morning

    noip模拟题day1——棋盘上的问题 day1模拟题 By FancyCoder总览(Overview)注意事项:共3道题目,时间2.5小时.Pascal选手允许使用math库和ansistring ...