吐槽:今天上到poc2的week1课程觉得还不错,但由于概念很陌生,觉得有必要记录一下。部分来源视频,部分来源其他博客。虽然视频是py2但不影响理解概念。
正文:
1,generators(生成器)
什么是生成器:
1)生成器是一个特殊的程序,可以被用作控制循环的迭代行为;2)生成器类似于返回值为数组的一个函数,这个函数可以接收参数,可以被调用,但是,不同于一般的函数会一次性返回包含了所有数值的数组,生成器一次只产生一个值,这样消耗的内存数量大大减少,而且允许调用函数可以很快的开始处理前几个返回值。因此,生成器看起来像一个函数但是表现的却像一个迭代器。(https://blog.csdn.net/fly910905/article/details/76286080)
生成器举例:
1)a list comprehension(列表解析):max([num*2-3 for num in range(7)])
2)a generator expression(生成器表达式):max(num*2-3 for num in range(7))
上面两个的区别是:生成器表达式采用延迟计算的方式节省内存(https://www.cnblogs.com/bryant24/p/11406597.html),列表解析的效率更高,但是对于大数据处理,列表解析并不是一个最佳选择,过多的内存消耗可能会导致MemoryError(https://blog.csdn.net/fly910905/article/details/76286080)
3)a generator function(生成器函数):
def genfunc(limit):
num = 0
while num < limit:
yield num
num = num + 1
print genfunc(7)
会输出:<generator object genfunc>
与1)2)不同的是:它可以在表达式很复杂的时候使用(https://blog.csdn.net/fly910905/article/details/76286080)
yield关键词:(每次)返回一个值放入一个生成器。
辨析:yield与return类似,区别是yiled还有next()函数(https://blog.csdn.net/mieleizhi0522/article/details/82142856/),视频中说yield在迭代过程中会回到原来离开的位置,但return则是函数被执行完了不会再回来,而且return也可存在于生成器函数中,意思是结束迭代过程,所以return不能加任何值,只能单纯写个return。举例如下:
def genfunc2(endfunc):
num = 0
while True:
if endfunc(num):
return
yield num
num = num + 1
def endfn(num):
if num == 7:
returnTrue
return False
for number in genfunc2(endfn):
print number
2,stacks and queues(栈与队列)
1)stacks:last in first out,push&pop
2)queues:first in first out,push&pop 或 enqueue&dequeue
视频中并没有详细介绍他们的实现,只说了概念和一个例子。
3,inheritance(继承)
1)simple实现举例:
class Base:
def hello(self):
print "hello"
def message(self, msg):
print msg
class Sub(Base):
def message(self, msg):
print "sub: ", msg
obj = Sub()
obj.hello()
obj.message("what's going to happen?")
baseobj = Base()
baseobj.hello()
obj.message("another message?")
输出:
hello
sub: what's going to happen?
hello
sub: another message?
2)使用继承的举例:
class Base:
"""
Simple base class.
"""
def __init__(self, num):
self._number = num
def __str__(self):
return str(self._number)
class Sub(Base):
"""
Simple sub class.
"""
def __init__(self, num):
Base.__init__(self, num)
obj = Sub(42)
print obj
输出:
42
4,Breadth-First Search(广度优先搜索)
思路:
while boundary is not empty:
current_cell <- dequeue boundary
for all neighbors neighbor_cell of current_cell:
if neighbor_cell is not in visited:
add neighbor_cell to visited
enqueue neighbor_cell onto boundary
大意是:边界队列不为空的时候就把其中的点出队列,然后搜索这个点的邻居,没访问过的都要访问了并且加入边界队列。