Python之迭代器&装饰器&生成器&正则
1、迭代器
迭代器是访问数据集合的一种方式,它只能从集合的第一个元素开始顺序访问,直到最后一个元素结束。类似于linux里的cat命令,只能挨行读取文本内容,不可以跳到中间或者尾部读取(不会把所有的数据都读到内存中),对于上G的文件,比较节约内存。该迭代的好处就是它事先不需要准备好集合里的所有元素,遍历到该元素时才会计算处理该元素,这点与列表有很大的不同。
示例1:
a = iter(['add','dfdf','dfdfd'])
print a.next()#取第一个值
print a.next()#取第二个值
print a.next()#取第三个值# a = iter(['add','dfdf','dfdfd'])
迭代器关键字iter(),读取集合元素时,只能使用next()方法挨个读取,每次读取一个值,不能随机读取。
示例2:
for line in open("test.txt").readlines():
print line
和
for line in open("test.txt"): #use file iterators
print line
区别:
for line in open("test.txt").readlines()方法是将整个文件读到内存,然后每行读取;
for line in open("test.txt")方法利用迭代器,每次读取一行。
2、生成器
生成器也是一种迭代器,拥有next()方法并且行为与迭代器完全相同。当一个函数中包含yield关键字时,该函数就是一个生成器函数。这里的yield相当于普通函数里的return,只不过yield返回的是一个生成器。第一次执行next()方法时,才会调用生成器函数。当该函数执行到yied语句时会中止,并以yield的参数作为此次next()方法的返回值返回。之后每次调用next()方法时,生成器函数接着上次中止的yield语句往下继续执行,直到遇到yield语句再此中止。
示例:
def Get_Number():#1#4
yield 0#5#7
yield 1#8#10
yield 2#11#12 a = Get_Number()#
print a.next()#
print a.next()#
print a.next()#
程序第一次执行到print a.next()语句时会调用Get_Number函数,该函数执行到yield 0 时会返回yield后面的参数0,并中止函数的执行。然后程序继续执行第二句print a.next(),继续调用Get_Number函数,然后执行yield 1语句返回1,然后中止函数体的执行,再继续执行第三句print a.next()。。。
示例:单线程并发运算
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield print("包子[%s]来了,被[%s]吃了!" %(baozi,name)) def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i) producer("ahaii")
3、装饰器
详细示例,参照银角大王博客:http://www.cnblogs.com/wupeiqi/articles/4980620.html
示例1:
需求: 在调用tv()函数时,需要添加一个登录验证的环节,且不能修改tv()函数内部的代码。
def login(func):
print 'login'
return func#只返回func函数的内存地址,不调用func def tv(name):
print '%s to tvpage' % name f = login(tv)
f('ahaii')
示例中,login()函数返回func参数,该参数只是一个函数的内存地址。执行 f = login(tv)时,将tv作为参数传给login(),然后执行login()函数内部代码(登录验证模块)。执行完成后返回tv函数在内存的位置,此时 f = tv。当执行f('ahaii')时,即tv('ahaii'),调用tv()函数,执行该函数代码。
示例2:
def login(func):
def inner(arg):#执行tv('ahaii')语句时第二次调用的tv
print '验证'
return func(arg)#第一次调用的tv
return inner @login
#装饰器,调用login函数,并以被装饰的函数(tv)的函数名为参数,即login(tv),效果如下:
# def login(tv):
# def inner(arg):
# print '验证'
# return tv(arg)
def tv(name):
print '%s to tvpage' tv('ahaii')#调用inner()函数
上例中,@login语句即为装饰器,该语句下面的tv()函数就是被装饰的函数。该程序执行流程是:1、def login(func):,将该函数加载到内存,不执行。2、@login。
@login背后的故事:
.1 当程序执行到@login语句时,会把@login装饰的函数(即该语句下面的函数tv())当作参数传递给login()函数,此时会执行login(tv)。
.2 login(tv),执行内部语句def inner(arg) 和 return inner,因没有调用inner()函数,所以函数体 print '验证' 和return func(arg) 不会被执行。该句的执行结果是inner函数体。
.3 将第2步执行的返回值赋值给被login修饰的函数,即将inner函数体赋值给tv()函数。
即 新tv=def inner(arg):
print ...
return func(arg) #返回原来的tv
执行 tv('ahaii') 时,会将 'ahaii'参数传给inner()函数。
综上,装饰器的功能就是,当执行tv()函数时,需要先执行另外一个新的tv()函数,在新的tv()函数里可以添加新的功能模块(执行tv函数之前,先执行新的tv函数( inner函数))。比如登录验证,然后再执行原来的tv()函数。这样,即未改动原来的tv()函数,又添加了新功能。
4、递归
示例1:
def calc(n):
print n
if n/2 >1:
res = calc(n/2)
print res
print n
return n calc(10)
将函数执行的结果作为参数再传递给函数本身。
示例2 斐波那契数列:
def func(arg1,arg2,stop):
arg3 = arg1 + arg2
if arg1 == 0:
print arg1,arg2
print arg3
if arg3 < stop:
func(arg2,arg3,stop) func(0,1,50)
示例3 找有序数列中某一值:
def find(List,Number):
mid = len(List)/2#取中间值
if len(List)>=1:
if List[mid] >Number:
print 'in the left %s' % List[mid]
find(List[:mid],Number)#切片,取列表左半
elif List[mid] <Number:
print 'in the right %s' % List[mid]
find(List[mid:],Number)
else:
print 'find the number,,, %s' % Number
else:
print 'cannot find the number,,,' find(range(1,100000),9)
思路:先取有序数列的中间值与要查找的值x比较大小,若大于x,则说明x在该中间值的左边。利用切片取数列左半部门,然后递归继续查找中间值与x比较。
5、算法
示例 二维列表90度旋转:
array=[[col for col in range(5)] for row in range(5)] #初始化一个4*4数组
#array=[[col for col in 'abcde'] for row in range(5)] for row in array: #旋转前先看看数组长啥样
print(row) print('-------------')
for i,row in enumerate(array): for index in range(i,len(row)):
tmp = array[index][i] #get each rows' data by column's index
array[index][i] = array[i][index] #
array[i][index] = tmp
for r in array:print r print('--one big loop --')
6、正则表达式
匹配格式
| 模式 | 描述 |
|---|---|
| ^ | 匹配字符串的开头 |
| $ | 匹配字符串的末尾。 |
| . | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
| [...] | 用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k' |
| [^...] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
| re* | 匹配0个或多个的表达式。 |
| re+ | 匹配1个或多个的表达式。 |
| re? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
| re{ n} | |
| re{ n,} | 精确匹配n个前面表达式。 |
| re{ n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
| a| b | 匹配a或b |
| (re) | G匹配括号内的表达式,也表示一个组 |
| (?imx) | 正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。 |
| (?-imx) | 正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。 |
| (?: re) | 类似 (...), 但是不表示一个组 |
| (?imx: re) | 在括号中使用i, m, 或 x 可选标志 |
| (?-imx: re) | 在括号中不使用i, m, 或 x 可选标志 |
| (?#...) | 注释. |
| (?= re) | 前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。 |
| (?! re) | 前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功 |
| (?> re) | 匹配的独立模式,省去回溯。 |
| \w | 匹配字母数字 |
| \W | 匹配非字母数字 |
| \s | 匹配任意空白字符,等价于 [\t\n\r\f]. |
| \S | 匹配任意非空字符 |
| \d | 匹配任意数字,等价于 [0-9]. |
| \D | 匹配任意非数字 |
| \A | 匹配字符串开始 |
| \Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c |
| \z | 匹配字符串结束 |
| \G | 匹配最后匹配完成的位置。 |
| \b | 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 |
| \B | 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 |
| \n, \t, 等. | 匹配一个换行符。匹配一个制表符。等 |
| \1...\9 | 匹配第n个分组的子表达式。 |
| \10 | 匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。 |
Python之迭代器&装饰器&生成器&正则的更多相关文章
- 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化
文档内容学习于 http://www.cnblogs.com/xiaozhiqi/ 装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...
- python三大器(装饰器/生成器/迭代器)
1装饰器 1.1基本结构 def 外层函数(参数): def 内层函数(*args,**kwargs); return 参数(*args,**kwargs) return 内层函数 @外层函数 def ...
- Python自动化 【第四篇】:Python基础-装饰器 生成器 迭代器 Json & pickle
目录: 装饰器 生成器 迭代器 Json & pickle 数据序列化 软件目录结构规范 1. Python装饰器 装饰器:本质是函数,(功能是装饰其它函数)就是为其他函数添加附加功能 原则: ...
- Day11 Python基础之装饰器(高级函数)(九)
在python中,装饰器.生成器和迭代器是特别重要的高级函数 https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...
- python设计模式之装饰器详解(三)
python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...
- python高级之装饰器
python高级之装饰器 本节内容 高阶函数 嵌套函数及闭包 装饰器 装饰器带参数 装饰器的嵌套 functools.wraps模块 递归函数被装饰 1.高阶函数 高阶函数的定义: 满足下面两个条件之 ...
- [python基础]关于装饰器
在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...
- python笔记 - day4-之装饰器
python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...
- Python深入05 装饰器
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...
随机推荐
- js操作符总结
算数操作符加法操作符(+),减法操作符(-),除法操作符(/),乘法操作符(*)还可以把多种操作组合在一起:1+4*5避免产生歧义,可以用括号把不同的操作分隔开来:1+(4*5):(1+4)*5变量可 ...
- deployd使用归纳
deployd:一个生成后端数据的软件,简单的说就是大部分的前端不会后端,即使会也很难在深入到数据库进行设置一些前端所需数据的创建与查询的后端程序的书写,所以此时就是deployd大显身手的时候了. ...
- 切换self.window.rootViewController根视图,导致上一视图控制器不能释放销毁的问题
在我们APP开发中经常有首次进入应用先进入引导页或者登陆页的情况,类似下图所示 发现登陆以后更改window.rootViewController为应用首页时,登陆页没有销毁掉,通过图层工具 ...
- react重学
知识点一:react解析中 return {__html:rawMarkup}; 这里的html前边用的是双下划线(谢谢学妹的指点)
- Git 常用命令 更新与提交
整理了一下Git 常用命令,这个版本还是比较好用的,最后附上个人终结版,帮助你快速上手. 取得Git仓库 初始化一个版本仓库 git init Clone远程版本库 git clone yourgit ...
- IntelliJ Idea设置默认换行符
IntelliJ换行CRLF, LF, CR的解释和默认设置 在window下开发有一个大坑,就是换行默认是CRLF,也就是回车换行,但是Linux下只有换行LF,这样代码提交后,会出现编译问题,所以 ...
- wvs_patcher批量测试网站
来自:http://zone.wooyun.org/content/23162 pip install multiprocessing错误. 然后就到官方下载安装包本地安装 multiprocessi ...
- Python数据预处理—归一化,标准化,正则化
关于数据预处理的几个概念 归一化 (Normalization): 属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现. 常用的 ...
- Style绑定
目的 style绑定可以添加或者移除DOM元素的样式值.这非常有用,例如,当值为负数时将颜色变为红色. (注:如果要修改CSS整个类,请使用css绑定) <div data-bind=" ...
- C#语言之“String.Split”的使用【转】
String.Split 方法有6个重载函数: 1) public string[] Split(params char[] separator) 2) public string[] Split(c ...