百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

30天学会Python编程:6. Python函数编程

off999 2025-09-12 01:26 26 浏览 0 评论

6.1 函数基础

6.1.1 函数定义与调用

函数定义语法

def function_name(parameters):
    """文档字符串(可选)"""
    # 函数体
    return [expression]  # 可选

函数调用原理

6.1.2 函数组成要素

表6-1 函数核心组成要素

要素

说明

示例

函数名

标识函数的名称

calculate_area

参数

函数接收的输入

radius

函数体

执行的代码块

return 3.14 * radius**2

返回值

函数输出的结果

78.5

文档字符串

函数说明文档

"""计算圆面积"""

6.1.3 简单函数示例

def greet(name):
    """返回个性化问候语
    
    Args:
        name (str): 用户名
        
    Returns:
        str: 问候字符串
    """
    return f"Hello, {name.capitalize()}!"

# 调用示例
print(greet("alice"))  # Hello, Alice!

6.2 参数传递

6.2.1 参数类型

四种参数类型

参数组合顺序

def func(positional, keyword=value, *args, **kwargs):
    pass

6.2.2 参数传递示例

# 位置参数
def power(base, exponent):
    return base ** exponent

# 关键字参数
print(power(exponent=3, base=2))  # 8

# 默认参数
def connect(host, port=3306, timeout=10):
    print(f"连接到 {host}:{port}, 超时:{timeout}s")

# 可变位置参数(*args)
def sum_numbers(*numbers):
    return sum(numbers)

# 可变关键字参数(**kwargs)
def build_profile(**info):
    for key, value in info.items():
        print(f"{key}: {value}")

6.2.3 参数解包

# 列表/元组解包为位置参数
args = [3, 4]
print(power(*args))  # 81

# 字典解包为关键字参数
kwargs = {"base": 2, "exponent": 5}
print(power(**kwargs))  # 32

6.3 返回值与作用域

6.3.1 返回值特性

多返回值实现

def analyze_number(n):
    return n**2, n**3, abs(n)

square, cube, absolute = analyze_number(-3)

返回函数

def create_multiplier(factor):
    def multiplier(x):
        return x * factor
    return multiplier

double = create_multiplier(2)
print(double(5))  # 10

6.3.2 变量作用域

LEGB规则

作用域示例

x = "global"

def outer():
    x = "enclosing"
    def inner():
        x = "local"
        print(x)  # local
    inner()
    print(x)  # enclosing

outer()
print(x)  # global

6.4 高阶函数

6.4.1 常用高阶函数

map/filter/reduce

numbers = [1, 2, 3, 4]

# map应用函数到每个元素
squares = list(map(lambda x: x**2, numbers))

# filter过滤元素
evens = list(filter(lambda x: x%2==0, numbers))

# reduce累积计算
from functools import reduce
product = reduce(lambda x,y: x*y, numbers)

6.4.2 函数作为参数

def apply_operation(func, a, b):
    """应用指定操作到两个数"""
    return func(a, b)

result = apply_operation(lambda x,y: x+y, 3, 4)  # 7

6.5 闭包与装饰器

6.5.1 闭包实现

def counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment

c = counter()
print(c(), c(), c())  # 1 2 3

6.5.2 装饰器应用

简单装饰器

def timer(func):
    """测量函数执行时间"""
    import time
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"{func.__name__}执行耗时: {end-start:.4f}s")
        return result
    return wrapper

@timer
def long_running_task(n):
    return sum(i*i for i in range(n))

带参数装饰器

def repeat(times):
    """重复执行函数"""
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(times):
                result = func(*args, **kwargs)
            return result
        return wrapper
    return decorator

@repeat(3)
def say_hello():
    print("Hello!")

6.6 函数式编程工具

6.6.1 functools模块

from functools import partial, lru_cache

# 偏函数
square_root = partial(power, exponent=0.5)
print(square_root(9))  # 3.0

# 缓存装饰器
@lru_cache(maxsize=128)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

6.6.2 生成器函数

def fibonacci_sequence(limit):
    """生成斐波那契数列"""
    a, b = 0, 1
    while a < limit:
        yield a
        a, b = b, a + b

print(list(fibonacci_sequence(100)))
# [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]

6.7 综合应用举例

案例1:数据管道处理

def data_pipeline():
    """数据处理管道示例"""
    # 数据源
    raw_data = ["10", "20", "30", "abc", "40"]
    
    # 处理步骤
    processed = (
        map(str.strip, raw_data),          # 去空格
        filter(str.isdigit, _),           # 过滤数字
        map(int, _),                      # 转整数
        map(lambda x: x*2, _),            # 数值加倍
        list                              # 转为列表
    )
    
    for step in processed:
        print(f"当前步骤: {step.__name__ if hasattr(step, '__name__') else str(step)}")
        data = step(data) if 'data' in locals() else step
        print(f"处理结果: {data}")
    
    return data

print("最终结果:", data_pipeline())

案例2:权限检查装饰器

def permission_required(permission):
    """权限检查装饰器"""
    def decorator(func):
        def wrapper(user, *args, **kwargs):
            if user.get("permissions", 0) & permission != permission:
                raise PermissionError("权限不足")
            return func(user, *args, **kwargs)
        return wrapper
    return decorator

# 权限定义
READ = 0b001
WRITE = 0b010
ADMIN = 0b100

@permission_required(READ | WRITE)
def edit_document(user, document):
    print(f"{user['name']}正在编辑{document}")

