函数式编程(列表生成式、生成器、迭代器)

一、列表生成式

a = [1,2,3,4,5,6,7,8]
#每个元素递加1
a = [i+1 for i in a ]#这就是列表生成公式
print(a)
#优点代码简洁

  二、生成器

a1 =(i for i in range(5))#编写生成器,a1 里面记录的是计算公式
print(a1)#打印公式  generator 就是生成器的意思
print(next(a1))#取值
print(next(a1))#每次只能取一个,不能回退不能切片
#输出
<generator object <genexpr> at 0x000001C58902FEB8>
0
1

使用生成器实现 斐波那契数列 (斐波那契数列 ,就是除了前两位,后面所有的数都是前两位的和 例如  1  1  2   3  5   8  )

def func(max):
    n,a,b = 0,0,1 #对应赋值
    while n <max :#判断打印次数
        print(b)#打印值
        a,b = b,a+b#a等于b,b等于 旧a加 b
        n += 1 #计数器
    return 'done'
func(15)
#输出
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610

生成器版本 斐波那契数列

def func(max):
    n,a,b = 0,0,1 #对应赋值
    while n <max :#判断打印次数
        yield b #把函数的执行过程冻结在这一步,并且把b的值返回给外面的next()
        print(b)#打印值
        a,b = b,a+b#a等于b,b等于 旧a加 b
        n += 1 #计数器
    return 'done'

#优点,可以在执行过程中返回值。
f =func(15)
next(f)
next(f)
next(f)
next(f)
#输出
1
1
2

#在python2 里面  range = list  xrange = 生成器

#在python3 里面 range =生成器              没有xrange

 

生成器的创建方式

1、列表生成式 ()  #最多只能用三元运算

2、函数

 

yield vs return 

1、return 返回并终止函数

2、yield 返回数据,并冻结当前的执行过程。。。#如果函数里面出现了yield 该函数就变成了生成器。

3、next 唤醒当前进程执行过程,并向程序发送None 继续执行,到下一个yield冻结。

4、send   唤醒并继续执行程序,发送一个信息到生成器内部。

 

#学习链接 https://blog.csdn.net/hedan2013/article/details/56293173

学习链接 http://www.runoob.com/w3cnote/python-yield-used-analysis.html

 

三、迭代器

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

Python的for循环本质上就是通过不断调用next()函数实现的

for x in [1, 2, 3, 4, 5]:
    pass

#实际上等价于
# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

 

 

 

posted @ 2018-03-26 23:05  SmallNine  阅读(188)  评论(0编辑  收藏  举报