python学习笔记4(迭代器与生成器&函数)

it2026-01-12  8

python学习笔记4(迭代器与生成器&函数)

一、迭代器1.1 基本方法1.2 类作为迭代器 二、生成器三、函数3.1 定义3.2 参数传递3.3 参数3.4 匿名函数3.5 强制位置参数

一、迭代器

1.1 基本方法

注意:两种基本方法:iter()和 next()。

list=[1,2,3] it=iter(list) while True: try: print(next(it)) except StopIteration: exit

注意:StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况

1.2 类作为迭代器

注意:需要在类中实现两个方法__iter__()与 __next__() 。

class MyNumbers: def __iter__(self): self.a = 1 return self def __next__(self): if self.a <= 20: x = self.a self.a += 1 return x else: raise StopIteration myclass = MyNumbers() myiter = iter(myclass) for x in myiter: print(x)

二、生成器

注意:使用了 yield 的函数被称为生成器(generator)

import sys def fibonacci(n): # 生成器函数 - 斐波那契 a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1 f = fibonacci(10) # f 是一个迭代器,由生成器返回生成 while True: try: print (next(f), end=" ") except StopIteration: sys.exit()

yield: (1)不用list的原因:占用内存 (2)执行到 yield a 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield a 的下一条语句继续执行

三、函数

3.1 定义

def mylove(str): print("I love",str) mylove("Chengdu")

3.2 参数传递

3.3 参数

不定长参数:

1、加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。

def mylove(str,*tuple): print("I love ",str) print(tuple) mylove('Chengdu','Chongqing','Changsha')

输出:

I love Chengdu ('Chongqing', 'Changsha')

2、加了两个星号 ** 的参数会以字典的形式导入。

def mylove(str,**tuple): print("I love ",str) print(tuple) mylove('Chengdu',Chongqing="hotpot")

输出:

I love Chengdu {'Chongqing': 'hotpot'}

3、单独出现星号 * 后的参数必须用关键字传入。

def mylove(str,*,str2): print("I love ",str) print("And also ",str2) mylove('Chengdu',str2='Chongqing')

结果:

I love Chengdu And also Chongqing

3.4 匿名函数

使用 lambda 来创建匿名函数。

sum=lambda a,b:a+b print(sum(1,2))

结果:3

3.5 强制位置参数

def f(a, b, /, c, d, *, e, f): print(a, b, c, d, e, f)

注意:/ 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。 例如:形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 或 f 要求为关键字形参:

最新回复(0)