Python 函数详解:从基础语法到高级使用技巧

2025-08-06 21:50

本文主要是介绍Python 函数详解:从基础语法到高级使用技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起...

函数是 python 编程的核心组成部分,它通过封装特定功能实现代码复用,让程序结构更清晰、逻辑更严谨。本文基于实例代码,全面讲解 Python 函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧

一、函数的基本概念与作用

函数本质是封装特定功能的代码块,如同一个 "黑匣子"—— 输入参数后,通过内部逻辑处理,最终输出结果。其核心价值在于:

  • 代码复用:避免重复编写相同逻辑
  • 模块化:将复杂问题拆解为多个独立功能
  • 可维护性:单一功能的修改不影响其他部分
"""
函数作用:
      封装一个特定的功能,相当一个黑匣子
      代码功能复用
语法:
    def  函数名(形参列表):
          函数体
          [return 返回值]
    调用: res=函数名(实参列表)
    没有返回值,不需要接收,如果接收,返回的是None
    return作用:返回结果,跳出函数
"""

二、函数的定义与调用

1. 无参函数

没有参数的函数,直接执行预设逻辑:

# 无参函数
def test():
    print(123456)
# 调用
test()  # 输出:123456

适用于逻辑固定、无需外部输入的场景(如打印固定信息)。

2. 带参函数

需要接收外部参数的函数,灵活性更高。以下是计算aabb累加和的示例:

# 带参函数:计算aNVFdba到bb的总和
def add(aa, bb):
    sum = 0
    for i in range(aa, bb + 1):
        sum += i
    print(sum)
# 调用函数
a = int(input('请输入a:'))  # 从用户输入获取参数
b = int(input('请输入b:'))
add(a, b)  # 实参a、b传递给形参aa、bb
  • 形参:函数定义时的aabb(形式参数,仅在函数内部有效)
  • 实参:函数调用时的ab(实际参数,将值传递给形参)

3. 带返回值的函数

通过return关键字返回处理结果,调用者可接收并进一步处理:

# 计算n的阶乘(n!)
def jiecheng(n):
    cheng = 1
    for i in range(1, n + 1):
        cheng *= i
    return cheng  # 返回计算结果
# 调用并接收返回值
res1 = jiecheng(5)  # 5! = 120
res2 = jiecheng(10) # 10! = 3628800
print(res1, res2)  # 输出:120 3628800
  • return的双重作用:返回结果 + 立即结束函数(其后代码不再执行)
  • 若函数无return,调用后返回None

4. 函数嵌套调用

函数内部可以调用其他函数,实现复杂逻辑的拆解:

# 计算1! + 2! + ... + m!的总和
def add_cheng(m):
    sum = 0
    for i in range(1, m + 1):
        sum += jiecheng(i)  # 嵌套调用阶乘函数
    print(sum)
# 调用
add_cheng(5)  # 1!+2!+3!+4!+5! = 153
add_cheng(10) # 总和为4037913

通过嵌套调用,将 "求阶乘" 和 "求和" 两个功能分离,代码更易理解和维护。

三、参数传递机制:值传递与引用传递

Python 中参数传递的方式取决于数据类型,分为两种:

1. 值传递(基本数据类型)

对于intfloatstr等不可变类型,传递的是值的副本,函数内部修改不影响外部变量:

def test(n):
    n = n + 1  # 内部修改参数
    print(n)  # 输出:11
a = 10
test(a)
print(a)  # 输出:10(外部变量未变)

2. 引用传递(复杂数据类型)

对于listandroiddictset等可变类型,传递的是内存地址,函数内部修改会影响外部变量:

def test2(lst):
    lst[1] = 66  # 内部修改列表元素
    print(lst)  # 输出:[1, 66, 3]
ls = [1, 2, 3]
test2(ls)
print(ls[1])  # 输出:66(外部列表被修改)

总结:不可变类型传递值,可变类型传递地址,这是 Python 参数传递的核心特性。

四、变量作用域:全局变量与局部变量

变量的作用域指其可访问的范围,分为:

1. 局部变量

在函数内部定义的变量,仅在函数内部有效:

def test3():
    a = 10  # 局部变量(仅test3内可访问)
    print(a)  # 输出:10