# 使用示例
user = {"name": "Alice", "permissions": 0b011}
try:
    edit_document(user, "重要文件")
except PermissionError as e:
    print(e)

6.8 学习路线图

6.9 学习总结

  1. 核心要点
  2. 理解函数定义与调用机制
  3. 掌握各种参数传递方式
  4. 熟练使用装饰器模式
  5. 了解函数式编程思想
  6. 实践建议
  7. 函数保持单一职责原则
  8. 合理使用默认参数提高可用性
  9. 为公共函数添加文档字符串
  10. 使用装饰器分离横切关注点
  11. 进阶方向
  12. 协程与异步函数
  13. 函数签名检查(inspect模块)
  14. 描述符协议实现
  15. 元类编程
  16. 常见陷阱
  17. 可变默认参数问题
  18. 闭包变量捕获时机
  19. 装饰器堆叠顺序
  20. 名称空间污染

持续更新Python编程学习日志与技巧,敬请关注!


#编程# #python# #在头条记录我的2025#


相关推荐

win7家庭版原版(win7家庭版价格)

你的win7旗舰版应该是个盗版软件,在你使用的过程中你可能触碰到了后台升级,升级完以后就变成了家庭版了,在你不知不觉中被改变的,厄这个软件属于盗版的,厄升级完以后没什么大区别,这个旗舰版家庭版在家里面...

win10自动更新失败怎么办(win10自动升级失败)

安装更新失败有许多原因。WindowsUpdate需要能够扫描您的计算机以了解需要哪些更新,并能够下载和安装这些更新。如果某个阶段遇到问题,则可能阻止某个更新安装到计算机中。有关错误或失败的详细信...

截图的几种方法(截图的几种方法有哪些)

 第一种截图方式:按printScreen键。按一下键盘上的printScreen键以后,整个屏幕会被截取下来,截图会默认保存在剪贴板中。第二种截图方式:使用微信截图。进入聊天界面,我们会发...

电脑装了两个系统怎么切换(电脑安装2个系统怎么更换启动)

1.点击运行打开电脑点击左下角的开始菜单栏选项,右击鼠标在序列栏中选择运行打开。2.输入msconfig接着在运行的输入框中输入msconfig点击确定即可打开系统配置。3.点击引导打开系统配置的页面...

linux系统哪个版本好用(最好linux系统版本)

个人比较推荐Debian这个发行版本。DebianGNU/Linux于1993年首次公布,至今已经有近30年历史了。当然其他版本比如openSUSE,Slackware,ArchLinux,Ubu...

win10激活在哪里查看(win10激活时间在哪里看)

在Windows10中,您可以通过以下方法查看激活状态:方法1:使用“设置”应用1.点击屏幕左下角的“开始”按钮,然后点击“设置”(齿轮图标)。2.在设置窗口中,点击“系统”图标。3.在“系统...

官方win10dll文件修复工具(官方win7dll文件修复工具)

当电脑丢失dll文件时,可以采用以下几种方法进行一键修复:从回收站还原:如果是不小心误删了一些计算机文件,导致电脑出现异常的情况时,首先就可以去回收站找回dll文件,如果文件还在,就可以通过还原操作来...

qq所有历史旧版本大全(qq历史版本一览表)

有2种方法。一种是:你是QQ会员。你可以把旧版打开,聊天记录上传。然后打开新的QQ,下载。第2种是:你在硬盘上装了QQ软件,然后你就点卸载(uninst),把原来的卸了。然后按原位置覆盖,装上06版。...

电脑显示器分辨率怎么调(显示分辨率无法调整)

1、以win7为例,首先右键点击桌面,在右键菜单中直接显示了屏幕分辨率的选项,用鼠标点击一下这个选项。2、在分辨率设置选项页面中,有一个分辨率的选项,点击一下这个选项,上面默认显示的数值是你现在的屏幕...

8系统(8系统点检控制包含什么)

WIndows8系统是微软目前最新的操作系统,Moto的图形界面设计,使很多已经习惯于早期windows系统的用户难以接受,Windows8是一个向平板和桌面系统妥协的产物,存在着相当多的利弊。...

电脑软件管家(电脑软件管家在哪里找到)

电脑管家有着最大的安全云库,全新的杀毒引擎,深度清理电脑垃圾,为电脑重回巅峰状态,更有账号宝专版,10倍提升QQ防盗号能力,是很好用的。就自己而言,在电脑上用的是腾讯电脑管家这个第三方系统安全软件,管...

office2010破解(office2010破解密钥)
  • office2010破解(office2010破解密钥)
  • office2010破解(office2010破解密钥)
  • office2010破解(office2010破解密钥)
  • office2010破解(office2010破解密钥)
迅雷种子搜索器(迅雷种子搜索器手机版下载)

    迅雷种子搜索方法:    1.在开始菜单栏或者到文件的安装路径文件夹中找到P2P种子搜索器。&nb...

手机怎么解压文件(苹果手机怎么解压文件)

手机解压文件方法:1、首先,在手机中找到文件管理,打开文件管理。2、打开文件管理之后找到压缩包,然后打开。3、打开安装包之后,选择需要的文件,。4、接下来找到“解压至”,点击“解压至”。5、点击之后,...

虚拟机安装centos7(虚拟机安装centos7图形界面)

安装CentOS7在虚拟机中,您可以按照以下步骤操作:1.下载CentOS7的ISO映像文件。2.打开虚拟机软件(如VMware、VirtualBox等)并创建一个新的虚拟机。3.在虚拟机创...

取消回复欢迎 发表评论: