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 = name
        self.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 = 10
    b = 0
    c = 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模块。

你可能感兴趣的:(谈谈python,python,windows,开发语言)