python创建生成器以及访问的方法

与列表一次性地将数据全都加载到内存不同的是,生成器使用推断加载数据,每次只推断出一个对象,在数据量比较大时,可以节省内存。这篇文章简单总结下创建生成器的方法,并用举一个生成器在斐波那契应用的例子。

一、创建生成器以及访问的方法

1. map

iter1 = map(lambda x:x, [0,1,2])

2. ()

iter2 = (x for x in range(3))

3.使用yield

def iter3():
    for i in range(3):
        yield i

看下它们的类型:

iter1 type is: <class 'map'>
iter2 type is: <class 'generator'>
iter3() type is: <class 'generator'>

其中,map类型也是生成器类型。如何访问一个生成器?以iter1为例,有以下方法:

# 1.一个个访问
print(next(iter1)) 

 # 2.使用for访问
for i in iter1:
    print(i)
    break
    
# 3.转化为列表访问
print(list(iter1)) 

输出:

0
1
[2]

二、生成器的应用

使用迭代法来求解斐波那契数列:

# 使用生成器构菲波那契数列,数列下标从1开始
def fib(n):
    a,b,i = 0,1,0
    while i<n:
        yield b
        a,b = b,a+b
        i += 1

def get_fib(n):
    # 此时fib(n)是一个生成器
    gener = fib(n)
    for i in range(n-1):
        next(gener)
    return next(gener)

print(get_fib(3))

refer:生成器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,生成器(Generator)是一种特殊的迭代器。生成器可以通过函数来创建,并使用yield语句来产生值。生成器可以按需生成值,而不是一次性生成所有值,这使得它们非常节省内存。 生成器和迭代器有以下几个共同点: 1. 都可以使用for循环进行迭代。 2. 都支持使用next()函数获取下一个元素。 3. 都可以使用iter()函数将其转换为迭代器对象。 生成器和迭代器的不同之处在于实现方式: - 迭代器是通过实现`__iter__()`和`__next__()`方法创建的,其中`__iter__()`方法返回迭代器对象本身,`__next__()`方法返回可迭代对象中的下一个元素。 - 生成器是通过函数中的yield语句来定义的。当函数被调用时,它返回一个生成器对象,每次调用生成器的next()方法或使用for循环迭代时,它会产生一个值并暂停,等待下一次调用。 下面是一个示例,展示了生成器和迭代器的使用: ```python # 迭代器示例 class MyIterator: def __iter__(self): self.counter = 1 return self def __next__(self): if self.counter <= 5: value = self.counter self.counter += 1 return value else: raise StopIteration # 创建迭代器对象 my_iter = MyIterator() # 使用for循环迭代 for num in my_iter: print(num) # 输出: 1, 2, 3, 4, 5 # 生成器示例 def my_generator(): num = 1 while num <= 5: yield num num += 1 # 创建生成器对象 my_gen = my_generator() # 使用for循环迭代 for num in my_gen: print(num) # 输出: 1, 2, 3, 4, 5 ``` 无论是使用迭代器还是生成器,我们都可以通过迭代来逐个访问元素,但生成器更加简洁和高效,因为它们按需生成值而不是一次性生成所有值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值