【笔记】Week1:生成器,栈与队列,继承,BFS (Principles of Computing)

这篇博客介绍了Python中的生成器、栈与队列的概念和区别,包括列表解析和生成器表达式的应用,以及生成器函数的实现。此外,还探讨了Python中的继承原理,并通过实例解释了广度优先搜索(BFS)的基本思路。
摘要由CSDN通过智能技术生成

吐槽:今天上到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

大意是:边界队列不为空的时候就把其中的点出队列,然后搜索这个点的邻居,没访问过的都要访问了并且加入边界队列。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值