Python--Demo13--高级特性匿名函数、推导式、迭代器、生成器

学完函数,我们还需要知道一些让我们能够提高效率的高级特性:

使用lambda关键字来创建匿名函数:

  • lambda表达式只是一个表达式,而不是是一个代码块,函数体比def简单很多;
  • lambda表达式仅仅能够封装一些简单的逻辑;
  • lambda表达式拥有自己的命名空间。
>>> def plusitem(pam):
...     return pam*pam
...
>>> type(plusitem)
<class 'function'>
>>> plusitem(12)
144
>>> nonamefuc=lambda item:item*item
>>> type(nonamefuc)
<class 'function'>
>>> nonamefuc(12)
144

说明:lambda表达式就是一个函数昂。

列表推导式:

在不知道有列表推导式之前,我们想要生成一个[1,2,3...,9]的列表,是这样子写的 :

>>> mylis=[]
>>> for item in range(1,10):
...     mylis.append(item)
...
>>> mylis
[1, 2, 3, 4, 5, 6, 7, 8, 9]

如果我们有了列表推导式,可以十分简洁地生成一个列表:

>>> newlis=[item for item in range(1,10)]
>>> newlis
[1, 2, 3, 4, 5, 6, 7, 8, 9]

列表推导式的花式玩法:

1、增加条件判断

>>> jishulis=[x for x in range(1,10) if x%2==1]
>>> jishulis
[1, 3, 5, 7, 9]

2、多重循环

>>> shuangceng=[x*y for x in range(1,10) for y in [1,2,3]]
>>> shuangceng
[1, 2, 3, 2, 4, 6, 3, 6, 9, 4, 8, 12, 5, 10, 15, 6, 12, 18, 7, 14, 21, 8, 16, 24, 9, 18, 27]

迭代:

  • 迭代的概念就是通过for循环遍历对象的每个元素的过程。
  • python中的for可以遍历任何可迭代对象。
  • 在python中list、tuple、str、dict、set都是可迭代数据类型。
  • 在python中可以使用collextions模块中的Iterable类型来判断一个对象是否可以迭代。

迭代器:

一种可以被遍历的对象,并且可以作用于next()函数。迭代器对象从第一个元素访问,直到所有的元素被访问完才结束。迭代器只能往后遍历不能回溯。迭代器常用的两个方法iter()和next()。

我的理解就是:

把迭代器看成时间 你可以往后看十年、二十年、但是最终你是无法看到时间的终点的
而 我们把 可迭代对象 看成我们的上下五千年历史  我们可以看 公元10年 公元100 知道我们可以追溯到当下 2020年 可迭代对象是有终点的
python可以通过使用iter()函数 将上下五千年史---可迭代对象 转换成 历史长河---迭代器

>>> from collections import Iterable
>>> isinstance('123',Iterable)
True
>>> isinstance(123,Iterable)
False
>>> lis=[1,2,3,4]
>>> lis
[1, 2, 3, 4]
>>> it=iter(lis)
>>> it
<list_iterator object at 0x0000021E54846BE0>
>>> next(it)
1
>>> for x in it:
...     print(x)
...
2
3
4

说明:iter()可以创建迭代器,使用next()可以获取迭代器的下一个元素。for循环可以遍历迭代器。python中的for循环本质上就是通过next()函数实现的。

生成器:

有时候列表内的元素个数非常巨大,一下子制造出来放到内存中是内存压力会很大。我们可以通过某种算法把元素推算出来,用到哪儿时再计算出来使用。这就是生成器的作用。

通过圆括号---推导式的方法,可以编写生成器:

>>> g=(x for x in [2,4,6,8,10])
>>> g
<generator object <genexpr> at 0x0000021E5498C270>
>>> g[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable
>>> next(g)
2
>>> for item in g:
...     print(item)
...
4
6
8
10

使用yield关键字可以让一个函数制造出一个生成器。

比如下面,返回一个列表元素的平方。

>>> def genfunc(pams):
...     print('开始了..')
...     for item in pams:
...             yield item*item
...
>>> lis=[1,2,3,4,5]
>>> rtn=genfunc(lis)
>>> rtn
<generator object genfunc at 0x000001B6598795F0>
>>> next(rtn)
开始了..
1
>>> next(rtn)
4

说明:

拥有了yield的函数就变成了可以创造生成器的函数,函数调用之后,函数体不立即执行,反倒是返回一个生成器。

当我们使用next()作用到生成器上时,函数体开始执行,每执行到一次yield就暂时终止一次,将结果return回来。

再次调用next(),函数体还是会从上一次中断的地方继续。

猜你喜欢

转载自www.cnblogs.com/bigbosscyb/p/12350022.html