python-生成式、生成器、迭代器
2017-11-03 16:01
405 查看
1.列表生成式
通过一句简介的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理:
格式:
[exp for val incollection if condition]
相当于
result=[]
for val in collection:
if(condition):
result.append(exp)
在Python中,这种一边循环一边计算的机制,称为生成器(Generator)
生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个可用于生成连续 x 值的生成器【Generator】,简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。
要创建一个generator,下面给出2种方式的生成器:
1. 最简单的方法: 把原来生成式的[ ]换成()就可以 了
比如:
结果:
也可以通过循环访问:
结果:
2.如果一个函数定义中包含yield 关键字,那么这个函数就不在是一个普通函数,而是一个generator.
结果:
将 print (sum )改为: yield(sum )
结果:
需要使用循环来获取每个值
结果:
解释:
1,以为以上函数有关键字yield,所以生成的是一个生成器。
2,通过for循环调用生成器,当执行到yield的时候,返回sum的值,sum为0,此时暂停并记录sum的值
3,打印sum的值,然后继续往下执行。此时跳入下一个循环while(1<10)
4,直到遇到yield的时候,返回sum的值。
5,反复执行3,4步骤,知道循环结束,最终程序退出
return 与yield 二者之间的区别:
return: 一般在return ,直接退出
yield : 生成器函数在生成值后自动挂起并暂停他们的执行状态,他本地变量将保持状态信息,这些信息在函数恢复时将再度有效,下次从yield 下面的部分开始执行。
3. 迭代器:
迭代对象: 凡是可以用 for 循环的 都是 Iterable(可迭代对象)
迭代器:凡是需要通过next()函数获得值的可迭代对象都是 Iterator(迭代器)
生成式:一次性列出所有数据,
生成器: 返回一个可迭代对象,及generator 对象,必须通过循环才能取出所有的结果
可迭代对象: 可以通过循环调用出来的,即为可迭代的对象 [] /() /{} 生成式、生成器
迭代器: 就是生成器,必须通过next() 函数调用,并不断返回下一个值的对象,成为迭代器。
通过一句简介的语法就可以对一组元素进行过滤,还可以对得到的元素进行转换处理:
格式:
[exp for val incollection if condition]
相当于
result=[]
for val in collection:
if(condition):
result.append(exp)
在Python中,这种一边循环一边计算的机制,称为生成器(Generator)
生成器是一次生成一个值的特殊类型函数。可以将其视为可恢复函数。调用该函数将返回一个可用于生成连续 x 值的生成器【Generator】,简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。
要创建一个generator,下面给出2种方式的生成器:
1. 最简单的方法: 把原来生成式的[ ]换成()就可以 了
比如:
lt=(x*x for x in xrange(1,10) if x%2==0) print(lt) print(type(lt)) print(lt.next())//generator保存的是算法,每次调用next(),就计算出下一个元素的值,直到计算到最后一个元素为止 print(lt.next()) print(lt.next()) print(lt.next())
结果:
<generator object <genexpr> at 0x00000000024B2318> <type 'generator'> 4 16 36 64
也可以通过循环访问:
lt=(x*x for x in xrange(1,10) if x%2==0) print(lt) print(type(lt)) for i in lt: print i
结果:
<generator object <genexpr> at 0x00000000024B2318> <type 'generator'> 4 16 36 64
2.如果一个函数定义中包含yield 关键字,那么这个函数就不在是一个普通函数,而是一个generator.
def fib(n): sum = 0 i = 0 while(i<n): sum = sum +i i+=1 print(sum) fib(10)
结果:
0 1 3 6 10 15 21 28 36 45
将 print (sum )改为: yield(sum )
def fib(n): sum = 0 i = 0 while(i<n): sum = sum +i i+=1 yield(sum) fib(10) print(type(fib(10)))
结果:
<type 'generator'>
需要使用循环来获取每个值
for x in fib(10): print x
结果:
<type 'generator'>
0 1 3 6 10 15 21 28 36 45
解释:
1,以为以上函数有关键字yield,所以生成的是一个生成器。
2,通过for循环调用生成器,当执行到yield的时候,返回sum的值,sum为0,此时暂停并记录sum的值
3,打印sum的值,然后继续往下执行。此时跳入下一个循环while(1<10)
4,直到遇到yield的时候,返回sum的值。
5,反复执行3,4步骤,知道循环结束,最终程序退出
结果和上面的结果是一样的,但是有什么不同呢,简而言之,包含yield语句的函数会被特地编译成生成器。当函数被调用时,他们返回一个生成器对象,这个对象支持迭代器接口。每当遇到yield关键字的时候,你可以理解成函数的return语句,yield后面的值,就是返回的值。但是不像一般的函数在return后退出,生成器函数在生成值后会自动挂起并暂停他们的执行和状态,他的本地变量将保存状态信息,这些信息在函数恢复时将再度有效,下次从yield下面的部分开始执行。
return 与yield 二者之间的区别:
return: 一般在return ,直接退出
yield : 生成器函数在生成值后自动挂起并暂停他们的执行状态,他本地变量将保持状态信息,这些信息在函数恢复时将再度有效,下次从yield 下面的部分开始执行。
3. 迭代器:
迭代对象: 凡是可以用 for 循环的 都是 Iterable(可迭代对象)
迭代器:凡是需要通过next()函数获得值的可迭代对象都是 Iterator(迭代器)
生成式:一次性列出所有数据,
生成器: 返回一个可迭代对象,及generator 对象,必须通过循环才能取出所有的结果
可迭代对象: 可以通过循环调用出来的,即为可迭代的对象 [] /() /{} 生成式、生成器
迭代器: 就是生成器,必须通过next() 函数调用,并不断返回下一个值的对象,成为迭代器。
相关文章推荐
- python的高级特性:切片,迭代,列表生成式,生成器,迭代器
- python生成式,生成器,迭代器
- python 列表生成式、生成器、迭代器、yield
- python3 列表生成式、生成器、迭代器
- Python高级特性(切片,迭代,列表生成式、生成器、迭代器)
- python学习 生成器 列表生成式 迭代器
- 【Python】[高级特性]切片,迭代,列表生成式,生成器,迭代器
- Python高级特性(切片 迭代 列表生成式 生成器 迭代器)学习笔记
- 初学Python——列表生成式、生成器和迭代器
- python学习-Day15-python生成式和生成器、迭代器、装饰器
- python生成式、生成器和迭代器
- Python高级特性(切片,迭代,列表生成式,生成器,迭代器)
- python迭代器和生成器(3元运算,列表生成式,生成器表达式,生成器函数)
- python(四)上:列表生成式、生成器、迭代器和内置函数
- Python day5:列表生成式,生成器,迭代器
- Python笔记-列表生成式、生成器generator(包括斐波拉契数列)、迭代器Iterator
- Python之列表生成式、生成器、可迭代对象与迭代器
- Python3中的列表生成式、生成器与迭代器实例详解
- Python 迭代器 和 生成器yield
- Python--day12 python生成式和生成器