1、例题
定义一个函数,去除列表中的重复项同时保持原来列表中的顺序。
def unique(items): #定义函数unique
items_existed = set() #空的集合用于保存结果
for item in items:
if item not in items_existed:
yield item #yield关键词生成当前结果并继续迭代不返回
items_existed.add(item) #结果是一个生成器对象
#示例代码
if __name__=="__main__":
a=[1,2,3,4,2,3,4,5,6,7]
a1=unique(a) #调用了上述
print(list(a1))
2、详解
(1)生成器
生成器(Generator)是一种特殊的迭代器,可以在需要时生成值,而不需要一次性将所有值存储在内存中。使用yield
语句来产生值,并在每次生成值后暂停执行,保留当前状态以便下次调用时继续执行。可以通过生成器表达式或定义函数并使用yield语句来建立一个生成器。
生成器表达式类似于列表的推导式,但列表使用的是方括号,生成器表达式使用圆括号。
a = [x*3 for x in range(4)] #定义a为列表
print(a) #输出结果:[0, 3, 6, 9]
a=(x*3 for x in range(4)) #此时a为生成器对象
print(a) #结果报错:<generator object <genexpr> at 0x000001AA53581A40>
print(list(a)) #[0, 3, 6, 9]
(2)for item in items
item和items不是特定的数据类型,而是代码使用过程中的变量名称。如果items是列表的话那么就遍历列表的每个元素,items是字符串的话就遍历每个字符。
Python会遍历items中的每个元素,并将当前元素赋值给item
,然后执行循环体中的代码。这种语法通常用于遍历集合中的元素或处理可迭代对象中的每个元素。
最后再给出一个使用生成器来构造斐波那契数列(Fibonacci)的前n个值的例子:
def fibonacci_generator(n):
a, b = 0, 1
for _ in range(n): #_是临时变量
yield a
a, b = b, a + b
# 使用生成器函数生成前10个斐波那契数
fib_gen = fibonacci_generator(10)
for i in fib_gen:
print(i)