python基础-装饰器,生成器和迭代器
学习内容
1.装饰器
2.生成器
3.迭代器
4.软件目录结构规范
一:装饰器(decorator)
1.装饰器定义:本质就是函数,用来装饰其他函数,即为其他函数添加附加功能。
2.装饰器原则:1)不能修改被装饰函数的源代码2)不能修改被装饰函数的调用方式
3.装饰器的知识储备
1)函数即是变量
2)高阶函数:a,把一个函数名当作实参给别外一个函数(在不修改被装饰函数源代码的情况下实现增加附加功能)
b,返回值中包括函数名(不修改函数调用方式)
3)嵌套函数:用def 在别外的函数中定义的函数
装饰器=高阶函数+嵌套函数
4.装饰器使用:1)被装饰函数不带参数2)被装饰函数带有参数3)装饰多个函数,根据被装饰函数不同,增加不同的装饰功能。
1)实现被装饰函数不带参数代码
三个页面,index不需要登陆,home,bbs页面需要登录
# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
"""
实现被装饰函数不带参数代码
"""
def login(func): #传递函数标识
def wrapper(): #函数嵌套
print("实现登陆") func() #执行函数
return wrapper #返回函数标识 def index():
print("you in the index page") @login #@login=(home=login(home))
def home():
print("you in the home page") @login
def bbs():
print("you in the bbs page") index()
home()
bbs()
2)实现被装饰函数带参数代码
三个页面,index不需要登陆,home,bbs页面需要登录
# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
"""
实现被装饰函数带参数代码
"""
def login(func): #传递函数标识
def wrapper(*args,**kwargs): #函数嵌套,传递被装饰函数的参数
print("实现登陆") func(*args,**kwargs) #执行函数
return wrapper #返回函数标识 def index(name):
print("%s in the home page" %name) @login
def home(name):
print("%s in the home page" %name) @login
def bbs(name):
print("%s in the home page" %name) index("shisan")
home("shisan")
bbs("shisan")
2)装饰多个函数,根据被装饰函数不同,增加不同的装饰功能。
三个页面,index不需要登陆,home,bbs页面需要登录
# -*- coding:utf-8 -*-
__author__ = 'shisanjun'
"""
装饰多个函数,根据被装饰函数不同,实现不同的装饰功能
"""
#嵌套三层函数
def login(flag): #传递类型
def out_wrapper(func):#传递函数标识
def wrapper(*args,**kwargs): #函数嵌套,传递被装饰函数的参数
if flag=="home":
print("实现home装饰")
else:
print("实现bbs装饰") func(*args,**kwargs)
return wrapper
return out_wrapper def index(name):
print("%s in the home page" %name) @login(flag="home")
def home(name):
print("%s in the home page" %name) @login(flag="bbs")
def bbs(name):
print("%s in the home page" %name) index("shisan")
home("shisan")
bbs("shisan")
二.生成器
列表生成式,例如:[x for i in range(10)]
通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费。
生成器(generator):通过一边循环一边生成机制就生成器.
生成器只有在调用时才会生成相应的数据,只记录当前的位置
创建生成器方法 一是:(x for i in range(10))二是:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
[x for i in range(10)]是列表
(x for i in range(10))是generator
generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误
python2中是next() python3中是__next__()
创建了一个generator后,基本上永远不会调用next(),而是通过for循环来迭代它,并且不需要关心StopIteration的错误
生成器示例代码
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' l=[x*2 for x in range(10)] #列表生成式
print(l) g=(x*2 for x in range(3)) #创建生成器方式一
print(g) #提示是generator # print(g.__next__()) #访问方式一是通过高用__next方法
# print(g.__next__())
# print(g.__next__())
# print(g.__next__()) #访问抛出异常StopIteration # g=(x*2 for x in range(3))
# for i in g: #通过for访问是没有异常的
# print(i) # #捕获StopIteration方式
while True:
try:
print(g.__next__())
except StopIteration as e:
print("generator except:%s" %e.value)
break
通过yeild生成generator
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' def fib(max):#斐波拉契数列
n,a,b=0,0,1
while True:
yield b
a,b=b,a+b #t=(b,a+b) a=t[0],b=t[1]
n+=1
if n>max:
break return "done" f=fib(10)
while True: try:
print(f.__next__())
except StopIteration as e:
print("generator stop" ,e.value)
break
三.迭代器
可以直接用于for循环的对象就迭代对象:Iterable。集合类list,set,dict,str,tuple;generator类生成器和带yield的generator function
可以使用isinstance()判断是对象是不是迭代对象。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
把list、dict、str等Iterable变成Iterator可以使用iter()函数
Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算
凡是可作用于for循环的对象都是Iterable类型;
凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
Python的for循环本质上就是通过不断调用next()函数实现的
# -*- coding:utf-8 -*-
__author__ = 'shisanjun' from collections import Iterable,Iterator #可迭代对象
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance((x for x in range(10)),Iterable))
#迭代器
print(isinstance([],Iterator))
print(isinstance((),Iterator))
print(isinstance((x for x in range(10)),Iterator))
#用iter()转换为迭代器
print(isinstance(iter([]),Iterator))
print(isinstance(iter(()),Iterator))
print(isinstance((x for x in range(10)),Iterator))
四.目录组织方式
例子:
假设你的项目名为foo, 比较建议的最方便快捷目录结构这样就足够了:
Foo/
|-- bin/
| |-- foo
|
|-- foo/
| |-- tests/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
|
|-- docs/
| |-- conf.py
| |-- abc.rst
|
|-- setup.py
|-- requirements.txt
|-- README
简要解释一下:
bin/: 存放项目的一些可执行文件,当然你可以起名script/之类的也行。foo/: 存放项目的所有源代码。(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。(2) 其子目录tests/存放单元测试代码; (3) 程序的入口最好命名为main.py。docs/: 存放一些文档。setup.py: 安装、部署、打包的脚本。requirements.txt: 存放软件依赖的外部Python包列表。README: 项目说明文件。
python基础-装饰器,生成器和迭代器的更多相关文章
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- python基础——装饰器
python基础——装饰器 由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25 ...
- python基础—装饰器
python基础-装饰器 定义:一个函数,可以接受一个函数作为参数,对该函数进行一些包装,不改变函数的本身. def foo(): return 123 a=foo(); b=foo; print(a ...
- python 基础——装饰器
python 的装饰器,其实用到了以下几个语言特点: 1. 一切皆对象 2. 函数可以嵌套定义 3. 闭包,可以延长变量作用域 4. *args 和 **kwargs 可变参数 第1点,一切皆对象,包 ...
- day5学python 基础+装饰器内容
基础+装饰器内容 递归特性# 1.必须有一个明确的结束条件# 2.每次进入更深一层递归时,问题规模相比上次递归应有所减少# 3.递归效率不高 def run(n): print(n) if int(n ...
- Python基础(冒泡、生成器、迭代器、列表与字典解析)
一.冒泡算法 冒泡算法,给定一组数据,从大到小排序或者从小到大排序,就像气泡一样 原理: 相邻的两个对象相比,大的放到后面,交换位置 交换位置通过a,b=b,a来实现 1.我们可以通过for循环来根 ...
- python基础 (装饰器,内置函数)
https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...
- python基础===装饰器@property 的扩展
以下来自Python 3.6.0 Document: class property(fget=None, fset=None, fdel=None, doc=None) Return a proper ...
- <Python基础>装饰器的基本原理
1.装饰器 所谓装饰器一般是对已经使用(上线)的函数增加功能. 但是因为一般的大公司的严格按照开放封闭原则(对扩展是开放的,对修改是封闭的),不会让你修改原本的函数. 装饰器就是在不改变原本的函数且不 ...
随机推荐
- 【壹拾壹周】final分数分配
组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 发布时间:12.3 git地址:https://git.coding.net/Boxer_/ho ...
- Vue实现对数组、对象的深拷贝、复制
当组件间传递对象时,由于此对象的引用类型指向的都是一个地址(除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝),如下 数组: ,,]; var b = a; b.p ...
- Valid BFS? CodeForces - 1037D(思维 bfs)
我真是一只菜狗......emm... 题意: 判断一个从1开始的队列是否可以按照bfs的顺序 进行遍历..必须从1开始...然后后边依次是bfs顺序 解析: 看代码能看懂吧...emm...就是把每 ...
- 【树状数组套主席树】带修改区间K大数
P2617 Dynamic Rankings 题目描述给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+ ...
- CF1110D Jongmah(DP)
题目链接:CF原网 洛谷 题目大意:有 $n$ 个数,每个都不超过 $m$.一个三元组 $(a,b,c)$ 是合法的当且仅当 $a=b=c$ 或者 $a+1=b=c-1$.每个数只能用一次.问最多能 ...
- 【POJ1958】汉诺塔+
题目大意:给定一个四个柱子的汉诺塔,N 个盘子,求最少多少步移动到另一个柱子上. 题解:\(f[n]=min(2*f[i]+d[n-i])\),其中 \(d[i]\) 为汉诺三塔最小移动次数.M 塔同 ...
- gulp入门教程(转)
一.gulp简介 1.gulp是什么? gulp是前端开发过程中一种基于流的代码构建工具,是自动化项目的构建利器:它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自 ...
- python数字前自动补零
>>> '%d' % 23 #输出23 ' >>> '%5d' % 23 #输出的数字前有3个空位,共占5个字符 ' >>> '%05d' % 2 ...
- 在“安装”阶段发生异常。 System.Security.SecurityException: 未找到源,但未能
写Windows服务的时候,运行了一下,就是没反应,命令框一闪而过,查了一下异常,大致是题目的那样.原因是因为权限不足.但是在网上搜的方法都不顶用. 解决方法如下: (1)以管理员身份运行CMD: ( ...
- Linux让git记住账号密码
Linux让git记住账号密码 ——IT唐伯虎 摘要: Linux让git记住账号密码. 1.进入根目录,指令:cd / 2.创建记录账号密码的文件,指令:touch .git-credentials ...