Python笔记(二)

70 阅读3分钟

函数式编程

函数式编程是一种编程范式,它将计算视为函数的组合。Python 支持函数式编程,通过使用 lambda 表达式和高阶函数,我们可以更方便地编写函数式代码。例如,可以使用 map 函数将一个函数应用到一个迭代器的每个元素上:

nums = [1, 2, 3, 4, 5]
squared_nums = map(lambda x: x**2, nums)
print(list(squared_nums))  # [1, 4, 9, 16, 25]

生成器

生成器是一种特殊的迭代器,它可以按需生成值,而不是一次性生成所有值。这使得生成器在处理大量数据时非常有用,因为它们可以避免将整个数据集加载到内存中。我们可以使用 yield 关键字来定义生成器:

def squares():
    n = 1
    while True:
        yield n**2
        n += 1

s = squares()
print(next(s))  # 1
print(next(s))  # 4
print(next(s))  # 9

装饰器

装饰器是一种可以在不改变原函数代码的情况下扩展其功能的机制。我们可以使用装饰器来添加日志记录、授权、缓存等功能。例如,下面是一个简单的装饰器,用于计算函数的运行时间:

import time

def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} took {end_time - start_time} seconds to run.")
        return result
    return wrapper

@timing_decorator
def my_function():
    time.sleep(1)

my_function()  # Function my_function took 1.0004172325134277 seconds to run.

上下文管理器

上下文管理器是一种处理资源的机制,它能够确保在使用资源后正确释放它们。我们可以使用 with 语句来创建上下文管理器。例如,下面是一个上下文管理器,用于打开和关闭文件:

class FileManager:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_value, traceback):
        self.file.close()

with FileManager('test.txt', 'w') as f:
    f.write('Hello, World!')

异步编程

异步编程是一种高效的编程范式,可以使程序在等待 IO 操作时不阻塞,从而提高程序的吞吐量和响应速度。Python 通过 asyncio 库提供了强大的异步编程支持。例如,下面是一个使用 asyncio 编写的简单 web 服务器:

import asyncio

async def handle_request(reader, writer):
    request = (await reader.read(1024)).decode()
    response = 'Hello, World!'
    writer.write(response.encode())
    await writer.drain()
    writer.close()

async def main():
    server = await asyncio.start_server(handle_request, 'localhost', 8000)
    async with server:
        await server.serve_forever()

asyncio.run(main())

并发编程 Python

支持多种并发编程模型,包括多线程、多进程和协程。这些模型可以用来提高程序的并发性和性能。例如,下面是一个使用 multiprocessing 库实现的并行计算程序:

from multiprocessing import Pool

def calculate_square(n):
    return n**2

if __name__ == '__main__':
    with Pool() as pool:
        results = pool.map(calculate_square, range(10))
        print(results)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

内存管理

Python 使用自动垃圾回收机制来管理内存,这使得内存管理变得非常方便。然而,如果不小心编写代码,可能会导致内存泄漏和性能问题。我们可以使用 gc 模块来手动控制垃圾回收机制的行为,例如:

import gc

# 禁用垃圾回收
gc.disable()

# 手动触发垃圾回收
gc.collect()

# 查看对象的引用计数
x = []
print(gc.get_referrers(x))

元编程

Python 支持元编程,即在程序运行时创建和操作程序本身的代码。元编程可以使代码更加灵活、动态和可扩展。Python 提供了许多元编程工具,如装饰器、元类、动态属性和函数、反射等。例如,下面是一个使用装饰器实现缓存功能的示例:

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(50))  # 输出 12586269025,在缓存中执行了 99 次,递归调用了 99 次

Pythonic编程风格

Pythonic 是一种 Python 特有的编程风格,它强调简洁、可读、明确和优美的代码。Pythonic 代码应该符合 Python 的哲学和惯例,例如使用列表推导式、生成器、上下文管理器、with 语句、*args 和 **kwargs 等。Pythonic 代码可以使代码更加易于理解、维护和扩展。例如,下面是一个使用列表推导式实现的字符串列表去重的代码:

lst = ['a', 'b', 'c', 'a', 'd', 'c']
unique_lst = list(set(lst))
print(unique_lst)  # ['a', 'b', 'c', 'd']