3种方案 | 抛弃for循环,让Python代码更丝滑 !

3种方案 | 抛弃for循环,让Python代码更丝滑 为什么要挑战自己在代码里不写 for loop?因为这样可以迫使你去学习使用比较高级、比较地道的语法或 library。文中以 python 为例子,讲了不少大家其实在别人的代码里都见过、但自己很少用的语法。 阅读详情

为什么要挑战自己在代码里不写 for loop?因为这样可以迫使你去学习使用比较高级、比较地道的语法或 library。文中以 python 为例子,讲了不少大家其实在别人的代码里都见过、但自己很少用的语法。

自从我开始探索 Python 中惊人的语言功能已经有一段时间了。一开始,我给自己一个挑战,目的是让我练习更多的 Python 语言功能,而不是使用其他编程语言的编程经验。这让事情变得越来越有趣!代码变得越来越简洁,代码看起来更加结构化和规范化。下面我将会介绍这些好处。

通常如下使用场景中会用到 for 循环:

  • 在一个序列来提取一些信息。

  • 从一个序列生成另一个序列。

  • 写 for 已成习惯。

幸运的是,Python 已经有很多工具可以帮助你完成这些工作,你只需要转移你的思路,并以不同的角度来思考它。

通过避免编写 for 循环,你可以获得什么好处:

  • 较少的代码量

  • 更好的代码可读性

  • 更少的缩进(对 Python 还是很有意义的)

我们来看一下下面的代码结构:

# 1
with ...:
    for ...:
        if ...:
            try:
            except:
        else:

在这个例子中,我们正在处理多层嵌套的代码,这很难阅读。这个例子使用了多层嵌套的代码。我在这段代码中发现它无差别使用缩进把管理逻辑(with, try-except)和业务逻辑(for, if)混在一起。如果你遵守只对管理逻辑使用缩进的规范,那么核心业务逻辑应该立刻脱离出来。

"扁平结构比嵌套结构更好" - The Zen of Python

可以使用的已有的工具来替换 for 循环

1.List Comprehension / Generator 表达式

我们来看一个简单的例子。如果你想将一个数组转换为另一个数组:

result = []
for item in item_list:
    new_item = do_something_with(item)
    result.append(item)

如果你喜欢 MapReduce,你也可以使用 map,或者 Python 中的 List Comprehension:

result = [do_something_with(item) for item in item_list]

同样,如果您只想迭代数组中的元素,也可以使用一样的代码 Generator Expression。result = (do_something_with(item) for item in item_list)

2.函数

如果您想要将一个数组映射成另外数组,只需调用 map 函数,就可以用一个更高级、更实用的编程方式解决这个问题。

doubled_list = map(lambda x: x * 2, old_list)

如果要将序列减少为单个,请使用 reduce

from functools import reduce
summation = reduce(lambda x, y: x + y, numbers)

另外,许多 Python 内置函数都会使用 iterables:

>>> a = list(range(10))
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> all(a)
False
>>> any(a)
True
>>> max(a)
9
>>> min(a)
0
>>> list(filter(bool, a))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> set(a)
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> dict(zip(a,a))
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
>>> sorted(a, reverse=True)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> str(a)
'[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]'
>>> sum(a)
45

3.Extract Functions or Generators

上述两种方法是很好的处理更简单的逻辑。更复杂的逻辑怎么样?作为程序员,我们编写函数来抽离出复杂的业务。相同的想法适用于此。如果你是这样写的:

results = []
for item in item_list:
    # setups
    # condition
    # processing
    # calculation
    results.append(result)

显然你对一个代码块添加了太多的责任。相反,我建议你做:

def process_item(item):
    # setups
    # condition
    # processing
    # calculation
    return result


results = [process_item(item) for item in item_list]

如果换成嵌套函数会如何

results = []
for i in range(10):
    for j in range(i):
        results.append((i, j))

换成 List Comprehension 来实现是这样的:

results = [(i, j)
           for i in range(10)
           for j in range(i)]

如果你的代码块需要记录一些内部状态

# finding the max prior to the current item
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
results = []
current_max = 0
for i in a:
    current_max = max(i, current_max)
    results.append(current_max)


# results = [3, 4, 6, 6, 6, 9, 9, 9, 9, 9]

我们使用 generator 来实现这一点:

def max_generator(numbers):
    current_max = 0
    for i in numbers:
        current_max = max(i, current_max)
        yield current_max


a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
results = list(max_generator(a))

读者可能要问 “等等!你在 generator 中用到 for 循环,作弊啊!别急,再看看下面的代码。

不要自己写。itertools 会帮你实现了

这个模块很简单。我相信这个模块在大多数场景中可以替换你原先的 for 循环。例如,最后一个例子可以重写为:

from itertools import accumulate
a = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
resutls = list(accumulate(a, max))

另外,如果要迭代组合序列,则需要使用product(), permutations(), combinations()。

结论

  • 在大多数情况下,您都不需要编写 for 循环。

  • 你应该避免编写 for 循环,这样会有更好的代码可读性。

推荐阅读:
入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|
从零到一:桌面宠物的硬件架构设计与工程实践 本文详细介绍了基于STM32F103C8T6主控平台的桌面宠物机器人硬件架构设计与工程实践。内容涵盖电源管理、舵机控制、PCB布局及系统调试等核心环节,为硬件爱好者提供从零到一的完整开发指南,助力打造稳定可靠的智能桌面伴侣。 阅读详情

相关推荐

如何让 RTX 5090 开启 PCIE P2P 以加速多卡通信

RTX 5090 基于新的 Blackwell 架构。NVIDIA 出于对某些主板兼容性(如 IOMMU、Resizable BAR 策略)的保守考虑,**屏蔽了 5090 的 BAR1 P2P 功能**。 我们需要通过 Patch 驱动源码,强制开启这一隐藏功能。 开启 P2P 后,PyTorch 的集合通信算子(Multi-GPU 训练的核心)延迟显著降低,**All-Reduce 甚至降低了 60% 以上**。

Hi20240217的博客 1734

不再写Python for 循环

为什么要挑战自己在代码里不写 for loop?因为这样可以迫使你去学习使用比较高级、比较地道的语法或 library。文中以 python 为例子,讲了不少大家其实在别人的代码里都见过、但自己很少用的语法。自从我开始探索 Python 中惊人的语言功能已经有一段时间了。一开始,我给自己一个挑战,目的是让我练习更多的 Python 语言功能,而不是使用其他编程语言的编程经...

公众号:Python研究者 492

开源PACS系统Orthanc(DICOM服务器)配置

PACS(Picture Archiving and Communication System)是医学影像的数字化存储、检索和传输系统,用于管理和存储医学图像和相关信息,如放射学、核医学、超声、病理学等各种医学影像。PACS系统通过数字化技术取代了传统的胶片方式,使医疗机构能够更高效地存储、传输和查看医学图像,从而提高了医疗图像的管理和工作流程。

qq_42231043的博客 6250

chatgpt赋能python:Python中如何停止for循环:常见技巧和技术

本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。

vacvefito的博客 1818

C/C++关于VScode报错“终端将被任务重用,按任意键关闭”的解决方案

