python进阶学习Day11

python代码的运行过程
所有python代码会先被complie成一个code object,python在运行代码前会创建一个frame这是一个栈的结构

frame是什么
所有函数的调用都会创建一个frame,是一个栈的结构
详细了解生成器,触发器等概念可以看看:

for loop和迭代器

for i in l

for loop模式,可以迭代包括list,direct,打开的文件等
iterable即可迭代对象,可以用next一个一个返回它的成员 ,即后面的l
iterator即一个表示数据流的对象,可以用next不断从里面获取新的数据
二者区别:
1.iterable更像一个数据的保存者,他是可以没有状态的,它是必须有能力创建一个iterator,要么有__iter__的方法,要么它需要是一个sequence,要有__getitem__这个方法
2.iterator一定有状态,它不需要实现一个container,它不需要实现一个接口来实现修改iterable里的数据
迭代对象就是对象具有可列性,迭代器可以理解为一种针对可列性的操作
一个链表方法

class NodeIterator:
    def __init__(self,node):
        self.current_node=node

    def __next__(self):
        if self.current_node is None:
            raise  StopIteration
        node,self.current_node=self.current_node,self.current_node.next
        return node

class Node:
    def __init__(self,name):
        self.name=name
        self.next=None
    def __iter__(self):
        return NodeIterator(self)

node1=Node('node1')
node2=Node('node2')
node3=Node('node3')
node1.next=node2
node2.next=node3
for node in node1:
    print(node.name)

添加__iter__是为了让自己是可迭代的
iterable是容器,iterator是指针,这里iter(iterator)相当于要用一个新的指针去遍历这个指针,显然不行,因此最好给iterator定义__iter__()

生成器
用yield修饰的变量,当一个对象中存在这类变量时,它就会被视为一个生成器对象,保存在frame中,运行时会运行到该变量时会终止,直到继续访问该生成器对象

def gen(num):
    while num>0:
        yield num
        num-=1
    return #这里return返回值与结果无关,相当于raise  StopIteration
g=gen(5)
first=next(g)
for i in g:
    print(i)

这样可以对上面的链表进行优化;

class Node:
    def __init__(self,name):
        self.name=name
        self.next=None
    def __iter__(self):
        node=self
        while node is not None:
            yield node
            node=node.next

node1=Node('node1')
node2=Node('node2')
node3=Node('node3')
node1.next=node2
node2.next=node3
for i in node1:
    print(i.name)

生成器用法虽然与迭代器相似,但是生成器最大的特点是send方法,即在生成器yield之后可以把生成器中yield值赋值另一个值

def gen(num):
    while num>0:
        temp=yield num
        if temp is not  None:
            num=temp
        num-=1

g=gen(5)
print(next(g))##next(g)方法等价于g.send(none),此时为5
g.send(10)##注意不能在生成器刚启动时调用,此时为9
for i in g:##相当于不断调用next
    print(i)#输出8-1

send是一个机制可以让你可以改变generator的一个状态

列表生成器

a=[]
for i in range(1,11):
    a.append(pow(i,2))##普通的列表创建方法
b=[pow(j,2) for j in range(1,11)]##a和b的结果是一样的
c=[pow(z,2) for z in range(1,11) if z%2==0]##生成10以内复数的平方的列表,具体的解读方法是先读后面的for遍历,每次遍历都会运行for之前的值,
print(a)
print(b)
print(c)

参考链接:https://www.bilibili.com/video/BV1KS4y1D7Qb/?spm_id_from=333.999.0.0&vd_source=ccf97c09a9d160c607b822157a930b32

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值