zoukankan      html  css  js  c++  java
  • 函数式编程(列表生成式、生成器、迭代器)

    一、列表生成式

    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

     

     

     

  • 相关阅读:
    RAID中条带的概念
    关于几个与IO相关的重要概念
    分布式调度
    ajax
    choices参数
    1.Python实现字符串反转的几种方法
    django web框架
    CRM总结
    Python面试重点(web篇)
    day02-网编并发数据库
  • 原文地址:https://www.cnblogs.com/mjiu/p/8654724.html
Copyright © 2011-2022 走看看