注意:两种基本方法:iter()和 next()。
list=[1,2,3] it=iter(list) while True: try: print(next(it)) except StopIteration: exit注意:StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况
注意:需要在类中实现两个方法__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 的下一条语句继续执行
不定长参数:
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使用 lambda 来创建匿名函数。
sum=lambda a,b:a+b print(sum(1,2))结果:3
注意:/ 用来指明函数形参必须使用指定位置参数,不能使用关键字参数的形式。 例如:形参 a 和 b 必须使用指定位置参数,c 或 d 可以是位置形参或关键字形参,而 e 或 f 要求为关键字形参:
