首页 > 编程语言 >python中函数式编程与高阶函数,装饰器与生成器,异常处理与日志记录以及项目实战

python中函数式编程与高阶函数,装饰器与生成器,异常处理与日志记录以及项目实战

时间:2024-09-21 12:23:43浏览次数:11  
标签:logging 函数 python 生成器 print 日志 def

函数式编程是 Python 强大且灵活的编程范式之一,与此同时,Python 也为开发者提供了高阶函数、装饰器、生成器等工具,极大提高了代码的可读性和复用性。此外,异常处理与日志记录是编写可靠、可维护的 Python 代码的重要组成部分。最后,通过一个项目实战来整合这些概念。

我们将从以下几个方向展开:

  1. 函数式编程与高阶函数
  2. 装饰器与生成器
  3. 异常处理与日志记录
  4. 项目实战:文件批量处理工具

一、函数式编程与高阶函数

1.1 函数式编程概念

函数式编程是一种编程范式,强调函数的不可变性和无副作用。Python 作为多范式编程语言,提供了函数式编程的支持。函数式编程中的核心概念包括:

  • 纯函数:函数的输出仅依赖输入,不依赖外部状态,且不会改变外部状态。
  • 不可变性:数据一旦创建便不可修改。
  • 高阶函数:可以接受函数作为参数或返回函数。

1.2 常见的高阶函数

map()

map() 函数将一个函数应用于一个可迭代对象中的每个元素,返回一个迭代器。

# 例子:将列表中的每个元素平方
numbers = [1, 2, 3, 4]
squares = list(map(lambda x: x**2, numbers))
print(squares)  # 输出: [1, 4, 9, 16]
filter()

filter() 函数用于过滤可迭代对象中符合条件的元素。

# 例子:过滤出列表中的偶数
numbers = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(evens)  # 输出: [2, 4, 6]
reduce()

reduce() 来自 functools 模块,作用是将可迭代对象中的元素累计计算出一个值。

from functools import reduce

# 例子:累积相乘列表中的元素
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 输出: 24

1.3 函数作为参数与返回值

Python 中函数是一等公民,可以作为参数传递,或作为返回值。

# 函数作为参数
def apply_function(func, value):
    return func(value)

print(apply_function(lambda x: x + 2, 10))  # 输出: 12

# 函数作为返回值
def outer_function():
    def inner_function():
        return "Hello from inner function!"
    return inner_function

hello_func = outer_function()
print(hello_func())  # 输出: Hello from inner function!

二、装饰器与生成器

2.1 装饰器

装饰器是一种函数,它用于在不改变原函数代码的情况下,扩展或修改函数的功能。装饰器通常用于函数的前后执行某些操作,比如记录日志、计时等。

装饰器基本用法
# 基本的装饰器函数
def my_decorator(func):
    def wrapper():
        print("在函数调用前")
        func()
        print("在函数调用后")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()
# 输出:
# 在函数调用前
# Hello!
# 在函数调用后
带参数的装饰器

装饰器也可以装饰带参数的函数:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("在函数调用前")
        result = func(*args, **kwargs)
        print("在函数调用后")
        return result
    return wrapper

@my_decorator
def greet(name):
    print(f"Hello, {name}!")

greet("Alice")
# 输出:
# 在函数调用前
# Hello, Alice!
# 在函数调用后

2.2 生成器

生成器 是一种特殊的迭代器,通过 yield 关键字逐步生成值,生成器不会一次性将所有值计算出来,而是按需生成,节省内存。

生成器函数
def my_generator():
    for i in range(3):
        yield i

gen = my_generator()
print(next(gen))  # 输出: 0
print(next(gen))  # 输出: 1
print(next(gen))  # 输出: 2
生成器表达式

与列表推导式类似,生成器表达式使用小括号代替方括号:

gen = (x**2 for x in range(3))
for val in gen:
    print(val)
# 输出:
# 0
# 1
# 4

三、异常处理与日志记录

3.1 异常处理

异常处理是编写健壮代码的重要手段。通过 tryexceptfinally 语句捕获异常并处理,防止程序崩溃。

异常处理基本语法
try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"发生错误: {e}")
finally:
    print("无论是否有异常,我都会执行")
自定义异常

可以通过继承 Exception 类创建自定义异常:

class CustomError(Exception):
    pass

def raise_error():
    raise CustomError("自定义异常发生了!")

try:
    raise_error()
except CustomError as e:
    print(e)

3.2 日志记录

使用 logging 模块记录程序执行的关键信息。

基本的日志记录
import logging

logging.basicConfig(level=logging.INFO)

def divide(a, b):
    try:
        result = a / b
        logging.info(f"成功计算: {a} / {b} = {result}")
        return result
    except ZeroDivisionError:
        logging.error("除数不能为零!")

divide(10, 2)  # 输出日志: 成功计算: 10 / 2 = 5.0
divide(10, 0)  # 输出日志: 除数不能为零!
日志文件记录
logging.basicConfig(filename='app.log', level=logging.INFO)

logging.info("程序启动")

四、项目实战:文件批量处理工具

项目简介

需求:开发一个工具来批量处理多个文件。假设我们有大量文本文件,内容是多个数字,我们需要统计每个文件的平均值,并将结果写入日志文件中。

项目设计思路

  1. 读取文件:从目录中读取所有文本文件。
  2. 处理文件内容:解析每个文件中的数字,计算平均值。
  3. 记录日志:将每个文件的处理结果记录到日志中。

项目代码实现

1. 读取文件列表
import os

def get_files_from_directory(directory):
    return [f for f in os.listdir(directory) if f.endswith('.txt')]
2. 处理文件内容
def process_file(filepath):
    with open(filepath, 'r') as file:
        numbers = [int(line.strip()) for line in file.readlines()]
        return sum(numbers) / len(numbers) if numbers else 0
3. 日志记录与异常处理
import logging

logging.basicConfig(filename='file_processing.log', level=logging.INFO)

def log_result(filename, result):
    logging.info(f"文件 {filename} 的平均值为: {result}")
4. 整合代码
def main():
    directory = './files'
    files = get_files_from_directory(directory)

    for file in files:
        try:
            filepath = os.path.join(directory, file)
            result = process_file(filepath)
            log_result(file, result)
        except Exception as e:
            logging.error(f"处理文件 {file} 时发生错误: {e}")

if __name__ == "__main__":
    main()

运行结果

  1. 所有文件的平均值会记录到 file_processing.log 文件中。
  2. 如果有任何文件处理失败,日志中会有详细的错误信息。

总结

通过这个项目,我们整合了 Python 的函数式编程、高阶函数、装饰器、生成器,以及异常处理与日志记录的概念。这个工具展示了如何结合这些强大的特性来编写简洁、优雅且高效的代码。

Python 提供了极大的灵活性和可扩

展性,通过充分利用这些工具和技术,可以轻松应对各种复杂的任务。你可以根据项目需求,进一步扩展这个工具,例如添加并行处理文件的功能,或者通过命令行参数动态配置输入输出目录。

标签:logging,函数,python,生成器,print,日志,def
From: https://blog.csdn.net/weixin_47260194/article/details/142414737

相关文章

  • callable内置函数
    callable()是Python内置的一个函数,用于检查一个对象是否可以被调用,也就是判断该对象是否是一个可调用对象。可调用对象包括函数、方法和实现了call方法的类实例。例如:defmy_function():passclassMyClass:def__call__(self):passprint(callable(m......
  • 计算机毕设设计推荐-基于python+Djanog大数据的电影数据可视化分析
    精彩专栏推荐订阅:在下方主页......
  • 如何使用 Python 的 sqlite3 模块操作 SQLite 数据库?
    如何使用Python的sqlite3模块操作SQLite数据库?SQLite是一种轻量级的数据库,它不需要服务器,数据库被存储在一个文件中,非常适合嵌入式系统或桌面应用程序。Python标准库中包含了一个名为sqlite3的模块,可以直接用于与SQLite数据库进行交互。本文将详细介绍如何使用......
  • Python 从入门到实战24(类的继承)
            我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。上篇文章我们讨论了类的定义、使用方法、@property的相关知识。今天我们将学习一下类的继承。1、继承的基本语法......
  • Python 中的 strip() 和 split() 方法详解
    目录一、strip()方法1.什么是strip()?2.基本语法3.基本用法示例1)去除空白字符2)移除指定字符4.lstrip()和rstrip()5.注意事项二、split()方法1.什么是split()?2.基本语法3.基本用法示例1)按空格分割字符串2)指定分隔符3)限制分割次数4.rsplit()方法......
  • Python安装
    目录对于Linux和BSD用户对于Windows用户Python安装-CSDN博客Python操作符-CSDN博客Python基础学习-CSDN博客对于Linux和BSD用户如果你正在使用一个Linux的发行版比如Fedora或者Mandrake或者其他(你的选择),或者一个BSD系统比如FreeBSD,那么你可能已经在你的......
  • Python 基础学习
    目录字面意义上的常量数字符串单引号双引号三引号转义序列自然字符串字符串是不可变的字符串按字面意义连接变量标识符的命名数据类型对象Python安装-CSDN博客字面意义上的常量一个字面意义上的常量的例子是如同5、1.23、9.25e-3这样的数,或者如同’Thi......
  • Python 操作符
    你写的许多语句(逻辑行)会包含表达式。表达式的最简单的例子是2+3。表达式可以被分解成操作符和操作数。运算符的功能是完成某件事,它们由如+这样的符号或者其他特定的关键字表示。运算符需要数据来进行运算,这样的数据被称为操作数。在这个例子中,2和3是操作数。目录......
  • Python命令
    #在Python中,您可以使用pip命令行工具来查看已安装的库#piplist#清理缓存#pipcachepurge#查看pippython版本#pip--version#卸载#pipuninstallpackage_name#pip更国内源***********************************************************************************......
  • Python函数基础
    1-函数的概念总结:函数是组织好的、可重复使用的、用来实现特定功能的代码段使用函数的好处:将功能封装在函数内,可供随时随地重复使用提高代码的复用性,减少重复代码,提高开发效率2-函数的定义总结:函数的定义语法def函数名(传入参数):函数体return返......