普通函数是顺序执行,遇到return或最后一行函数语句就会返回;
而变为generator的函数,每次调用next()的时候执行,遇到yield中断并返回值,再次调用next()时从上次yield语句处继续执行。
>>> def fib(max): ... n, a, b = 0, 0, 1 ... while n < max: ... yield b ... a, b = b, a + b ... n = n + 1 ... return 'done' ... >>> g = fib(6) # 生成generator对象 >>> g <generator object fib at 0x1024e0bf8> >>> next(g) # 调用next()函数不断获取后一个返回值 1 >>> next(g) 1 >>> next(g) 2 >>> next(g) 3 >>> next(g) 5 >>> next(g) 8 >>> next(g) # 此时 n = max, 没有yield可以执行了,所有调用就报错了 Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration: done >>> for n in fib(6): # 也可以使用for循环进行generator的迭代 ... print(n)
直接作用于for循环的数据类型有以下几种:
集合数据类型:list,tuple,dict,set,str等
generator:包括和带yield的函数
这些可作用for循环的对象统称为可迭代对象:Iterable。可通过isinstance()判断一个对象是否是Iterable:
不仅可作用于for循环,还可被next()不断调用返回下一个值,直至抛出StopIteration,这类对象成为迭代器:Iterator,也可使用isinstance进行判断:
迭代器Iterator表示的是一个数据流,可将数据流看做是一个有序队列,但不能提前知道队列的长度,只能通过next()函数实时按需计算下一个元素的值。
函数名是指向函数的变量,对于函数abs(),可将abs函数名看做变量,它指向可以计算绝对值的函数。另外,函数本身可以赋值给其他变量:
>>> abs(-10) # 调用求绝对值的函数 10 >>> abs # abs是函数本身 <built-in function abs> >>> f=abs # 将函数本身赋值给变量 >>> f <built-in function abs> >>> f(-10) # 通过变量来调用函数。直接调用abs()和调用变量f()相同 10
既然变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称为高阶函数。函数式编程就是指这种高度抽象的编程范式。例如:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-70754-7.html
讲的很准确