Welcome to the PythonNoob wiki2! - papatwo/PythonNoob GitHub Wiki

记点小笔记2

Iterator:一个一个数

Python for each的背后是通过调用 iter(seq) 来实现的,大部分Pyhton的内置接口都是名字前后加个双下划线。所以我只要实现 JysFantasticList.__iter__() 就可以调用 iter(JysFantasticList())

for elem in iter(seq):
  do_shits()

就等于

iterator = iter(seq)
while True:
  try:
    elem = next(iterator)
    do_shits()
  catch StopIteration:
    pass

Generator:一个一个吐

Generator是什么?

generator,正在进行时的,一个一个往外吐
非generator的seq比如list和tuple,扑克牌,一次划开
generator一叠牌,只能看到面上的一张,一张一张发
eg. 看现有的seq(非generator),眼睛从一个词移动到下一个词
看generator,眼睛不懂,词来动

但是对于遍历来说都是一样的,都要一个一个看

iterator是用generator做的,iter()返回的是一个generator

为什么要用Generator?

(实际)时间上不会快(但是感官上会快)

想象一个工厂,面包一个一个被吐出来,源源不断的,不知道头在哪里
一个班级51个人,每个人都要一个面包。51个人排队,每出一个面包,每个人拿走一个:等待时间根据队列递增
一个班级51个人,每个人都要一个面包。51个人排队,等面包全部出来,每个人拿走一个:所有人都要等51分钟

用generator可以看到数据不断出来,可以利用先出来的东西决定什么时候停止。如果不用generator就必须等运行结束

空间上
比如要储存所有自然数的集合,list是存不下的,但是可以用generator。
实际上不会运用到无穷的数据,好处体现在streaming:数据一点一点过来,不知道尽头在哪里

怎么做Generator?

用comprehension:
[]:list
():生成器

generator不用他的时候是不会出东西
写generator的时候不用return(return之后调用记录消掉了),用yield(会设一个存档点,下次调用的时候接着从这里)

怎么用Generator?

next(iter) next(generator)

setdict的区别(没有顺序的!):
看一个东西在不在里面,主要是看key
set只有key没有value:主要是用来看一个东西有没有在里面——集合,去重,查找
dictkeyvalue list:以自然数为key存值

什么东西使用生成器做的?:给一个seq转换成另一个seq 基本都是——lazy evaluation
在for loop里去运用

map:把一个func map到一个seq zip:(因为不同长度的两个list也能zip) enumerator:(index和val组合或者只要index的都用) 凯撒密码:绕成环cycleofstring.letters (再map到seq上)

generator comprehension
iter tools
cycle
repeat
count
reduce

N.B. 以上笔记来自袁老师的讲课

⚠️ **GitHub.com Fallback** ⚠️