第一章 Python基础入门之列表生成式和生成器

系列文章目录

第一章 Python基础入门之Hello World
第一章 Python基础入门之变量与数据类型
第一章 Python基础入门之ASCII(字符编码和二进制)
第一章 Python基础入门之单多行的注释和输出
第一章 Python基础入门之INPUT用户输入
第一章 Python基础入门之IF ELSE条件判断
第一章 Python基础入门之While循环与For循环
第一章 Python基础入门之什么是模块(库)
第一章 Python基础入门之什么是.pyc
第一章 Python基础入门之数据类型
第一章 Python基础入门之Python3数据类型中的bytes和str的区别
第一章 Python基础入门之文件读与写详解
第一章 Python基础入门之文件修改详解
第一章 Python基础入门之文件的with语句
第一章 Python基础入门之函数与函数式编程
第一章 Python基础入门之函数式编程参数详解
第一章 Python基础入门之局部变量与全局变量作用域
第一章 Python基础入门之递归和高阶函数
第一章 Python基础入门之装饰器详解以及案例解析



前言

Python系列学习


一、相关内容

生成器的作用

  通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。
而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,
那后面绝大多数元素占用的空间都白白浪费了。
  所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?
这样就不必创建完整的list,从而节省大量的空间。在PYTHON中,这种一边循环一边计算的机制,成为生成器:generator。要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator。

列表生成式

# 一般可以通过如下方式生成列表:
List1=[1,2,3,4,5,6,7,8,9]
List2=[i*2 for i in range(10)]
'''两者的区别是:
List1是静态的,列表的值是写死的;List2是动态的,列表中可以加入一些公式计算、函数等
List2即是列表生成式。

创建生成器及输出

# 方法一:
# 如何创建一个generator?只需把列表生成式的[]改成(),如下:
List3=(i*2 for i in range(10000))
for a in List3:
    print(a)

# 生成器只有调用时才会生成对应的数据,只记录当前位置。只有一个 __next()__ 方法,不断的往后执行,不能往前回滚。
List3.__next__()
# 正常情况下不会一个个去调用__next()__ 方法实现下一个数据,一般使用for循环迭代实现,并且不需要关心StopIteration错误。

# 方法二:
'''如何创建一个generator?generator是非常强大的,如果推算的算法比较复杂,
使用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。
比如,著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1,1,2,3,5,8,13,21,34,......
斐波拉契数列用列表生成式写不出来,但是,用函数很容易把它打印出来。如下:
'''
def fib(max):
    n,a,b=0,0,1
    while n<max:
        print(b)
        a,b=b,a+b    #注意该a,b=b,a+b赋值语句,相当于:t=(b,a+b)  a=t[0]  b=t[1]  (t是一个tuple),此处不必显示写出临时变量t就可以赋值。
        n=n+1
    # return 'done'

fib(10)

'''仔细观察上面fib函数,可以看出fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,
推算出后续任意的元素,这种逻辑非常类似generator。
也就是说上面的fib函数距离generator仅一步之遥,要把fib函数变成generator,
只需把print(b)改成yield b即可。如下:
'''
def fib(max):
    n,a,b=0,0,1
    while n<max:
        # print(b)
        yield b
        a,b=b,a+b    #注意该a,b=b,a+b赋值语句,相当于:t=(b,a+b)  a=t[0]  b=t[1]  (t是一个tuple),此处不必显示写出临时变量t就可以赋值。
        n=n+1
    return 'done'

f=fib(10)

# 输出方式一:
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
# 注意:当限制为10个数据时,但打印时却超出了10个,则会StopIteration: done的异常错误。

# 输出方式二:
# for i in f:
#     print(i)

# 当遇到StopIteration: done的异常错误,如何处理?如下:
def fib(max):
    n,a,b=0,0,1
    while n<max:
        # print(b)
        yield b
        a,b=b,a+b    #注意该a,b=b,a+b赋值语句,相当于:t=(b,a+b)  a=t[0]  b=t[1]  (t是一个tuple),此处不必显示写出临时变量t就可以赋值。
        n=n+1
    return '----done-----'

# f=fib(10)
g=fib(6)
while True:   
    try:
        x=next(g)
        print('g:',x)
    except StopIteration as e:
        print('Generator reture value:',e.value)
        break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值