Welcome to the PythonNoob wiki2! - papatwo/PythonNoob GitHub Wiki
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的seq比如list和tuple,扑克牌,一次划开
generator一叠牌,只能看到面上的一张,一张一张发
eg.
看现有的seq(非generator),眼睛从一个词移动到下一个词
看generator,眼睛不懂,词来动
但是对于遍历来说都是一样的,都要一个一个看
iterator是用generator做的,iter()返回的是一个generator
(实际)时间上不会快(但是感官上会快)
想象一个工厂,面包一个一个被吐出来,源源不断的,不知道头在哪里
一个班级51个人,每个人都要一个面包。51个人排队,每出一个面包,每个人拿走一个:等待时间根据队列递增
一个班级51个人,每个人都要一个面包。51个人排队,等面包全部出来,每个人拿走一个:所有人都要等51分钟
用generator可以看到数据不断出来,可以利用先出来的东西决定什么时候停止。如果不用generator就必须等运行结束
空间上
比如要储存所有自然数的集合,list是存不下的,但是可以用generator。
实际上不会运用到无穷的数据,好处体现在streaming:数据一点一点过来,不知道尽头在哪里
用comprehension:
[]
:list
()
:生成器
generator不用他的时候是不会出东西
写generator的时候不用return(return之后调用记录消掉了),用yield(会设一个存档点,下次调用的时候接着从这里)
next(iter)
next(generator)
set
和dict
的区别(没有顺序的!):
看一个东西在不在里面,主要是看key
set
只有key
没有value
:主要是用来看一个东西有没有在里面——集合,去重,查找
dict
有key
和value
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