社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python】详解Python列表推导式|迭代器|生成器|匿名函数

机器学习初学者 • 3 年前 • 315 次点击  
详解python3匿名函数、推导式、迭代器和生成器用法。

1、匿名函数(lambda)

个人理解为一种简单的定义函数的方式,不需要使用def关键字定义函数。语法:lambda 参数:操作参数表达式。

add = lambda x, y: x + y
print(add(35))

8

list(map(lambda x, y: x + y, range(-22), range(15)))
#传入两个iterable对象range(-2, 2), range(1, 5)

[-1, 1, 3, 5]


2、推导式(comprehensions)

列表,字典和集合中都可以使用推导式。

列表推导式

一种简单创建列表的方法。

#if 语句置于for之后
In [29]: [x for x in range(111if x % 2 == 0]
#对于range(1, 11)中每个元素,能被2整除的输出组成新列表
Out[29]: [246810]

#if 语句置于for之前可以使用else
In [30]: [x if x % 2 == 0 else -x for x in range(111)]
#对于range(1, 11)中每个元素,能被2整除的输出原值,不能整除的取原值负数输出,组成新列表
Out[30]: [-12-34-56-78-910]

字典推导式

mcase = {'a'10'b'34'A'7'Z'3}
{k:v for k,v in mcase.items()}

{'a': 10, 'b': 34, 'A': 7, 'Z': 3}

集合推导式

{x**2 for x in [112]}#集合不允许重复

{1, 4}


3、迭代器(Iterator)

可迭代对象(Iterable)

python中的对象,只要具有方法__iter__和__getitem__就是可迭代对象,可迭代对象能提供迭代器。

迭代器(Iterator)

被定义了__next__方法的python对象。

判断对象是否是可迭代对象或迭代器

from collections.abc import Iterable, Iterator
def g():
    yield 1
    yield 2
    yield 3
#是否为python可迭代对象判断
print('Iterable? [1, 2, 3]:', isinstance([123], Iterable))#isinstance()判断一个对象是否是Iterable对象
print('Iterable? \'abc\':', isinstance('abc', Iterable))
print('Iterable? 123:', isinstance(123, Iterable))
print('Iterable? g():', isinstance(g(), Iterable))

#是否为python迭代器判断
print('Iterator? [1, 2, 3]:', isinstance([123], Iterator))#isinstance()判断一个对象是否是Iterator对象
print('Iterator? iter([1, 2, 3]):', isinstance(iter([123]), Iterator))
print('Iterator? \'abc\':', isinstance('abc', Iterator))
print('Iterator? 123:', isinstance(123, Iterator))
print('Iterator? g():', isinstance(g(), Iterator))
Iterable? [1, 2, 3]: True
Iterable? 'abc': True
Iterable? 123: False
Iterable? g(): True
Iterator? [1, 2, 3]: False
Iterator? iter([1, 2, 3]): True
Iterator? 'abc': False
Iterator? 123: False
Iterator? g(): True 

迭代(Iteration)

使用一个循环来遍历某个python对象时,这个过程就叫迭代。


4、生成器(Generators)

生成器也是一种迭代器,但是,只能对其迭代一次。这是因为它们并没有把所有的值存在内存中(可节省大量内存),而是边循环边生成值(生成器保存算法,可以计算下一个元素的值),创建生成器方法如下:

( )包围列表推导式生成

g = (x * x for x in range(10))#只迭代一次,只存储算法,不会生成所有元素存储于内存。
g

at 0x000002B53772C4C0>

for i in g:#for循环打印每个生成器中元素,在执行输出nothing(只迭代一次,只存储算法)
    print(i)

0149162536496481

自定义函数中添加yield关键字构建生成器

推算算法很复杂时使用自定义函数。举个例子,计算斐波那契数列的生成器。




    
def fibon(n):
    a = b = 1
    for i in range(n):
        yield a#该函数为一个生成器
        a, b = b, a + b
 for x in fibon(1000000):
    print(x) #不用担心它会使用大量资源      


参考资料

https://www.liaoxuefeng.com/wiki/1016959663602400/1017318207388128
Intermediate Python

-END-




    
往期 精彩回顾




Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/136306
 
315 次点击