列表推导式与表达式生成器在 Python 中的滥用!

Python中的生成器表达式与列表推导式的不同点。 然而,如果只需要迭代一次结果或将结果传递给需要迭代器的函数(如map()、filter()等),则生成器表达式是更好的选择。生成器对象按需生成元素,一次只产生一个元素,这样可以节省大量内存,特别是当处理的数据集非常大时。列表推导式是一种简洁的构建列表的方法,它通过一个表达式来生成列表中的每一个元素,并且整个列表是立即生成的,这意味着所有的元素都需要在内存中同时存储。:返回的是一个生成器对象(Generator Object),这是一个迭代器,可以逐个产生元素,而不是一次性生成所有元素。 阅读详情

 列表推导式是我喜欢的 Python 特性之一。我非常喜爱列表推导式,为此我写过一篇关于它们的文章,做过一次针对它们的演讲,还在 PyCon 2018 上办过一个三小时推导式教程。

我喜爱推导式,但是我发现一旦一个新的 Python 使用者开始真正使用推导式,他们会在所有可能的地方用这些推导式。 推导式很可爱,但也很容易被滥用 。

Python资源共享群:484031800

这篇文章展示的案例中,从可读性的角度来看,推导式都不是完成任务的最佳工具。我们会讨论一些案例,它们有比使用推导式更具有可读性的选择,我们还会看到一些不明显的案例,它们根本就不需要使用推导式。

如果你还不是推导式的爱好者,那么这篇文章并不是为了吓退你,而是为了鼓励那些需要它的人(包括我)适度地使用它。

注意:本文中涉及到的“推导式”是涵盖了所有形式的推导式(列表,集合,字典)以及生成表达式。如果你对推导式还不是特别熟悉,我建议你先阅读这篇文章 或者这个演讲(这个演讲对生成器表达式挖掘的比较深)。

编写拥挤的推导式

列表推导式的批评者总是抱怨它们的可读性太差。他们是对的,很多推导式 都 很难读。 一些时候,让这些推导式变的更易读的方法仅仅是多一点间隔 。

观察一下这个函数中的推导式:

def get_factors(dividend):
    """返回所给数值的所有因子作为一个列表。"""
    return [n for n in range(1, dividend+1) if dividend % n == 0]
复制代码

我们可以通过添加一些合适的换行来让这个推导式更易读:

def get_factors(dividend):
    """返回所给数值的所有因子作为一个列表。"""
    return [
        n
        for n in range(1, dividend+1)
        if dividend % n == 0
    ]
复制代码

代码越少意味着越好的可读性,但并不总是这样。 空白符是你的好朋友,尤其是在你使用推导式的时候 。

通常来说,我跟倾向于使用上面的缩进格式来写我的推导式并 利用多行来隔离代码 。有时我也用单行来写解析式,但是我不默认使用单行。

编写的推导式太丑

一些循环是 可以 被写成推导式的形式,但是如果循环里面有太多逻辑,那他们可能 不应该 被这样改写。

观察一下这个推导式:

fizzbuzz = [
    f'fizzbuzz {n}' if n % 3 == 0 and n % 5 == 0
    else f'fizz {n}' if n % 3 == 0
    else f'buzz {n}' if n % 5 == 0
    else n
    for n in range(100)
]
复制代码

这个推导式等价于这样的 for 循环:

fizzbuzz = []
for n in range(100):
    fizzbuzz.append(
        f'fizzbuzz {n}' if n % 3 == 0 and n % 5 == 0
        else f'fizz {n}' if n % 3 == 0
        else f'buzz {n}' if n % 5 == 0
        else n
    )
复制代码

推导式和 for 循环都使用了三层嵌套的内联 if 语句 (Python 的三元操作符)

这里有一个更易读的方式,使用 if-elif-else 结构:

fizzbuzz = []
for n in range(100):
    if n % 3 == 0 and n % 5 == 0:
        fizzbuzz.append(f'fizzbuzz {n}')
    elif n % 3 == 0:
        fizzbuzz.append(f'fizz {n}')
    elif n % 5 == 0:
        fizzbuzz.append(f'buzz {n}')
    else:
        fizzbuzz.append(n)
