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

相关文章

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

在Android中使用WebView在线查看PDF文件的方法示例

《在Android中使用WebView在线查看PDF文件的方法示例》在Android应用开发中,有时我们需要在客户端展示PDF文件,以便用户可以阅读或交互,:本文主要介绍在Android中使用We... 目录简介:1. WebView组件介绍2. 在androidManifest.XML中添加Interne

Java中字符编码问题的解决方法详解

《Java中字符编码问题的解决方法详解》在日常Java开发中,字符编码问题是一个非常常见却又特别容易踩坑的地方,这篇文章就带你一步一步看清楚字符编码的来龙去脉,并结合可运行的代码,看看如何在Java项... 目录前言背景:为什么会出现编码问题常见场景分析控制台输出乱码文件读写乱码数据库存取乱码解决方案统一使

Java Stream流与使用操作指南

《JavaStream流与使用操作指南》Stream不是数据结构,而是一种高级的数据处理工具,允许你以声明式的方式处理数据集合,类似于SQL语句操作数据库,本文给大家介绍JavaStream流与使用... 目录一、什么是stream流二、创建stream流1.单列集合创建stream流2.双列集合创建str

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践