python学习笔记4(迭代器与生成器&函数)
一、迭代器
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 要求为关键字形参: