首页 > 代码库 > Python学习笔记-2017.5.4thon学习笔记-2017.5.14
Python学习笔记-2017.5.4thon学习笔记-2017.5.14
Python学习过程中的笔记,只做自己参考使用:
lambda函数,匿名函数,当我们使用一个函数并且使用完成就删除时,可以使用匿名函数,比如f等于xyz三个之和:
f = lambda x,y,z:x+y+z
生成器和迭代器:
生成器,我们常用的列表一般有两种方式生成,例如:
1、直接写出列表
a = [1,2,3,4,5,6,7,8,9]
2、通过列表生成式生成列表
a = [i*i for i in range(10)]
上述两种列表是我们常用的列表方式,调取方便,随便增删改查取值,但是有可能存在一定的问题,比如列表过大,会占用大量内存,比如100W个值;
因此可以使用生成器的方式来完成:
f = (i*i for i in range(10))
print(f)
这样,运行的结果是:
<generator object <genexpr> at 0x1029809e8>
只返回一个对象,这样生成的列表,有两种调用方式,第一种:
f = (i*i for i in range(10)) print(f) print(f.__next__())
每次使用__next__()会调用一次,想调用下一次请继续再写一遍这个__next__();
另一种调用方式是使用for循环:
f = (i*i for i in range(10)) print(f) # print(f.__next__()) for i in f: print(i)
这是简单的列表生成式的生成器,另外一种生成器我们可以使用函数来示例:
__Author__="Jack" def f(number): for i in range(number): yield i return "Done" a = f(10) print(a.__next__())
print的结果是0,如果再写一次print,那结果是0,1,生成器的特点是调用的时候,yield返回的是当前值,使用next返回下一个值,但不能根据index返回,也不能返回上一个值,调用的方式只能使用循环方式调用,比如For循环。
并行运算示例,并演示.send()的使用,使用时,必须在__next__()已经运行过,对生成式进行了初始化,否则send会报错。
__Author__="Jack" def chibaozi(name): print("%s,准备吃包子了!" %name) while True: baozi = yield print("包子%s来了,包子被%s吃了!" %(baozi,name)) def zuobaizi(): a = chibaozi("A") b = chibaozi("B") a.__next__() b.__next__() print("注意了,老子要做包子了!") for i in range(10): print("做了两个韭菜馅的包子!") a.send(i) b.send(i) zuobaizi()
迭代器和可迭代对象,我们常用的可以被循环for、while调用的list,tuple,str,dic都是可以迭代的对象,而带有next函数调用的,是迭代器,因此,生成器都是迭代器,但是,列表,字典,字符串和元组不是迭代器,可以转换为迭代器,判断是否可迭代对象:
from collections import Iterable print(isinstance([], Iterable))
上述返回值是True,因此列表是可迭代对象,判断是否迭代器:
from collections import Iterator print(isinstance([], Iterator))
上述列表的返回值是False,因此列表不是迭代器,但如果不是迭代器,可以转换为迭代器。
from collections import Iterator print(isinstance([], Iterator)) f = iter([]) print(isinstance(f, Iterator))
Python学习笔记-2017.5.4thon学习笔记-2017.5.14