Python函数魔术:深入理解18个高级函数特性
今天,我们将一起探索那些让代码瞬间变得优雅而强大的高级函数。准备好,让我们一起揭开它们的神秘面纱吧!
1. map():一招制胜,批量操作
想象一下,你需要给一个数字列表的每个元素加上5。普通的循环是不是让你觉得有点乏味?map()函数来救援!
numbers = [1, 2, 3]
def add_five(x):return x + 5# 使用map函数
result = map(add_five, numbers)
print(list(result)) # 输出:[6, 7, 8]
魔法揭秘:map()接受一个函数和一个(或多个) iterable,对iterable中的每个元素应用该函数,返回一个迭代器。
2. filter():慧眼识珠,筛选高手
有了filter(),你可以轻松地从一堆数据中挑出符合条件的宝藏。
# 筛选出偶数
numbers = [1, 2, 3, 4, 5]
def is_even(n):return n % 2 == 0filtered_numbers = filter(is_even, numbers)
print(list(filtered_numbers)) # 输出:[2, 4]
魔法揭秘:它接受一个函数和一个 iterable,仅保留使函数返回True的元素。
3. reduce():聚沙成塔,累积计算
这个函数在Python标准库的functools里,它能将一个列表的所有元素通过一个函数累积起来,比如求和。
from functools import reducenumbers = [1, 2, 3, 4]
# 求和
sum_it = reduce(lambda x, y: x + y, numbers)
print(sum_it) # 输出:10
魔法揭秘:reduce()使用一个二元操作符(这里是一个匿名函数lambda),连续作用于序列的元素,最终得到一个结果。
4. 列表推导式:一行代码,千行功效
列表推导式是Python的效率神器,简洁到让人惊叹!
squares = [x**2 for x in range(1, 6)] # 生成1到5的平方数
print(squares) # 输出:[1, 4, 9, 16, 25]
魔法揭秘:它将循环和条件判断压缩成一行,快速创建新列表。
5. 字典推导式:字典速造,清晰无比
字典推导式同样强大,用于快速构建字典。
words = ['apple', 'banana', 'cherry']
word_lengths = {word: len(word) for word in words}
print(word_lengths) # 输出:{'apple': 5, 'banana': 6, 'cherry': 6}
魔法揭秘:基于旧的iterable,快速创建新的字典键值对。
6. 高阶函数:函数也可以当参数
Python允许函数作为参数传递给另一个函数,这开启了无限可能。
def apply(func, x):return func(x)print(apply(lambda x: x*2, 5)) # 输出:10
魔法揭秘:高阶函数提高了代码的灵活性,让抽象层次更上一层楼。
7. zip():并驾齐驱,打包专家
当你想同时遍历两个(或多个)列表时,zip()就是你的最佳拍档。
names = ['Alice', 'Bob', 'Charlie']
ages = [24, 30, 18]
pairs = zip(names, ages)
for name, age in pairs:print(f"{name} is {age} years old.")
魔法揭秘:它接收多个 iterable,并将对应位置的元素组合成一个元组,返回一个迭代器。
8. enumerate():索引与值,一网打尽
遍历的同时获取元素的索引?非enumerate莫属。
fruits = ['apple', 'banana', 'mango']
for index, fruit in enumerate(fruits):print(f"#{index}: {fruit}")
魔法揭秘:它将可迭代对象转换为枚举对象,每次迭代返回当前的索引和值。
9. set()与集合操作:去重高手,交并差集简便🛠
快速去除重复元素,或者进行集合运算,set是不二之选。
a = [1, 2, 3, 4]
b = [3, 4, 5, 6]
unique_a = set(a)
union_set = set(a).union(set(b))
print(unique_a, union_set) # 输出:{1, 2, 3, 4} {1, 2, 3, 4, 5, 6}
魔法揭秘:集合支持并集(union)、交集(intersection)、差集等操作,适用于去重和集合逻辑处理。
10. any()与all():逻辑判断,一目了然
检查列表中是否存在至少一个True值?或者所有都是True?它们俩是你的得力助手。
numbers = [0, 1, 2]
print(any(numbers > 0)) # 输出:True
print(all(numbers > 0)) # 输出:False
魔法揭秘:any()只要有一个元素满足条件就返回True,all()需要所有元素都满足条件才返回True。
11. 装饰器:不动声色,功能增强
装饰器让你可以在不修改原函数代码的情况下,给函数添加新功能。
def my_decorator(func):def wrapper():print("Something is happening before the function is called.")func()print("Something is happening after the function is called.")return wrapper@my_decorator
def say_hello():print("Hello!")say_hello()
魔法揭秘:装饰器本质上是一个函数,它接收一个函数作为参数,并返回一个新的函数。
12. 生成器:按需生产,内存友好
生成器是一种特殊的迭代器,使用yield关键字,懒加载数据,超级节省内存。
def count_up_to(n):count = 1while count <= n:yield countcount += 1for num in count_up_to(5):print(num)
魔法揭秘:每当迭代时,生成器的代码只执行到下一个yield语句,暂停并返回值,下次迭代时继续执行。
13. 上下文管理器:资源管理,自动善后
用with语句管理资源,如文件打开关闭,自动化的异常处理,干净又安全。
with open('example.txt', 'r') as file:content = file.read()print(content)
魔法揭秘:上下文管理器定义了__enter__和__exit__方法,自动处理进入和退出代码块时的操作。
14. 断言:代码自检,错误早发现
在代码中放置断言,帮助你在开发阶段发现逻辑错误。
def divide(a, b):assert b != 0, "除数不能为0"return a / bprint(divide(10, 2))
# 尝试除以0会抛出异常
# print(divide(10, 0))
魔法揭秘:assert用于测试某个条件是否为真,如果条件为假,则引发AssertionError异常。
15. 解包操作:一键分配,简单高效
解包操作能将序列或集合的元素分配给对应的变量,反之亦然。
a, b, c = (1, 2, 3) # 序列解包
print(a, b, c) # 输出:1 2 3nums = [4, 5, 6]
*x, = nums # 星号解包,收集剩余元素
print(x) # 输出:[4, 5, 6]
魔法揭秘:解包操作简化了变量赋值和函数参数传递,使代码更加直观。
进阶与高级
16. itertools模块:迭代器的乐园
itertools是Python的标准库之一,提供了很多高效处理迭代器的工具。
组合生成:product与combinations
-
product:生成笛卡尔积。from itertools import productletters = ['a', 'b'] numbers = [1, 2] print(list(product(letters, numbers))) # 输出:[('a', 1), ('a', 2), ('b', 1), ('b', 2)] -
combinations:生成不重复的组合。print(list(combinations(letters, 2))) # 输出:[('a', 'b')]
无限迭代:count, cycle
-
count:从指定起始值开始无限递增。for i in itertools.count(10):print(i) # 打印从10开始的无限序列,实际使用时应有限制条件 -
cycle:无限重复序列。for i in itertools.cycle('AB'):print(i) # 无限循环打印'A', 'B'
17. contextlib:上下文管理的扩展
contextlib提供了更灵活的方式来创建和使用上下文管理器。
自定义资源管理
from contextlib import contextmanager@contextmanager
def managed_file(name):try:f = open(name, 'r')yield ffinally:f.close()with managed_file('example.txt') as f:for line in f:print(line)
闭包上下文:contextmanager装饰器
上面的例子展示了如何使用装饰器来简化上下文管理器的编写,这对于临时性管理资源非常有用。
18. 软件设计模式:工厂与策略模式
Python的高级函数特性非常适合实现设计模式,例如:
工厂模式的简单实现
def factory(shape='circle'):shape_dict = {'circle': lambda: "I am a circle",'square': lambda: "I am a square"}return shape_dict.get(shape, lambda: "Shape not found")()print(factory('circle')) # 输出:I am a circle
策略模式:动态选择算法
def sort_strategy(sort_type):strategies = {'bubble': lambda data: sorted(data),'quick': lambda data: sorted(data, key=lambda x: x) # 简化示例,实际应实现快速排序}return strategies.get(sort_type, lambda data: "Invalid sort type")(data)data = [3, 1, 4, 1, 5]
print(sort_strategy('bubble')) # 输出:[1, 1, 3, 4, 5]
结语
Python的魔法远远不止于此,每一次深入探索都能发现新的惊喜。通过这些高级特性和设计模式的应用,你的代码将变得更加优雅、高效。
相关文章:
Python函数魔术:深入理解18个高级函数特性
今天,我们将一起探索那些让代码瞬间变得优雅而强大的高级函数。准备好,让我们一起揭开它们的神秘面纱吧! 1. map():一招制胜,批量操作 想象一下,你需要给一个数字列表的每个元素加上5。普通的循环是不是让…...
在大型单页应用(SPA)中,如何处理状态管理的
在大型单页应用(SPA)中,如何处理状态管理的 在大型单页应用(SPA)中,状态管理是一个关键环节,确保数据的一致性和可预测的变更。以下是一些常见的状态管理方法: Redux: …...
力扣78 子集
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的 子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[],[1],[2],[1,2],[3],…...
C语言从头学24——函数原型
前面学习函数时已经知道必须先存在一个函数然后才能使用,且这个函数的位置还要在 main()函数之前,否则的话编译时会报错。但我们写程序时,main() 函数是程序入口,程序的主要部分都在 main() 函数中,且其它函数也都要通…...
Vue中使用ElementUI组件Form组件的校验validate
先准备一些el-form元素 这里面el-form中:model(v-bind:model)是单项绑定的,如果你写成了v-model""可能会出现校验没有效果的情况。 这是校验过后的结果了 现在开始使用下吧! 1.在el-form中绑定一个ref,名字自拟,后续触发检验结果…...
PostgreSQL性能优化之分区表 #PG培训
在处理大规模数据时,PostgreSQL的性能优化是一个非常重要的话题,其中分区表(Partitioned Tables)是提高查询和数据管理效率的重要手段。本文将详细介绍PostgreSQL分区表的概念、优势、创建与管理方法以及一些常见的优化策略。 #P…...
SAPUI5基础知识9 - JSON Module与数据绑定
1. 背景 在前面的博客中,我们已经学习了SAPUI5中视图和控制器的使用,在本篇博客中,让我们学习下MVC架构中的M-模型了。 SAPUI5中的JSON Model是一个客户端模型,可以用于在SAPUI5应用程序中处理和操作JSON数据。SAPUI5提供了绑定…...
解决vue3使用ref 获取不到子组件属性问题
需求: 父子组件使用<script setup>语法糖,父组件通过给子组件定义ref访问子组件内部属性或事件。 关键点: 子组件中,setup语法糖需要用defineExpose把要读取的属性和方法单独暴露出去,否则会访问失败…...
使用STL容器还是Qt容器?
在C编程中,选择合适的容器库对于编写高效、可维护的代码至关重要。两大主流选择是STL容器(如std::map,std::vector等)和Qt容器(如QMap,QVector等)。本文将探讨两者的优缺点,以帮助开…...
Android 2ndBLE的实现
没有需求创造需求 有没有想过一件事情,假如你的手机关机了,而且在家里怎么都找不到的情况? 那么通过另外一种手机进行查找是不是可以?听上去有点搞笑,但实际上确实有这样的需求存在。实现方案是用超低功耗蓝牙&#…...
常见硬件工程师面试题(二)
大家好,我是山羊君Goat。 对于硬件工程师,学习的东西主要和电路硬件相关,所以在硬件工程师的面试中,对于经验是十分看重的,像PCB设计,电路设计原理,模拟电路,数字电路等等相关的知识…...
java构造方法的重载
在java中,与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,但是要求每个构造方法的参数类型或参数不同。在创建对象时,可以通过调用不同的构造方法为不同属性赋值。 示例代码如下 class Student5…...
webpack 压缩图片
压缩前: 压缩后: 压缩后基本上是压缩了70-80%左右 1.依赖版本及配置 "imagemin-webpack-plugin": "^2.4.2", "imagemin-mozjpeg": "^7.0.0", "imagemin-pngquant": "^5.0.1", "webpa…...
JAVA每日作业day6.24
ok了家人们今天学习了一些关键字,用法和注意事项,静态代码块这些知识,闲话少叙我们一起看看吧。 一,final关键字 1.1 final关键字的概述 final: 不可改变。可以用于修饰类、方法和变量。 类:被修饰的类&a…...
鸿蒙开发系统基础能力:【@ohos.hiTraceChain (分布式跟踪)】
分布式跟踪 本模块提供了端侧业务流程调用链跟踪的打点能力,包括业务流程跟踪的启动、结束、信息埋点等能力。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import hi…...
.git目录解读
在执行 git init 命令时,Git 会在当前目录中创建一个名为 .git 的目录。该目录包含 Git 所需的所有元数据和对象,用于版本控制。以下是 .git 目录结构的示意图,并附有每个目录和文件的作用说明: .git #…...
如何在Java中处理InterruptedException异常?
如何在Java中处理InterruptedException异常? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,多线程是一个常见的应用场景…...
深入解读Netty中的NIO:原理、架构与实现详解
深入解读Netty中的NIO:原理、架构与实现详解 Netty是一个基于Java的异步事件驱动网络应用框架,广泛用于构建高性能、高可扩展性的网络服务器和客户端(学习netty请参考:深入浅出Netty:高性能网络应用框架的原理与实践&…...
Vim和Nano简介
**Vim**: - Vim 是一个文本编辑器,它是 Vi 编辑器的一个改进版本,Vi 编辑器最初由 Bill Joy 在1976年为 BSD Unix 开发。 - Vim 由 Bram Moolenaar 开发,其第一个版本在1991年发布。Vim 的设计理念是“持继改进”,它的…...
mysql的information_schema浅析
information_schema 是 MySQL 中的一个虚拟数据库,它包含了关于 MySQL 服务器的所有元数据。 information_schema 作用 元数据管理:提供关于数据库、表、列、索引、权限等的信息。 性能优化:帮助了解数据库结构和索引使用情况,便…...
图像比对与像素级分析:用diffimg实现高效差异检测
图像比对与像素级分析:用diffimg实现高效差异检测 【免费下载链接】diffimg Differentiate images in python - get a ratio or percentage difference, and generate a diff image 项目地址: https://gitcode.com/gh_mirrors/di/diffimg 在视觉内容创作与技…...
无GPU方案:星图平台OpenClaw镜像+百川2-13B-4bits的云端沙盒体验
无GPU方案:星图平台OpenClaw镜像百川2-13B-4bits的云端沙盒体验 1. 为什么选择云端沙盒方案 作为一个长期折腾本地AI部署的技术爱好者,我最近遇到了一个典型困境:想体验最新的OpenClaw智能体框架,但手头的MacBook Pro只有集成显…...
手把手教你用逻辑分析仪抓取DVC1124的I2C波形(附CRC校验分析)
手把手教你用逻辑分析仪抓取DVC1124的I2C波形(附CRC校验分析) 在嵌入式硬件调试中,I2C通信的波形分析是验证设备交互正确性的关键步骤。集澈DVC1124作为一款高性能AFE芯片,其I2C协议中独特的CRC校验机制为通信可靠性提供了保障。本…...
Apollo自动驾驶系统C++核心模块实战解析——从源码到实现
1. Apollo自动驾驶系统架构全景解析 第一次打开Apollo源码仓库时,我完全被它庞大的代码量震撼到了——超过200万行C代码构成的自动驾驶系统,就像一座精密的机械钟表。但当你拆解它的核心模块后,会发现其架构设计处处体现着模块化和高内聚低耦…...
如何快速完成亚马逊SP-API注册:AWS IAM策略与角色配置详解
亚马逊SP-API高效注册指南:从AWS IAM配置到应用上线的全流程解析 当你的电商业务需要与亚马逊平台深度集成时,SP-API(Selling Partner API)将成为不可或缺的工具。作为亚马逊新一代的开发者接口,它比传统的MWS提供了更…...
tao-8k在AI应用开发中的价值:为LangChain+LlamaIndex提供高质量向量底座
tao-8k在AI应用开发中的价值:为LangChainLlamaIndex提供高质量向量底座 1. 为什么需要高质量的文本嵌入模型 在构建AI应用时,我们经常需要将文本转换为计算机能够理解的数值表示,这就是文本嵌入(embedding)的核心任务…...
评一个典型的“数学可视化 + 计算机图形学入门”的优秀案例(C++精灵库3D案例)
这份代码和视频展示了一个非常典型的“数学可视化 计算机图形学入门”的优秀案例。它不仅仅是一段能运行的代码,更是一个将抽象数学公式转化为直观视觉艺术的教学演示。 以下是对该程序及视频的多维度评论: 1. 技术实现与图形学原理 这段代码虽然简短…...
nlp_structbert_sentence-similarity_chinese-large赋能微信小程序:实现文本查重功能
nlp_structbert_sentence-similarity_chinese-large赋能微信小程序:实现文本查重功能 最近和一位做在线教育的朋友聊天,他提到一个挺头疼的问题:批改学生作文时,经常发现不同学生提交的作业内容高度相似,甚至有大段雷…...
媒体服务器功能解锁:打造专业级家庭媒体中心的完整方案
媒体服务器功能解锁:打造专业级家庭媒体中心的完整方案 【免费下载链接】emby-unlocked Emby with the premium Emby Premiere features unlocked. 项目地址: https://gitcode.com/gh_mirrors/em/emby-unlocked 在数字化娱乐时代,一个功能完善的媒…...
Scarab:重新定义空洞骑士模组管理体验
Scarab:重新定义空洞骑士模组管理体验 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 在独立游戏模组管理领域,手动复制文件、解决版本冲突和跟踪更新的…...
