Python进阶(第五章: 高级语法)

172 阅读8分钟

1. 闭包和装饰器

闭包

概念:闭包是一个函数,它能够引用在其外部定义的非全局变量,并且可以将这些变量传递到其他函数中。

示例:下面是一个简单的闭包示例,其中outer_function返回了一个内部函数inner_function,并且inner_function引用了x这个外部变量。

def outer_function(x):
    def inner_function(y):
        return x + y
    return inner_function
​
closure = outer_function(10)
result = closure(5)  # 这里的10来自于外部函数
print(result)  # 输出15

闭包的构成条件

  • 在函数嵌套(函数里面再定义函数)的前提下
  • 内部函数使用了外部函数的变量(还包括外部函数的参数
  • 外部函数返回了内部函数

闭包的使用

应用:闭包常用于创建工厂函数,生成具有特定行为或配置的函数。

商业案例:假设您正在编写一个购物网站,您可以使用闭包来创建不同的运费计算器,每个计算器根据不同的规则计算运费。

def shipping_calculator(rate):
    def calculate_shipping(weight):
        return weight * rate
    return calculate_shipping
​
standard_shipping = shipping_calculator(2.5)  # 创建标准运费计算器
express_shipping = shipping_calculator(5.0)   # 创建快递运费计算器
​
cost1 = standard_shipping(10)  # 计算10磅包裹的标准运费
cost2 = express_shipping(10)   # 计算10磅包裹的快递运费print(f"标准运费:${cost1}")
print(f"快递运费:${cost2}")

修改闭包内使用的外部变量

注意:默认情况下,闭包内不能修改外部变量的值。如果要修改,需要使用nonlocal关键字。

def outer_function():
    x = 10
    def inner_function():
        nonlocal x
        x += 5
        return x
    return inner_function
​
closure = outer_function()
result = closure()
print(result)  # 输出15

2. 装饰器

概念:装饰器是一种Python函数,用于修改其他函数的行为,通常用于增强或包装函数。

示例:以下是一个简单的装饰器示例,它用于记录函数的执行时间。

import time
​
def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 执行时间:{end_time - start_time}秒")
        return result
    return wrapper
​
@timing_decorator
def slow_function():
    time.sleep(2)
​
slow_function()  # 输出 slow_function 执行时间:2.0000040531158447秒

装饰器的使用

应用:装饰器通常用于日志记录、性能分析、授权等方面。

商业案例:假设您正在开发一个Web应用程序,您可以使用装饰器来记录请求处理时间。

from flask import Flask
​
app = Flask(__name__)
​
def timing_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} 执行时间:{end_time - start_time}秒")
        return result
    return wrapper
​
@app.route('/')
@timing_decorator
def hello_world():
    return 'Hello, World!'if __name__ == '__main__':
    app.run()

通用装饰器的使用

概念:通用装饰器是可以应用于任何函数的装饰器,不限于特定函数或参数。

def universal_decorator(func):
    def wrapper(*args, **kwargs):
        # 在调用函数前的处理
        result = func(*args, **kwargs)
        # 在调用函数后的处理
        return result
    return wrapper
​
@universal_decorator
def example_function():
    pass

多个装饰器的使用

应用:您可以同时使用多个装饰器,它们将按照从上到下的顺序应用于函数。

@decorator1
@decorator2
def my_function():
    pass

带有参数的装饰器

概念:装饰器可以接受参数,这使得它们更加灵活。

def parameterized_decorator(parameter):
    def decorator(func):
        def wrapper(*args, **kwargs):
            # 使用参数来定制装饰器的行为
            result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator
​
@parameterized_decorator("参数值")
def example_function():
    pass

类装饰器的使用

应用:您可以创建一个类装饰器,类装饰器需要实现__init____call__方法。

class ClassDecorator:
    def __init__(self, func):
        self.func = func
​
    def __call__(self, *args, **kwargs):
        # 在调用函数前的处理
        result = self.func(*args, **kwargs)
        # 在调用函数后的处理
        return result
​
@ClassDecorator
def example_function():
    pass

这些是Python中闭包和装饰器的关键知识点和用法。闭包允许您创建函数工厂,而装饰器允许您修改函数的行为

3. property属性

3.1 property属性的概念

概念property属性是一种Python中的特性(attribute),它允许您在访问对象的属性时执行自定义的方法,而不是直接访问属性的值。这使得您可以控制属性的访问和赋值行为。

3.2 property属性的使用

示例:以下是一个使用property属性的示例,用于控制一个类中的属性访问和修改。

class Temperature:
    def __init__(self, celsius):
        self._celsius = celsius
​
    @property
    def celsius(self):
        return self._celsius
​
    @celsius.setter
    def celsius(self, value):
        if value < -273.15:
            raise ValueError("温度不能低于绝对零度")
        self._celsius = value
​
    @property
    def fahrenheit(self):
        return self._celsius * 9/5 + 32# 使用property属性
temp = Temperature(25)
print(f"摄氏度:{temp.celsius}")
print(f"华氏度:{temp.fahrenheit}")
temp.celsius = 30  # 修改属性值
print(f"摄氏度:{temp.celsius}")

3.3 property属性的商业案例

商业案例:假设您正在开发一个电子商务平台,需要确保商品的价格不会低于成本价。您可以使用property属性来实现价格属性,以便在访问和修改价格时执行验证和限制。

class Product:
    def __init__(self, name, cost_price, selling_price):
        self.name = name
        self._cost_price = cost_price
        self._selling_price = selling_price
​
    @property
    def cost_price(self):
        return self._cost_price
​
    @cost_price.setter
    def cost_price(self, value):
        if value < 0:
            raise ValueError("成本价不能为负数")
        self._cost_price = value
​
    @property
    def selling_price(self):
        return self._selling_price
​
    @selling_price.setter
    def selling_price(self, value):
        if value < self.cost_price:
            raise ValueError("销售价不能低于成本价")
        self._selling_price = value
​
    @property
    def profit_margin(self):
        return self.selling_price - self.cost_price
​
# 使用property属性
product = Product("商品A", 50, 80)
print(f"成本价:${product.cost_price}")
print(f"销售价:${product.selling_price}")
print(f"利润:${product.profit_margin}")
product.cost_price = 60  # 修改成本价
product.selling_price = 90  # 修改销售价
print(f"成本价:${product.cost_price}")
print(f"销售价:${product.selling_price}")
print(f"利润:${product.profit_margin}")

4. with 语句和上下文管理

4.1 with 语句和上下文管理的概念

概念with语句用于创建一个上下文管理器,允许您在进入和退出上下文时执行特定操作。它通常用于资源管理,如文件处理或数据库连接。

4.2 with 语句和上下文管理的使用

示例:以下是一个使用with语句的示例,用于安全地打开和关闭文件。

# 打开文件的常规方式
file = open("example.txt", "r")
try:
    data = file.read()
finally:
    file.close()
​
# 使用with语句
with open("example.txt", "r") as file:
    data = file.read()

4.3 with 语句和上下文管理的商业案例

商业案例:假设您正在开发一个数据库应用程序,需要确保在每次查询后关闭数据库连接以释放资源。您可以使用with语句来实现上下文管理器,确保在进入和退出上下文时打开和关闭数据库连接。

class DatabaseConnection:
    def __init__(self, db_name):
        self.db_name = db_name
​
    def __enter__(self):
        self.connection = create_database_connection(self.db_name)
        return self.connection
​
    def __exit__(self, exc_type, exc_value, traceback):
        if self.connection:
            self.connection.close()
​
# 使用上下文管理器
with DatabaseConnection("my_database") as db:
    result = db.query("SELECT * FROM customers")
    # 处理查询结果
# 在退出上下文后,数据库连接将自动关闭

5. 生成器

5.1 生成器的概念

概念:生成器是一种特殊类型的迭代器,它允许您按需生成值,而不是一次性生成所有值。这节省了内存并提高了性能。

5.2 生成器的使用

示例:以下是一个简单的生成器示例,用于生成斐波那契数列。

def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
​
# 使用生成器
fib = fibonacci_generator()
for _ in range(10):
    print(next(fib))

5.3 生成器的商业案例

商业案例:假设您正在开发一个日志分析工具,需要处理大型日志文件并逐行分析。使用生成器可以逐行读取日志文件,而不必将整个文件加载到内存中。

def log_reader(log_file):
    with open(log_file, "r") as file:
        for line in file:
            yield line.strip()
​
# 使用生成器逐行读取日志文件
for log_entry in log_reader("app.log"):
    # 分析日志条目

6. 深拷贝和浅拷贝

6.1 深拷贝和浅拷贝的概念

概念:深拷贝和浅拷贝是用于创建对象副本的不同方式。浅拷贝创建一个新对象,但它仅复制原始对象中的元素的引用。深拷贝创建一个新对象,并递归复制原始对象及其所有子对象。

6.2 深拷贝和浅拷贝的使用

示例:以下是一个使用浅拷贝和深拷贝的示例。

import copy
​
# 浅拷贝
original_list = [[1, 2, 3], [4, 5, 6]]
shallow_copy = copy.copy(original_list)
shallow_copy[0][0] = 100  # 修改副本中的元素
print(original_list)  # 输出 [[100, 2, 3], [4, 5, 6]]
​
# 深拷贝
original_list = [[1, 2, 3], [4, 5, 6]]
deep_copy = copy.deepcopy(original_list)
deep_copy[0][0] = 100  # 修改副本中的元素
print(original_list)  # 输出 [[1, 2, 3], [4, 5, 6]]

6.3 深拷贝和浅拷贝的商业案例

商业案例:假设您正在开发一个项目管理应用程序,需要复制项目对象以创建新的项目。项目对象可能包括任务列表,每个任务又包含子任务。在这种情况下,您可以使用深拷贝来创建新的项目,确保每个项目都是独立的。

import copy
​
class Task:
    def __init__(self, name):
        self.name = name
        self.subtasks = []
​
class Project:
    def __init__(self, name):
        self.name = name
        self.tasks = []
​
    def add_task(self, task):
        self.tasks.append(task)
​
    def clone(self):
        return copy.deepcopy(self)
​
# 创建原始项目
original_project = Project("Project A")
task1 = Task("Task 1")
task2 = Task("Task 2")
task1.subtasks.append(Task("Subtask 1"))
original_project.add_task(task1)
original_project.add_task(task2)
​
# 克隆项目
new_project = original_project.clone()
new_project.name = "Project B"# 修改克隆后的项目不会影响原始项目
new_project.tasks[0].subtasks[0].name = "Updated Subtask"
print(original_project.tasks[0].subtasks[0].name)  # 输出 "Subtask 1"

这些知识点包括property属性、with语句和上下文管理、生成器、深拷贝和浅拷贝,是Python编程中非常有用的概念。它们可以帮助您更有效地管理属性、资源、数据生成和对象复制。