test3()
# print(a)  # 报错:NameError(外部无法访问)

2. 全局变量

在函数外部定义的变量,可在所有函数中访问(但修改需声明):

b = 11  # 全局变量
m = 18  # 全局变量
def test3():
    b = 20  # 定义同名局部变量(覆盖全局变量)
    global m  # 声明使用全局变量m
    m += 10   # 修改全局变量
    print(a, b, m)  # 输出:10 20 28(a是局部变量,b是局部变量,m是全局变量)
test3()
print(b, m)  # 输出:11 28(全局b未变,全局m已修改
  • 函数内部可直接使用全局变量,但修改全局变量需用global声明
  • 若局部变量与全局变量同名,函数内部优先使用局部变量

五、函数类型标注(Type Hints)

Python 3.5 + 支持类型标注,通过注释指定参数和返回值的类型,增强代码可读性和可维护性:

"""
函数类型标注:
   基本类型: int  float  str bool bytes
   复杂类型:  from typing import List,Tuple,Dict,Set,Union,Iterable,Sequence,Any,Callable
"""
from typing import List, Union, Callable, Iterable, Sequence
# 标注参数类型
def test(a: int, b: float, c: str, d: bool):
    print(a, b, c, d)
test(1, 2.5, 'hello', True)  # 符合类型标注的调用
# 复杂类型标注:List[Union[int, float]]表示列表元素可为int或floatpython
def test2(
    a: List[Union[int, float]],  # 元素为int或float的列表
    tt: Callable,  # 可调用对象(如函数)
    c: Union[int, str],  # 可为int或str
    d: Iterable,  # 可迭代对象(如列表、range)
    e: Sequence  # 序列对象(http://www.chinasem.cn如列表、元组)
):
    tt()  # 调用传入的函数
    print(a, c, d, e)
def active():
    print('函数作为参数')
test2([1, 2.5, 3], active, 2, [], range(10))  # 符合类型标注的调用
# 标注返回值类型
def test3(a: int, b: float) -> Union[int, float]:
    return a + b
print(test3(1, 2.5))  # 输出:3.5(符合返回值类型)

注意:类型标注仅为提示,Python 解释器不会强制检查(需借助第三方工具如mypy验证)。

六、总结

函数是 Python 编程的基础工具,本文讲解的核心知识点包括:

  • 函数的定义与调用:无参、带参、带返回值函数的使用
  • 函数嵌套:通过调用其他函数实现复杂逻辑
  • 参数传递:不可变类型值传递,可变类型引用传递
  • 变量作用域:局部变量与全局变量的访问规则
  • 类型标注:增强代码可读性的现代编程技巧

到此这篇关于Python 函数详解:从基础语法到高级使用技巧的文章就介绍到这了,更多相关Python 函数内容请搜索China编程(www.cppcns.cphpom)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Python 函数详解:从基础语法到高级使用技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155622

相关文章

MySQL中DATE_FORMAT时间函数的使用小结

《MySQL中DATE_FORMAT时间函数的使用小结》本文主要介绍了MySQL中DATE_FORMAT时间函数的使用小结,用于格式化日期/时间字段,可提取年月、统计月份数据、精确到天,对大家的学习或... 目录前言DATE_FORMAT时间函数总结前言mysql可以使用DATE_FORMAT获取日期字段

Go语言使用sync.Mutex实现资源加锁

《Go语言使用sync.Mutex实现资源加锁》数据共享是一把双刃剑,Go语言为我们提供了sync.Mutex,一种最基础也是最常用的加锁方式,用于保证在任意时刻只有一个goroutine能访问共享... 目录一、什么是 Mutex二、为什么需要加锁三、实战案例:并发安全的计数器1. 未加锁示例(存在竞态)

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

Python实现Word转PDF全攻略(从入门到实战)

《Python实现Word转PDF全攻略(从入门到实战)》在数字化办公场景中,Word文档的跨平台兼容性始终是个难题,而PDF格式凭借所见即所得的特性,已成为文档分发和归档的标准格式,下面小编就来和大... 目录一、为什么需要python处理Word转PDF?二、主流转换方案对比三、五套实战方案详解方案1:

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.