10个必学的Python编程小技巧

10个必学的Python编程小技巧

    • 一、列表推导式(List Comprehension)
    • 二、生成器表达式(Generator Expression)
    • 三、使用enumerate()遍历列表
    • 四、使用zip()同时遍历两个列表
    • 五、使用setattr()和getattr()动态操作对象属性
    • 六、使用with语句管理资源
    • 七、使用try-except处理异常
    • 八、使用lambda创建匿名函数
    • 九、使用map()和filter()函数式编程
    • 十、使用装饰器(Decorator)修改函数行为

在Python编程中,有许多实用的小技巧可以让代码更简洁、高效。以下是10个必学的Python编程小技巧。

一、列表推导式(List Comprehension)

1、解释说明

列表推导式(List Comprehension)是Python中一种简洁、高效的创建列表的方法。它可以用一行代码生成一个新的列表,而不需要使用循环和条件语句。

2、使用示例

列表推导式的基本语法如下:

[expression for item in iterable if condition]

其中,expression 是对 item 进行操作的表达式,item 是从 iterable 中取出的元素,condition 是一个可选的过滤条件。

下面给出一个使用列表推导式的例子,将一个整数列表中的每个元素都平方:

numbers = [1, 2, 3, 4, 5]
squared_numbers = [x**2 for x in numbers]
print(squared_numbers)  # 输出:[1, 4, 9, 16, 25]

3、注意事项

  • 列表推导式可以嵌套使用,例如:[x**2 for x in numbers if x % 2 == 0];

  • 列表推导式中的 if 语句是可选的,如果不提供条件,那么会处理 iterable 中的所有元素;

  • 列表推导式的效率通常比使用循环高,因为它是在C语言级别实现的,但在某些情况下,使用循环可能更直观或更容易理解。

二、生成器表达式(Generator Expression)

1、解释说明

生成器表达式(Generator Expression)是Python中一种特殊的表达式,它类似于列表推导式(List Comprehension),但是生成的是一个生成器对象。生成器表达式使用圆括号()包裹,而不是方括号[]。生成器表达式在执行时不会一次性生成所有元素,而是根据需要逐个生成,这样可以节省内存空间。

2、使用示例

以下是一个简单的生成器表达式示例:

# 生成一个包含1到10的平方的生成器对象
squares = (x**2 for x in range(1, 11))# 遍历生成器对象并打印元素
for square in squares:print(square)

3、注意事项

  • 生成器表达式只能遍历一次,遍历完后生成器就会耗尽,再次遍历会抛出StopIteration异常。
  • 生成器表达式不能像列表一样通过索引访问元素,只能通过遍历获取元素。
  • 生成器表达式可以与其他迭代器和函数式编程工具(如map、filter等)结合使用,实现更复杂的功能。

三、使用enumerate()遍历列表

1、解释说明
enumerate()函数是Python的内置函数,用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。

2、使用示例

fruits = ['苹果', '香蕉', '橙子']
for index, value in enumerate(fruits):print(index, value)

输出结果:

0 苹果
1 香蕉
2 橙子

3、注意事项

  • enumerate()函数的基本语法是:enumerate(sequence, start=0),返回一个枚举对象。
  • sequence:一个序列、迭代器或其他支持迭代对象。
  • start:下标起始位置。
  • enumerate()函数在遍历时,会返回两个值,一个是当前元素的索引,另一个是当前元素的值。

四、使用zip()同时遍历两个列表

1、解释说明

在Python中,zip()函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用*操作符,可以将元组解压为列表。

2、使用示例

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']# 使用zip()同时遍历两个列表
for item1, item2 in zip(list1, list2):print(item1, item2)

输出结果:

1 a
2 b
3 c

3、注意事项

  • zip()函数返回的是一个迭代器,如果需要将其转换为列表,可以使用list()函数进行转换。
  • 如果两个列表的长度不一致,zip()函数会以较短的列表为准进行遍历。

五、使用setattr()和getattr()动态操作对象属性

1、解释说明

setattr()getattr() 是 Python 中的两个内置函数,用于动态操作对象的属性。

setattr() 函数用于设置对象的属性值。它接受三个参数:对象、属性名和属性值。如果属性不存在,它会创建一个新属性并设置其值。

getattr() 函数用于获取对象的属性值。它接受两个参数:对象和属性名。如果属性存在,它会返回属性的值;如果属性不存在,它可以返回一个默认值或者抛出一个异常。

2、使用示例

class Person:def __init__(self, name, age):self.name = nameself.age = age# 创建一个 Person 对象
p = Person("张三", 30)# 使用 setattr() 设置属性值
setattr(p, "name", "李四")
setattr(p, "age", 25)# 使用 getattr() 获取属性值
name = getattr(p, "name")
age = getattr(p, "age")print(name)  # 输出:李四
print(age)   # 输出:25

3、注意事项

  • setattr()getattr() 函数可以动态地操作对象的属性,但在使用时需要注意属性名的字符串形式,不要混淆 ._
  • 当使用 getattr() 获取不存在的属性时,可以设置一个默认值作为第三个参数,这样在属性不存在时会返回默认值而不是抛出异常。例如:getattr(p, "gender", "男")

六、使用with语句管理资源

1、解释说明

在Python中,with语句是一种上下文管理协议,用于简化资源管理,如文件打开和关闭、线程锁等。通过使用with语句,可以确保在代码块执行完毕后,自动释放资源,无需手动调用清理函数。这样可以提高代码的可读性和可维护性。

2、使用示例

假设我们有一个文件操作的场景,需要打开一个文件进行读写操作,最后关闭文件。如果不使用with语句,我们需要手动调用open()read()write()close()方法,如下所示:

file = open("example.txt", "r")
content = file.read()
print(content)
file.write("Hello, World!")
file.close()

使用with语句,我们可以将文件操作放在一个代码块中,如下所示:

with open("example.txt", "r") as file:content = file.read()print(content)file.write("Hello, World!")
# 在这里,文件已经自动关闭,无需再调用file.close()

3、注意事项

  • with语句适用于实现了上下文管理协议的资源,如文件对象、线程锁等。如果需要自定义资源管理,可以实现__enter__()__exit__()方法。
  • 在使用with语句时,不需要显式地调用清理函数(如close()),因为with语句会在代码块执行完毕后自动调用这些函数。
  • 如果with语句中的代码块抛出异常,__exit__()方法仍然会被调用,以确保资源得到正确释放。因此,在__exit__()方法中,可以使用try...except语句来处理异常。

七、使用try-except处理异常

1、解释说明

在Python中,异常处理是一种常见的错误处理机制。当程序运行过程中遇到错误时,可以使用try-except语句来捕获并处理这些错误,以避免程序崩溃。try-except语句的基本结构如下:

try:# 尝试执行的代码块
except ExceptionType:# 当发生指定类型的异常时执行的代码块

其中,ExceptionType是要捕获的异常类型。如果不指定异常类型,将捕获所有异常。

2、使用示例

下面是一个简单的示例,演示了如何使用try-except语句处理除数为零的异常:

try:a = 10b = 0c = a / b
except ZeroDivisionError:print("除数不能为零")

在这个示例中,我们尝试将一个数除以零,这将引发一个ZeroDivisionError异常。由于我们使用了try-except语句,程序不会崩溃,而是执行except子句中的代码,打印出"除数不能为零"。

3、注意事项

  • try-except语句只能捕获指定的异常类型。如果要捕获多种异常类型,可以使用多个except子句,或者使用一个通用的except子句捕获所有异常。
  • 在except子句中,可以执行一些清理操作,例如关闭文件、释放资源等。这样即使在异常发生时,程序也能正确地关闭和释放资源。
  • 为了避免无限循环,可以在finally子句中添加一些无论是否发生异常都需要执行的代码。

八、使用lambda创建匿名函数

1、解释说明

在Python中,lambda函数是一种创建匿名函数的方法。匿名函数是指没有名字的函数,它们通常用于简单的操作,例如对列表进行排序或过滤。lambda函数的语法如下:

lambda 参数列表: 表达式

这里的参数列表是可选的,可以包含一个或多个参数。表达式是一个单一的表达式,它将作为函数的返回值。

2、使用示例

下面是一个简单的lambda函数示例,它接受两个参数并返回它们的和:

add = lambda x, y: x + y
result = add(3, 5)
print(result)  # 输出:8

在这个示例中,我们定义了一个名为add的lambda函数,它接受两个参数xy,并返回它们的和。然后我们调用这个函数并将结果存储在变量result中,最后打印出结果。

3、注意事项

  • lambda函数只能包含一个表达式,不能包含复杂的逻辑。如果需要更复杂的逻辑,建议使用普通的函数定义。
  • lambda函数的参数列表和表达式之间不需要使用括号,但为了提高代码的可读性,建议在参数列表后添加冒号。
  • lambda函数的返回值可以是任何表达式的结果,包括数字、字符串、列表等。

九、使用map()和filter()函数式编程

1、解释说明

map()filter() 是 Python 中的两个内置函数,它们都是函数式编程的一部分。这两个函数的主要目的是对可迭代对象(如列表、元组等)进行操作,而不需要使用循环。

  • map() 函数:它接受一个函数和一个可迭代对象作为参数,然后将该函数应用于可迭代对象的每个元素,并返回一个新的可迭代对象,其中包含应用函数后的结果。
  • filter() 函数:它也接受一个函数和一个可迭代对象作为参数,然后根据函数的返回值(True 或 False)来决定是否保留可迭代对象中的元素。最后,它返回一个新的可迭代对象,其中包含满足条件的元素。

2、使用示例

# 使用 map() 函数将列表中的每个元素乘以 2
numbers = [1, 2, 3, 4, 5]
doubled_numbers = list(map(lambda x: x * 2, numbers))
print(doubled_numbers)  # 输出:[2, 4, 6, 8, 10]# 使用 filter() 函数筛选出列表中的偶数
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 输出:[2, 4]

3、注意事项

  • map()filter() 函数返回的都是可迭代对象,因此需要使用 list() 或其他方法将其转换为列表或其他数据结构以进行进一步操作。
  • 在使用 map()filter() 时,需要确保传入的函数可以处理可迭代对象中的所有元素。如果函数不能处理某些元素,可能会导致错误或意外的结果。

十、使用装饰器(Decorator)修改函数行为

1、解释说明

装饰器(Decorator)是Python的一个重要特性,它允许我们在不修改原函数代码的情况下,为函数添加新的功能。装饰器本质上是一个接受函数作为参数的函数,它可以在不改变原函数的基础上,对原函数进行扩展或修改。装饰器的语法是在定义函数时,使用@符号加上装饰器函数名。

2、使用示例

下面是一个简单的装饰器示例:

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()

输出结果:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

在这个示例中,我们定义了一个名为my_decorator的装饰器函数,它接受一个函数作为参数。在my_decorator内部,我们定义了一个名为wrapper的嵌套函数,它会在调用原函数之前和之后执行一些额外的操作。最后,我们使用@my_decorator语法将say_hello函数传递给装饰器,这样当我们调用say_hello()时,实际上是在调用wrapper()函数,从而实现了在不修改原函数代码的情况下为其添加新功能的目的。

3、注意事项

  • 装饰器的顺序很重要,从内到外依次应用。
  • 装饰器可以用于类方法,但需要使用@classmethod修饰符。
  • 装饰器也可以用于静态方法,但需要使用@staticmethod修饰符。
  • 装饰器不能直接处理带参数的函数,如果需要处理带参数的函数,可以使用偏函数(Partial Functions)或者使用functools.partial模块。

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

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

相关文章

数据监控-Prometheus/Grafana

一、数据监控Prometheus 1、什么是Prometheus Prometheus是由SoundCloud开源监控告警解决方案,从2012年开始编写代码,到2015年github上开源以来,吸引不少用户以及公司的使用。Prometheus作为新一代的开源解决方案,很多理念与Google SRE的运维之道不谋而合。 2、Promet…

【大厂AI课学习笔记】1.1.1人工智能导论

这个系列,之前是百度的学习笔记,后来他们网站打不开了,现在换为另一个大厂的。 第一节 人工智能导论 1.1 人工智能导论 1.1.1 人工智能概念的诞生 AI,Artificial Intelligence 1956年,美国达特茅斯会议提出。 定义…

2024/1/28 备战蓝桥杯 1-3

目录 特殊日期 0特殊日期 - 蓝桥云课 (lanqiao.cn) 最大距离 0最大距离 - 蓝桥云课 (lanqiao.cn) 最长递增 0最长递增 - 蓝桥云课 (lanqiao.cn) 缩位求和 0缩位求和 - 蓝桥云课 (lanqiao.cn) ISBN号码 0ISBN号码 - 蓝桥云课 (lanqiao.cn) 串的处理 0串的处理 - 蓝桥…

讯飞大模型定制训练平台尝鲜

文章目录 前言进入平台功能探索余额数据集管理 先训为快讯飞星火3.0Chinese-Aplaca-2-7BLlama2-7BInternLM-7BBloomz-7Bfalcon-7BBloomz-3B 前言 众所周知,国产大模型如千问、书生、易等等都有开源大模型,但是出场时效果就很不错的讯飞星火大模型却迟迟…

OpenHarmony关系型数据库

1 概述 关系型数据库(Relational Database, 以下简称RDB)是一种基于关系模型来管理数据的数据库,是在SQLite基础上提供一套完整的对本地数据库进行管理的机制,为开发者提供无需编写原生SQL语句即可实现数据增、删、改、查等接口,同时开发者也…

通讯录小项目(上)