这其实不是一种报错,有这个提示的原因是本地端口是被共享的,所以必须关闭一个进程才能执行另一个,只需要对 tasks.json文件做一些修改即可。 报错时候 此时的tasks.json为: { "version": "2.0.0", "command": "g++", "args": ["-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}.exe"], // 编译命令参数 "problemMatche

Jerry Man的博客 6425

【密码学】生成8位26个字母和数字的全排列(密码字典,密钥)c++代码(非递归高效直接)

生成8位26个字母和数字的全排列(密钥)代码(非递归高效直接) 用C语言或C++,生成一个8位的26个字母和数字的全排列的原代码,例如从:00000000到ZZZZZZZZ。 说明:生成的这个字典会非常大,有36^8条记录,估计要3T的硬盘,跑一个晚上看看         这个方法比递归更高效,更直接。                                                ...

Wu_Being 的优快云 博客 1万+

【Python】减少不必要的 for 循环

python之减少不必要的 for 循环

Llmzw的博客 1196

从查表法到实时计算:SimpleFOC库中正弦函数优化的技术演进

本文深入探讨了SimpleFOC库v2.0.1版本中正弦函数优化技术的演进,从传统查表法到实时计算的创新实践。通过定点数优化、对称性利用和分段线性插值等关键技术,实现了在嵌入式电机控制中的高效三角函数计算,显著提升性能和资源利用率。

weixin_28273593的博客 452

Python中替代for循环的几种方法

Python中替代for循环的几种方法 1.for循环 之前博客有发过for循环的本质,但不究其本质,for循环我们可以总结为是对序列进行遍历操作,生成另一个序列的过程。 for i in iterable: do something 可以说写for循环结构已经成为当我们面对相关问题时的习惯,这也是在代码中十分常见的结构,但理性地去思考,for循环相比于扁平结构是否还有一些不足? 1.更多的代码行数 2.较差的代码可读性 3.运行性能较差 2.可以替代for循环的方法 (1)列表生成器 def f(x

endlessfc的博客 8707

智能车‘大脑’的诞生:揭秘电磁循迹代码背后的控制论与系统思维

本文深入探讨智能车电磁循迹系统的核心架构与控制原理,揭示了其作为精密闭环系统如何通过模块化设计、信号处理、PID控制算法及电机驱动实现自主导航。重点分析了电磁信号采集与处理流程框架,为开发者提供从理论到实践的全面指南。

arduino9maker的博客 531

利用Matlab高效处理Comsol仿真数据的可视化技巧

本文详细介绍了如何将Comsol仿真数据高效导入Matlab并进行专业可视化与后处理。核心内容包括正确的数据导出格式设置、三维矩阵重构方法、二维截面与三维体渲染技巧,以及基于Matlab的定量分析与批处理自动化流程,帮助工程师和科研人员深度挖掘仿真数据价值,提升工作效率。

weixin_29065791的博客 362

3种方案 | 抛弃for循环,让Python代码更pythonic !

为什么要挑战自己在代码里不写 for loop?因为这样可以迫使你去学习使用比较高级、比较地道的语法或 library。文中以 python 为例子,讲了不少大家其实在别人的代码里都见过、但自己很少用的语法。自从我开始探索 Python 中惊人的语言功能已经有一段时间了。一开始,我给自己一个挑战,目的是让我练习更多的 Python 语言功能,而不是使用其他编程语言的编程经验。这让事情变得越来越有趣...

Python数据之道 179

2025年GESP3月认证C++五级真题解析

小 A 有 2n 件物品,小 B 和小 C 想从小 A 手上买走这些物品。对于第 i 件物品,小 B 会以 bi 的价格购买,而小 C 会以 ci 的价格购买。对于所有测试点,保证 1 <= T <= 100, 2 <= g < p <= 10^9, g, p 为整数, p 为质数。对于所有测试点,保证 1 <= n <= 10^5, 0 <= bi, ci <= 10^9, bi, ci 为整数。对于另外 50 % 的测试点,保证 n <= 100000, 0 <= bi, ci <= 10^9。

lan_in的博客 1036

三种方案 | 抛弃for循环,让Python代码更pythonic

为什么要挑战自己在代码里不写 for loop?因为这样可以迫使你去学习使用比较高级、比较地道的语法或 library。文中以 python 为例子,讲了不少大家其实在别人的代码里都见过、但自己很少用的语法。

m0_59485658的博客 235

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pip 20.3 新版本发布!即将抛弃 Python 2.x

据 Python 软件基金会消息,Python Packaging Authority 和 pip 团队于北美时间11月30日宣布发布 pip 20.3版本,开发者可以通过运行pytho...

Python中文社区 3035

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

9个技巧使你的Python代码更Pythonic!

"Beautiful is better than ugly." 这不仅是 "The Zen of Python" 的第一句话,也是所有Python开发者的信条。但如何区分漂亮和丑陋的代码?更重要的是,如何写出漂亮的 Python 代码?本文将通过初学者容易理解的例子展示9个神话般的Python技巧,以帮助你在日常工作中编写更多的Pythonic程序。01 product()使用 product(...

cainiao_python的博客 418

IMSL CNL 7.0.0 (x86-64)Crack

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

【开源推荐】抛弃多线程!下一代 Python 异步下载引擎 QSDE 发布 (60FPS 丝滑 UI + 工业级健壮性)

摘要:QSDE (Qustellar Smart Download Engine) 是一款基于 Python asyncio + httpx 的高性能下载引擎,解决了传统多线程方案在并发下载中的性能瓶颈问题。其核心特性包括:纯异步架构实现高并发低延迟;60FPS 无闪烁终端 UI;原子性文件清理和全链路取消等企业级健壮性保障;支持 CLI 和 API 双模式运行,可无缝集成到 GUI 应用。采用 PascalCase 命名规范,提供优雅的开发者体验,适用于爬虫、游戏启动器等场景。现已开源,采用 Apache

EcoSpace博客 1020

for循环的优点_Python编写循环的两个建议 | 鹅厂实战

作者 | piglei(腾讯高级工程师)来源 | 腾讯技术工程知乎专栏循环是一种常用的程序控制结构。我们常说,机器相比人类的最大优点之一,就是机器可以不眠不休的重复做某件事情,但人却不行。而“循环”,则是实现让机器不断重复工作的关键概念。在循环语法方面,Python 表现的即传统又不传统。它虽然抛弃了常见的 for(init;condition;incrment) 三段式结构,但还是选择...

weixin_39637975的博客 416

for循环的优点_Python 工匠:编写地道循环的两个建议

循环是一种常用的程序控制结构。我们常说,机器相比人类的最大优点之一,就是机器可以不眠不休的重复做某件事情,但人却不行。而“循环”,则是实现让机器不断重复工作的关键概念。在循环语法方面,Python 表现的即传统又不传统。它虽然抛弃了常见的 for(init;condition;incrment) 三段式结构,但还是选择了 for 和 while 这两个经典的关键字来表达循环。绝大多数情况...

weixin_39847887的博客 330

dataframe for循环 筛选_Python:编写地道循环的两个建议,轻松应对新需求

循环是一种常用的程序控制结构。我们常说,机器相比人类的最大优点之一,就是机器可以不眠不休的重复做某件事情,但人却不行。而“循环”,则是实现让机器不断重复工作的关键概念。在循环语法方面,Python 表现的即传统又不传统。它虽然抛弃了常见的for(init;condition;incrment) 三段式结构,但还是选择了 for 和 while 这两个经典的关键字来表达循环。绝大多数情况下,我们的循...

weixin_29476545的博客 448

被Python3抛弃的那些函数

Python3字符串默认编码unicode,因此sys.setdefaultencoding就不存在了。Python3将raw_input和input进行整合成了input,去除了raw_input()函数。其接受任意输入, 将所有输入默认为字符串处理,并返回字符串类型。注意:使用reload()函数时需要import你的文件。使用该函数进行utf-8编码。

hakesashou的博客 367

Python编写循环的两个建议 | 鹅厂实战

作者 | piglei(腾讯高级工程师)来源 | 腾讯技术工程知乎专栏循环是一种常用的程序控制结构。我们常说,机器相比人类的最大优点之一,就是机器可以不眠不休的重复做某件...

Python大本营的博客 757
上一篇: 裸辞两年,靠抖音小店做副业全款买房:求求你不要再赚死工资了!
下一篇: 此文24小时内,我必删!!(价值超大)
菜鸟学Python
博客等级 码龄9年 8063粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值