首页 > 代码库 > 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