Start And Stick 通讯录的实现有很多种方式,今天我们将用结构体实现简单的通讯录项目功能。包括通讯录的增、删、查、改等功能。 思路: 此次代码文件分别为: 文件名用途sqlist.h用于函数和结构体的声明sqlist.c用于函数的实现test.c用于通讯…

DevOps系列文章之 Git命令:过滤日志

使用git log命令查找特定提交历史的高级技巧。其中的一些技巧配合格式化日志命令使用有奇效。 按照数量过滤 使用git log命令时最基本的过滤方式就是按照可以显示的日志条数进行过滤。如果你只对最近几次提交感兴趣,这会节省在页面上查看所有提交的麻烦。 git lo…

Vue3在css中使用v-bind绑定js/ts变量,也可以在scss和less中使用方式

主要介绍Vue3中的新增的v-bind()的常用使用方式,主要包括在css,less,scss中的使用,可以参考官方文档查看:Vue3官方文档 特别提醒 如果你想在scss中或者less中使用,可能会报各种乱七八糟的错误,最快最好用的方式就是单…

RBD —— 不同材质破碎

目录 Working with concrete Chipping Details Proxy geometry Constraints Working with glass Chipping Proxy geometry Constraints Resolving issues with glass fracturing Working with wood Clustering Using custom cutters Working with concrete Concr…

【PostgreSQL OpenGauss 】数据库查询表锁,释放表锁

PostgreSQL & OpenGauss 数据库查询表锁,释放表锁 PostgreSQLOpenGauss 在数据库中,表锁是用于控制对表的并发访问的一种机制。不同的数据库系统(如 PostgreSQL 和 OpenGauss)可能具有不同的表锁管理机制。下面分别介绍如何在…

【RT-DETR有效改进】EfficientFormerV2移动设备优化的视觉网络(附对比试验效果图)

前言 大家好,我是Snu77,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持Re…

THM学习笔记——john

John the Ripper是目前最好的哈希破解工具之一。 John基本语法: john [options] [path to file] john:调用John the Ripper程序。 [path to file]:包含你要尝试破解的哈希的文件,如果它们在同一个目录中,你就不需要命名…

理解虚拟内存

虚拟内存管理 分页管理 将用户程序的地址空间分为若干个固定大小的区域,称为“页面”。典型的页面大小为 1KB。相应地,也将内存空间分为若干个物理块,页和块的大小相同。然后通过映射表,把连续的虚拟内存空间,映射到离…

C++: 内联函数

目录 概念: 与宏的对比: 函数膨胀: 内联函数的特性: 概念: 以inline修饰的函数叫做内联函数,编译时C编译器会在调用内联函数的地方展开,没有函数调 用建立栈帧的开销,内联函数…

【笔记】Helm-4 最佳实践-4 依赖

依赖 最佳实践的这部分阐述Chart.yaml中声明的dependencies。 版本 如果有可能的话,使用版本范围而不是某个固定的版本。建议的默认设置是使用补丁级别的版本的匹配: version: ~1.2.3 version: ~1.2.3 这样会匹配1.2.3以及该版本的任何补丁&#xff0…

Feign 体系架构解析

正所谓麻雀虽小五脏俱全,HTTP 调用看着简单,实则下面隐藏的是一套非常复杂的流程。 从上古时代 jspservlet,到后面的 SpringMVC,在 HTTP 请求解析和封装上同样是煞费苦心。 我们在学习中经常会碰到这种 case,有些开源…

阿里云一键部署搭建幻兽帕鲁联机服务器教程

幻兽帕鲁(Palworld)是一款多人在线游戏,为了获得更好的游戏体验,许多玩家会选择自行搭建游戏联机服务器,但是如何部署搭建幻兽帕鲁联机服务器成为一个难题,阿里云提供了一种高效且简便的一键部署方案&#…

qt初入门7:进度条,定时器,时间控件练习

参考课本demo,空闲时间练习一下进度条,定时器,日期相关控件和使用。 1:demo运行结果 2:进度条控件梳理 进度条显示控件实际上是QProgressBar, 显示的进度可以通过代码控制,也可以通过其他控件上获取到的值…

go语言文件操作

打开和关闭文件 os.Open()函数能够打开一个文件,返回一个*File和一个err。对得到的文件实例调用close()方法能够关闭文件。 package mainimport ("fmt""os" )func main() {// 只读方式打开当前目录下的main.go文件file, err : os.Open("…

学习PyQt5

1、布局之后,无法移动对象到指定区域,无法改变对象大小。 原因:因为CtrlA选中了整个窗口,然后布局的时候就相当于整个窗口都按照这种布局,如选了水平布局,按钮一直在中间,无法拖到其它位置。 …