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的标准库之一,提供了很多高效处理迭代器的工具。

组合生成:productcombinations

  • 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的魔法远远不止于此,每一次深入探索都能发现新的惊喜。通过这些高级特性和设计模式的应用,你的代码将变得更加优雅、高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/859922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyTorch单点知识】神经元网络模型剪枝prune模块介绍(下,结构化剪枝)

文章目录 0. 前言1. torch.nn.utils.prune中的结构化剪枝方法2. PyTorch实例2.1 random_structured2.2 prune.ln_structured 3. 总结 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但…

NC--介绍-未加密加密后-流量抓包对比

免责声明:本节仅做技术交流与学习... 目录 介绍: 用法: 未加密--流量抓包 加密: 攻击端 靶机 抓包分析: 介绍: nc 是一个Linux环境下常用的工具命令&#xff0c;可以用来帮助开发者查询和解决网路问题&#xff0c;通常被认为是 NetCat 工具的缩写&#xff0c;在网络工具…

Hi3861 OpenHarmony嵌入式应用入门--轮询按键

本篇介绍使用轮询方式读取gpio状态来判断按键状态。 原理图如下 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpi…

MySQL理解-下载-安装

MySQL理解: mysql:是一种关系型数据库管理系统。 下载&#xff1a; 进入官网MySQLhttps://www.mysql.com/ 找到download 滑动到最下方&#xff1a;有一个开源社区版的链接地址&#xff1a; 然后就下载完成了 安装&#xff1a; 双击&#xff1a; 一直next 一直next这一步&…

仓颉编程语言入门

华为在 2024 年 6 月 21 日的华为开发者大会上&#xff0c;华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言&#xff0c;并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。 仓颉编程语言文件后缀名为 .cj, 以下是第一个入门代码输出&#xff1a;你好&#xff0c;仓颉…

ESP32-S3方案应用设备无线交互技术,产品远程控制与语音交互

在物联网和人工智能(AI)技术融合的浪潮中&#xff0c;ESP32-S3芯片以其卓越的性能和多功能性&#xff0c;成为智能家居和工业自动化领域的明星产品。 ESP32-S3是一款基于Xtensa LX6处理器的嵌入式系统级芯片&#xff0c;具有高效、低功耗的特点。集成的Wi-Fi和蓝牙功能&#x…

浔川python代码编辑器——浔川总社部

众所周知, tkinter的Text文本框功能强大, Python自带的IDLE编辑器也是用tkinter编写的。这里作者也用tkinter的Text文本框等控件, 设计功能较齐全的文本编辑器程序。 目标功能: 编辑文本文件 编辑二进制文件 (字符会以转义序列形式显示, 如’abc\xff’) 支持ansi、gbk、utf-8…

《昇思25天学习打卡营第01天|基本介绍》

基本情况 MindSpore昇思是一个全场景深度学习框架 设计目标 MindSpore的设计目标是让深度学习开发更加简单、高效和安全 优点 简单性&#xff1a;MindSpore 有一个直观的API设计&#xff0c;使得新手也能快速上手&#xff0c;同时还支持自动微分。高效性&#xff1a;它针对…

golang中的内存缓存如何避免被GC扫描,BigCache实现原理

GC到底清理的是什么&#xff1f; Golang是函数式编程语言&#xff0c;如果是函数内定义的临时变量&#xff0c;在函数退出时会被自动清理掉不需要GC参与&#xff1b;如果使用了指针&#xff0c;那么即使函数退出了也不会将其清理&#xff0c;这个时候就需要全局的GC来清扫。 …

三大交易所全面恢复 IPO 申请

6月21日晚间&#xff0c;北交所受理了3家企业的IPO申请&#xff0c;这是北交所时隔3个月之后恢复IPO受理。6月20日晚间&#xff0c;沪深交易所各受理了1家IPO申请&#xff0c;这是沪深交易所时隔半年后再次受理IPO。这也意味着&#xff0c;三大交易所IPO受理全部恢复。 6月21日…

致敬企业家精神:比亚迪仰望发布“旷野宣言”

近年来&#xff0c;随着汽车在中国的普及&#xff0c;钟爱越野和探险的车主群体也在飞速发展壮大。 那么问题就来了&#xff1a;为什么会有这么多的人们钟爱越野和探险&#xff1f;越野精神究竟是什么&#xff1f; 作为备受关注的硬派越野车&#xff0c;比亚迪旗下的高端品牌仰…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 08:剩下的就是态度问题

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

C++基础编程100题-013 OpenJudge-1.3-11 计算浮点数相除的余数

更多资源请关注纽扣编程微信公众号 http://noi.openjudge.cn/ch0103/11/ 描述 计算两个双精度浮点数a和b的相除的余数&#xff0c;a和b都是正数的。这里余数&#xff08;r&#xff09;的定义是&#xff1a;a k * b r&#xff0c;其中 k是整数&#xff0c; 0 < r < b。…

Spring Boot 快速入门4 ——JSR-303 数据校验

目录 一、前言 二、JSR303 简介 三、使用方法 常用注解 Validated、Valid区别 四、编写测试代码&#xff1a; 1. 实体类添加校验 2. 统一返回类型 3. 测试类 4.我们把异常返回给页面 5.抽离全局异常处理 2. 书写ExceptionControllerAdvice 一、前言 我们在日常开发…

物联网设备管理系统设计

一、引言 物联网设备管理系统设计旨在通过物联网技术实现对设备的全面监控、控制和管理&#xff0c;以提高设备的运行效率、降低运维成本&#xff0c;并确保数据的安全性和完整性。本设计将结合当前物联网技术的发展趋势和实际应用需求&#xff0c;提出一个清晰、可扩展的物联网…

鸿蒙开发系统基础能力:【@ohos.hiTraceChain (分布式跟踪)】

分布式跟踪 本模块提供了端侧业务流程调用链跟踪的打点能力&#xff0c;包括业务流程跟踪的启动、结束、信息埋点等能力。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import hi…

小鹏MONA M03实车曝光

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 小鹏汽车 MONA 系列首款车型已经官宣命名为“M03”&#xff0c;预计将于今年第三季度上市。 现在&#xff0c;这款新车的实车照片已经在网上流传开来。 此次曝光的是一款米色车漆版本&#xff0c;与当…

Twinkle Tray:屏幕亮度控制更智能

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Twinkle Tray2、核心特点 二、下载安装1、下载2、安装 三、使用方法 很高兴你打开…

cookie和seesion的区别

cookie cookie介绍 Cookie是一种在Web浏览器和Web服务器之间传递的小文件&#xff0c;用于存储用户的一些状态信息&#xff0c;如登录信息、用户偏好等。当用户访问一个网站时&#xff0c;网站会将一个包含Cookie信息的HTTP响应头发送给浏览器&#xff0c;浏览器将这些Cookie…

【linux kernel】一文总结linux输入子系统

文章目录 一、导读二、重要数据数据结构&#xff08;2-1&#xff09;struct input_dev&#xff08;2-2&#xff09;input_dev_list和input_handler_list&#xff08;2-3&#xff09;struct input_handler 三、input核心的初始化四、常用API五、输入设备驱动开发总结(1)查看输入…