from collections import deque
defsearch(lines,pattern,history=5):
previous_lines=deque(maxlen=history)
for line in lines:
if pattern in line:
yield line,previous_lines
previous_lines.append(lines)
# 这个程序没咋看懂
# 解决方案是,利用集合和生成器defdedupe(items):
seen=set()
for item in items:
if item notin seen:
yield item
seen.add(item)
插曲:yeild 使用解析
yeild 函数在python 中被称之为generator 生成器
# 展示yield是功能及使用方法deffab(max):
n,a,b=0,0,1while n<max:
print b
a,b=b,a+b
n=n+1# 上面是一个简单的程序,但是对于开发者来说,直接在函数中打印数字,导致函数可复用性较差# fab函数返回None,其他函数无法获得该函数生成的数列# 考虑内存的占用classFab(object):def__init__(self,max):
self.max=max
self.n,self.a,self.b=0,0,1def__iter__(self):return self
def__next__(self):if self.n<self.max:
r=self.b
self.a,self.b=self.b,self.a+self.b
self.n=self.n+1return r
raise StopIteration()
# 这个函数通过next()函数不断返回数列的下一个数,内存占用始终为一个常数# 我们想保持函数的简洁性,又要保持迭代器的效果,yield就派上用场来deffab(max):
n,a,b=0,0,1while n<max:
yield b
a,b=b,a+b
n=n+1# >>> for n in fab(5):# >>> print(n)
又一个插曲:(nested)list comprehensions (嵌套)列表推导式
# 列表推导式是一个强大的工具,像其他强大的工具一样,你必须格外的小心的区使用# 例如,转换举证的行和列,矩阵的转置
mat=[[1,2,3],
[4,5,6],
[7,8,9],]
print([row[i] for row in mat] for i in [0,1,2])
for i in [0,1,2]:
for row in mat:
print (row[i],) # 这个实现不了换行print# 但是对于矩阵的转置可以利用内置函数来完成复杂的流程语句# 函数zip()# >>>zip(*mat) # 这个就可以完成转置
# 列表推导式和生成器表达式是用来筛选数据最简单和最直接的方式.也具有对数据进行转换的能力
mylist=[1,9,-3,-7,8,4,-2]
import math
print([math.sqrt(n) for n in mylist if n>0])
newlist=[n if n>0else0for n in mylist]
newlist