复制代码

即使这里 有 一种用推导式书写代码的方法, 但是这并不意味着你 必须 要这么做 。

在推导式里有很多复杂逻辑时,即使是单个的内联 if 也需要谨慎。

number_things = [
    n // 2 if n % 2 == 0 else n * 3
    for n in numbers
]
复制代码

如果你倾向于在此类案例中使用推导式,那你至少需要考虑 是否可以使用空白符或者括号可以提高可读性 :

number_things = [
    (n // 2 if n % 2 == 0 else n * 3)
    for n in numbers
]
复制代码

并且,考虑一下提取你的逻辑操作到一个独立的函数是否也可以改进你的可读性(这个略傻的例子没有体现)。

number_things = [
    even_odd_number_switch(n)
    for n in numbers
]
复制代码

一个独立的函数是否可以提高可读性,取决于这个操作的重要程度、规模,以及函数名能否传达操作的含义。

伪装成推导式的循环

有时你会遇到使用了推导式语法却破坏了推导式初衷的代码。

比如,这个代码好像是一个推导式:

[print(n) for n in range(1, 11)]
复制代码

但是它不像推导式一样 运行 。我们使用推导式达到的目的并不是它的本意。

如果我们在 Python 中执行这个推导式,你就会明白我的意思:

>>> [print(n) for n in range(1, 11)]
[None, None, None, None, None, None, None, None, None, None]
复制代码

我们是想打印 1 到 10 之间的所有数,同时我们也是这么做的。但是这个推导式的语句返回了一个全是 None 值的列表给我们,对我们毫无意义。

你给推导式什么内容,它就会建立什么样的列表。我们从 print 函数那里获得值去建立列表,而 print 函数的返回值就是 None 。

但我们并不在意推导式建立的列表,我们只关心它的副作用。

我们可以用下面的代码替代之前的代码:

for n in range(1, 11):
    print(n)
复制代码

列表推导式会 循环一个迭代器并且建立一个新的列表 , for 循环是用来 遍历一个迭代器同时完成你想做的任何操作 。

当我在代码中看到推导式时, 我立即会假设我们创建了一个新的列表 (因为这个就是它的作用)。如果你用一个推导式完成 创建列表之外的目的 ,它会给其他读你代码的人带来困扰。

如果你不是为了创建一个新的列表,那就不要使用推导式。

当存在更特定工具时,使用推导式

在很多问题中,更特定的工具比通用目的的 for 循环更有意义。 但推导式并不总是最适合手头工作的专用工具。

我见过并且写过一堆像这样的代码:

import csv
with open('populations.csv') as csv_file:
    lines = [
        row
        for row in csv.reader(csv_file)
    ]
复制代码

这种推导式会对 唯一性 的值进行排序。它的目的就是循环我们提供的迭代器( csv.reader(csv_file) )并且创建一个列表。

但是,在 Python 中,我们为这个任务提供了一个更特定的工具: list 的构造函数。Python 的 list 构造函数可以为我们完成循环并创建列表的工作。

import csv
with open('populations.csv') as csv_file:
    lines = list(csv.reader(csv_file))
复制代码

推导式是一种特殊用途的工具,用于在迭代器上循环,以便在修改每个元素的同时创建一个新列表,并/或过滤掉一些元素。 list 构造函数是一个特定目的工具,用来遍历推导式并创建列表,同时不会改变任何的东西。

如果在建立列表时你不需要过滤元素或将它们映射到新元素中, 你不需要使用推导式,你只需要使用 list 构造函数 。

这个推导式转换了从 zip 中得到的 row 元组并放入列表:

def transpose(matrix):
    """返回给定列表的转置版本。"""
    return [
        [n for n in row]
        for row in zip(*matrix)
    ]
复制代码

我们同样也可以使用 list 构造函数:

def transpose(matrix):
    """返回给定列表的转置版本。"""
    return [
        list(row)
        for row in zip(*matrix)
    ]
复制代码

每当你看到如下的推导式时:

my_list = [x for x in some_iterable]
复制代码

你可以用这种写法替代:

my_list = list(some_iterable)
复制代码

这同样适用于 dict 和 set 的推导式。

这个是我过去经常会写的东西:

states = [
    ('AL', 'Alabama'),
    ('AK', 'Alaska'),
    ('AZ', 'Arizona'),
    ('AR', 'Arkansas'),
    ('CA', 'California'),
    # ...
]
abbreviations_to_names = {
    abbreviation: name
    for abbreviation, name in states
}
复制代码

我们遍历一个有两项元组构成的列表,并以此生成一个字典。

这个任务实际上已经被 dict 的构造函数完成了:

abbreviations_to_names = dict(states)
复制代码

list 和 dict 的构造函数不是唯一的推导式替代工具。标准库和第三方库中包含了很多工具,在有的时候,他们比推导式更适合于你的循环要求。

下面这个是一个生成器表达式,目的是对嵌套迭代器求和:

def sum_all(number_lists):
    """返回二维列表中所有元素的和。"""
    return sum(
        n
        for numbers in number_lists
        for n in numbers
    )
复制代码

使用 itertools.chain 可以达到同样的目的:

from itertools import chain
def sum_all(number_lists):
    """返回二维列表中所有元素的和。"""
    return sum(chain.from_iterable(number_lists))
复制代码

什么时候使用推导式什么时候使用替代品,这个的界定没有那么清晰。

我也经常纠结使用 itertools.chain 还是推导式。我通常会把两种都写出来然后使用更清晰的那个。

可读性在编程结构中总是针对于特定问题的,这个在推导式上也适用。

无效的工作

有时候你会发现,推导式不应该被另一个构造函数所替代,而应该被 完全删除 ,只留下需要遍历的迭代器。

这段代码打开了一个单词构成的文件(每行一个单词),存储这个文件,同时计数每个单词出现的次数:

from collections import Counter
word_counts = Counter(
    word
    for word in open('word_list.txt').read().splitlines()
)
复制代码

我们使用了一个生成器表达式,但我们并不需要如此。可以直接这样写:

from collections import Counter
word_counts = Counter(open('word_list.txt').read().splitlines())
复制代码

我们在传给 Counter 类之前遍历了整个列表并转换为一个生成器。完全是无用功。 Counter 类是接受 任何迭代器,不论它是列表,生成器,元组或者是其它结构 。

这是另外一个无效的推导式:

with open('word_list.txt') as words_file:
    lines = [line for line in words_file]
    for line in lines:
        if 'z' in line:
            print('z word', line, end='')
复制代码

我们遍历了 words_file ,转化为列表 lines ,再去遍历 lines 一次。整个对于列表的转换是不必要的。

我们可以直接遍历 words_file :

with open('word_list.txt') as words_file:
    for line in words_file:
        if 'z' in line:
            print('z word', line, end='')
复制代码

没有任何理由将我们只需要遍历一次的迭代器转换为列表。

在 Python 中,我们更关注 它是不是一个迭代器 而不是 它是不是一个列表 。

在不需要的时候,不要去创建一个新的迭代器。 如果你只是为了遍历这个迭代器一次,你可以直接使用它 。

什么时候应该使用推导式?

那么,什么时候确实应该使用推导式呢?

一个简单但是不准确的回答是,当你需要写如下文复制-粘贴推导式格式中所提到的代码,同时你没有其他的工具可以让你的代码更精简,你就应该考虑使用列表推导式了。

new_things = []
for ITEM in old_things:
    if condition_based_on(ITEM):
        new_things.append(some_operation_on(ITEM))
复制代码

循环可以用这样的推导式重写:

new_things = [
    some_operation_on(ITEM)
    for ITEM in old_things
    if condition_based_on(ITEM)
]
复制代码

更复杂的回答是,当推导式有意义时,你就应该考虑它。这实际上不算是一个回答,但确实没人回答“什么时候该使用推导式”这个问题。

这里有一个 for 循环看起来的确不像是可以用推导式重写:

def is_prime(candidate):
    for n in range(2, candidate):
        if candidate % n == 0:
            return False
    return True
复制代码

但实际上,如果我们知道怎么使用 all 函数,我们可以用生成器表达式来重写它:

def is_prime(candidate):
    return all(
        candidate % n != 0
        for n in range(2, candidate)
    )
复制代码

我写过一篇文章叫 any 和 all 函数 的文章来描述这对操作和生成器表达式是多么搭配。但是 any 和 all 并不是唯一与生成器表达式有关联的。

还有一个相似场景的代码:

def sum_of_squares(numbers):
    total = 0
    for n in numbers:
        total += n**2
    return total
复制代码

这里没有 append 同时也没有迭代器被建立。但是,如果我们创建一个平方的生成器,我们可以使用内置的 sum 函数去得到一样的结果。

def sum_of_squares(numbers):
    return sum(n**2 for n in numbers)
复制代码

所以,除了要考虑检查“我是否可以从一个循环复制-粘贴到推导式”之外,我们还需要考虑:我们是否可以通过结合生成器表达式与接受迭代器的函数或者类来增强我们的代码?

那些可以 接受迭代器作为参数 的函数或者类, 可能是与生成器表达式组合的 优秀组件。

深思熟虑后使用列表推导式

列表推导式可以使你的代码更可读(如果你不相信我,可以看我的演讲可理解的推导式中的例子),但是它确实被滥用。

列表推导式是被用来解决特定问题的专用工具。 list 和 dict 的构造函数是被用来解决更具体问题的更专用的工具。

循环是 更通用的工具 ,适用于当你遇到的问题不适合推导式或其它专用循环工具领域的场景。

像 any 、 all 和 sum 这样的函数,以及像 Counter 和 chain 这样的类都是接受迭代器的工具,它们 与推导式 非常匹配,有时 完全取代了推导式 。

请记住,推导式只有一个目的: 从旧的迭代器中创建一个新的迭代器 ,同时在此过程中稍微调整值和/或过滤不匹配条件的值。推导式是一个可爱的工具,但是 它们不是你唯一的工具 。当你的推导式不能胜任时,不要忘记 list 和 dict 构造函数,以及 for 循环。

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。 

深入理解Python中的列表推导式与生成器表达式 例如,如果你正在编写一个复杂的算法,并且使用列表推导式会使代码变得难以理解,那么你可能需要考虑使用更传统的循环结构或生成器表达式来提高代码的可读性。然而,列表推导式的一个潜在缺点是它会在内存中创建一个完整的列表,如果列表非常大,这可能会消耗大量的内存。生成器表达式与列表推导式非常相似,但它们的返回值是一个生成器对象,而不是一个完整的列表。一旦生成器被迭代完毕,它将不再产生新的元素。:列表推导式会在内存中创建一个完整的列表,而生成器表达式则只在迭代过程中生成元素,因此它们在处理大数据集时具有显著的内存优势。 阅读详情

相关推荐

AI提示词实战:用EARS语法5步搞定产品需求拆解(附完整案例)

本文详细介绍了如何运用EARS语法将模糊的产品需求进行原子化拆解,转化为清晰、可执行的结构化指令。通过一个完整的自由职业者项目管理工具案例,演示了从原始需求分析到构建增强AI提示词的五步实战流程,帮助产品经理和技术人员实现高效、精准的需求传达与协作。

nokia的博客 1031

vue js对象拷贝的方法简单易用

对象拷贝的方法是一个难点,尤其是深拷贝。建议把代码都运行下,帮助理解拷贝。 一. json方法 适合情况:  JSON对象的深度克隆。方法是先JSON.stringify() 转为json字符串, 再JSON.parse() 转为json数组 缺点:   a. 如果你的对象里有函数, 函数无法被拷贝下来   b. 无法拷贝copyObj对象原型链上的属性和方法 var obj = { x: 1, y: { a: 1, b: 0, c

web全栈开发的博客 2562

先进封装基础知识

想象一下,芯片就像是电脑或手机的大脑,但它非常脆弱,需要被保护起来。芯片封装就是给芯片穿上一件“保护衣”,这件“保护衣”不仅可以保护芯片,还能帮助芯片与外部世界进行沟通。

阿拉伯梳子的专栏 1143

python 列表推导式 else_列表推导式与表达式生成器在 Python 中的滥用!

列表推导式是我喜欢的 Python 特性之一。我非常喜爱列表推导式,为此我写过一篇关于它们的文章,做过一次针对它们的演讲,还在 PyCon 2018 上办过一个三小时推导式教程。我喜爱推导式,但是我发现一旦一个新的 Python 使用者开始真正使用推导式,他们会在所有可能的地方用这些推导式。 推导式很可爱,但也很容易被滥用 。Python资源共享群:484031800这篇文章展示的案例中,从可读性...

weixin_30802909的博客 584

3款主流AIGC模型部署方案对比:本地、云端与混合架构的成本与性能分析

本文对比分析了3种主流AIGC模型部署方案(本地、云端与混合架构)的成本与性能差异,帮助企业在预算、性能和维护复杂度之间找到最佳平衡点。通过实际案例和详细数据,展示了不同部署方式在延迟、扩展性、数据隐私等方面的优劣势,为技术决策者提供实用参考。

weixin_33158887的博客 370

Imputation Methods for scRNA Sequencing Data

越来越多的研究者使用单细胞RNA测序(scRNA-seq)技术来表征单细胞水平的转录图谱。他们用它来研究复杂组织的异质性、转录组动力学和未知生物的多样性。然而,在基因表达模式随机性的scRNA-seq数据中普遍存在许多技术和生物学上的噪音。这些数据通常具有高维、稀疏和大量“dropout”值的特点,并且受批处理效应的影响。scRNA-seq数据中大量的“dropout”值严重掩盖了基因之间的重要关系,阻碍了下游分析。因此,scRNA-seq数据dropout值的估算就显得尤为重要。

qq_34179307的博客 540

Python 列表推导式与生成器表达式

列表推导式是 Python 中一种简洁的方式,用于从一个可迭代对象(如列表、元组或字符串)创建一个新的列表。expression:对每个item执行的操作或计算。item:可迭代对象中的每个元素。iterable:需要迭代的对象(如列表、集合、范围等)。condition(可选):筛选符合条件的元素。生成器表达式的语法与列表推导式非常相似,唯一的区别是它使用圆括号()而不是方括号[]。生成器表达式是创建生成器对象的简洁方法,生成器是一个懒加载的可迭代对象。

学习,你不是一个人在战斗 ~ 961302305(QQ,微信) 1354

Hypermesh二次开发实战:Tcl命令分类与常用函数详解(附避坑指南)

本文深入解析Hypermesh二次开发中Tcl命令的三大核心类别:界面命令、查询命令与修改命令。重点剖析了*createmark集合管理与hm_getvalue信息查询等关键函数的实战用法,并提供了避免Mark覆盖、生命周期管理等常见陷阱的实用指南,旨在帮助CAE工程师构建高效可靠的自动化前处理流程。

weixin_29233333的博客 238

Python入门 推导式 ! 解释:生成器表达式和列表推导式的区别

Python 入门之 推导式 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895,817, 687 有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家一起学习交流! 推导式就是构建比较有规律的列表,生成器,字典等一种简便的方式 1、推导式 (1)列表推导式 : <1> 普通循环: [变量 for循环] print([i for i in...

weixin_42625143的博客 1074

14、多级快速多极子算法(MLFMA)详解

多级快速多极子算法(MLFMA)是一种高效加速矩阵向量乘法(MVM)的数值方法,广泛应用于电磁场积分方程求解中。该算法通过构建多级树结构,将MVM分解为近场直接计算和远场分组计算两部分,利用递归聚类、聚合-平移-分解三阶段处理远场相互作用,并结合采样、模式计算与优化策略,将计算复杂度从O(N^2)降低至O(N log N)。博文详细阐述了MLFMA的核心步骤、数学推导、计算复杂度及实际应用中的优化技术,如伽辽金方案改进、对称性利用和反插值方法,为大规模电磁问题的高效求解提供了系统性指导。

t8u9v0w1x的博客 241

【OpenClaw企业级智能体实战】第27篇:Skill生态运营——企业私有Skill商店的搭建与审核机制

2026年ClawHavoc供应链攻击事件曝光超1200个恶意Skill渗透公共技能市场,工信部明确要求企业审慎使用第三方技能包并严格审查代码。本文基于真实安全事件与行业实践,完整讲解企业私有Skill商店从0到1搭建方案,覆盖小团队极简GitLab私有仓库、中大型企业Nacos 3.2私有Registry两种主流架构,配套企业级安全审核四步法、静态代码扫描规则、CI/CD自动化审计、数字签名校验与版本生命周期管理。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 499

Python 中如何使用列表推导式与生成器表达式?

Python 作为一门简洁且强大的编程语言,其语言特性之一便是提供了列表推导式和生成器表达式这两种便捷的工具,用来创建和处理数据。这两种表达式不仅让代码更加简洁,还能提升性能。虽然它们有相似之处,但在实现方式和使用场景上有所不同。本文将深入探讨这两种表达式的用法、差异和应用场景,帮助大家更好地理解如何利用它们提高代码的可读性和执行效率。

1066

使用Open3D进行RGB-D图像点云处理

在本文中,我们将使用Open3D来处理RGB-D图像,提取点云并进行一些基本的操作。总结起来,本文介绍了如何使用Open3D库处理RGB-D图像并提取点云。我们展示了如何读取RGB-D图像,创建RGB-D图像和点云,并显示点云。除了显示点云,Open3D还提供了许多其他功能,如点云滤波、点云配准、表面重建等。在创建RGB-D图像时,我们需要指定深度图像的缩放因子和截断值,以及是否将RGB图像转换为强度图像。希望本文能够帮助您入门Open3D,并在处理RGB-D图像和点云数据时提供一些指导。

QfcaLinux的博客 445

你还在滥用列表推导式?这5种场景必须改用生成器表达式!

掌握Python生成器表达式与列表推导式性能差异,避免内存浪费。本文揭示5种应优先使用生成器的场景,如处理大文件、无限序列等,通过惰性求值提升效率。理解核心区别,优化代码性能,值得收藏。

InstrWander的博客 578

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Python基础09-列表推导式和生成器表达式_列表推导式或生成器表达式

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

m0_60635609的博客 971

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

26. 列表推导式与生成器表达式

本文介绍了Python中的列表推导式、生成器表达式以及is与==的区别。列表推导式提供了一种简洁的创建列表的方式,基本语法为[expression for item in iterable],支持条件过滤和多重循环。生成器表达式使用圆括号,按需生成元素,适合处理大数据集。is比较对象内存地址,==比较值,需要注意小整数缓存等特殊情况。列表推导式和生成器表达式各有适用场景,前者立即生成结果,后者节省内存但只能迭代一次。

weixin_43484713的博客 1071

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

探秘Python编程艺术:列表推导式与生成器表达式的魔法实践之旅

在Python的世界里,简洁高效的代码编写往往体现着开发者智慧的火花。列表推导式和生成器表达式正是这种智慧结晶的两种重要形式,它们赋予了Python无尽的魅力与强大功能。本文将带领读者揭开这两种高级特性的神秘面纱,详述其基本概念、常用方法,并通过实战应用演示其威力所在。最后,我们将一起探讨它们在复杂场景下的设计哲学与潜在价值。

guting18893110463的博客 1350

【Python】迭代器、生成器、表达式

else:return num# 使用迭代器print(num)

hdz_wiz_csdn的博客 1876

Python 中的列表推导式与生成器:特性、用途与区别

列表推导式和生成器是Python编程中非常有用的两种创建可迭代对象的方式。它们各自有着独特的优势,根据实际需求可以选择合适的工具。列表推导式适用于一次性生成并操作所有值的情况,而生成器则适用于按需生成值、节省内存并需要惰性计算的场景。通过本文的比较,希望读者能更好地理解并选择合适的工具来处理不同的数据处理任务。

qq_41586251的博客 1559

Python | 生成器与列表推导式

转化为迭代器用iter方法,因为先要在内存中有这么一个列表,才能转化,所以在还没转化前就已经占用很大的内存了。使用生成器来取这个列表元素,因为一个yield对应一个next,所以每次取时,在内存中只会占用当前yield出来的数据的内存量。i是从iterable中取一个就放一个到列表中,iterable中有多少个元素,循环后列表中就有多少个元素。输出结果是打印200次,每次在内存中占用的内存只有当前的i那么大。这里的1不是取出来的,是调用时打印出来的,2才是取出来的。迭代器是有提供的,或者是转化而来的。

千禧年无敌优香大王的博客 779

【Python】深入理解Python的列表推导式与生成器表达式:简洁与性能的权衡

Python的列表推导式和生成器表达式是两个强大的工具,用于编写简洁、优雅且高效的代码。列表推导式提供了一种紧凑的方式创建列表,而生成器表达式则是一种惰性求值的方式,可在需要时生成数据,从而节省内存。本文将详细探讨两者的区别,分析它们的内部工作原理,并通过具体的示例展示它们在不同场景下的应用,帮助读者在性能和代码简洁性之间找到最佳的平衡点。通过理解这两种表达式的特性,程序员可以更好地编写高效的Python代码。

一个被知识诅咒的人 1181

Python 三元表达式、列表推导式、生成器表达式

一、三元表达式 三元表达式,也称为if,else的紧凑形式。具体用法如下: def max(a,b): if a>b: return a else: return b def max(a,b): return a if a>b else b 上面这两个函数实现的功能是完全一样的。第二个函数中 a if a>b else b 就是一个三元表达式。 左边是条件为真时返回的值,中间是判断条件,右边是条件假返回的值。 二、列表推导式

python学习者的博客 2996

学Python记笔记_列表——列表推导式_矩阵转置_生成器表达式

文章目录一、列表推导式结构二、列表推导式的运行三、用法示例I、求a~d能组成的所有两字符的字符串Ⅱ、矩阵转置完 一、列表推导式结构 列表推导式的结构是一个特殊的列表结构,以空格为间隔,包含表达式和若干个条件语句,其中,条件语句至少有一个for语句 [expression for... [for,if] [for,if]...] 二、列表推导式的运行 列表推导式运行时,首先执行第一个条件语句,之后依次向右执行剩余的条件语句,最后再执行表达式。条件语句之间的关系时自左向右嵌套 运行结束后返回符合条件的所有表达

Ho1aAs‘s Blog 2648

3.1 Python 列表推导式与生成器表达式

Python的列表推导式和生成器表达式提供了简洁高效的数据处理方式。列表推导式用[]创建完整列表,适合数据量小且需多次访问的场景;生成器表达式用()实现惰性计算,内存效率高,适合处理大数据。两者支持条件过滤、嵌套循环等操作,还可拓展为字典/集合推导式。选择依据主要取决于数据规模、内存限制和访问需求,列表推导式更通用,生成器表达式更节省资源。高级应用包括嵌套处理、函数集成和多迭代对象操作,能显著提升代码可读性和性能。

ylumwd的博客 1175

Python列表推导式和生成器表达式

和列表一样,列表推导式也采用

RangeBlog 5230
上一篇: Python:字典的高级知识!
下一篇: Python快速开发分布式搜索引擎Scrapy精讲!
普通网友
博客等级 码龄7年 438粉丝 263原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值