【Python】Python 函数基本介绍(详细版)​

Python 函数基本介绍(详细版)​


文章目录

  • Python 函数基本介绍(详细版)​
  • 前言
  • 一、函数的创建​
    • 1.1 函数名的命名规则​
    • 1.2 函数的创建​
    • 1.3 函数的调用​
  • 二、函数的参数​
    • 2.1 形参和实参​
    • 2.2 位置参数​
    • 2.3 关键字参数​
    • 2.4 默认参数​
    • 2.5 不定长参数​
    • 2.6 参数组合使用​
  • 三、函数的返回值​
  • 四、匿名函数​
  • 五、函数的作用域​
  • 六、嵌套函数​
  • 七、闭包​
  • 八、递归函数​
  • 总结


前言

函数是 Python 编程的核心构建块,它将特定功能的代码封装成独立单元,不仅能减少重复代码,还能让程序结构更清晰、易于维护。深入理解函数的各项特性,是编写高质量 Python 代码的基础。​


一、函数的创建​

函数创建的核心是用def关键字定义一个可复用的代码块,其完整结构包含函数名、参数列表、文档字符串、函数体和返回值,每个部分都有明确的作用。​

1.1 函数名的命名规则​

函数名需遵循 Python 标识符命名规范:​

  • 只能包含字母、数字和下划线​
  • 不能以数字开头​
  • 不能使用 Python 关键字(如def、if等)​
  • 建议使用小写字母,多个单词用下划线连接(蛇形命名法),如calculate_average

1.2 函数的创建​

创建函数使用def关键字,基本语法为:​

def 函数名(参数):函数体return 返回值

例如,创建一个计算两数之和的函数:​

def add(a, b):​result = a + b​return result

这里的add是函数名,a和b是参数,函数体是计算两数之和并将结果赋给result,最后通过return返回result。​

1.3 函数的调用​

调用函数只需使用 “函数名 (参数)” 的形式。以上面的add函数为例:​

sum_result = add(3, 5)print(sum_result)  # 输出:8​

当调用add(3, 5)时,函数内部的a被赋值为 3,b被赋值为 5,经过计算后返回 8,然后将 8 赋给sum_result并打印出来。​


二、函数的参数​

函数的参数是函数与外部交互的桥梁,根据传递和定义方式的不同,可分为多种类型。其中,形参和实参是参数的基本概念。​

2.1 形参和实参​

形参(形式参数):在定义函数时,括号中列出的参数称为形参,它们只是函数定义时用来接收外部传入数据的 “占位符”,没有具体的值。

例如在def add(a, b):中,a和b就是形参。​

实参(实际参数):在调用函数时,括号中传入的具体数据称为实参,它们会被赋值给对应的形参。

例如在add(3, 5)中,3和5就是实参,分别赋值给形参a和b。​

形参和实参的关系是:实参是形参的具体值,在函数调用时,实参的值会传递给形参,供函数体使用。​

2.2 位置参数​

位置参数是最常见的参数类型,参数按照位置顺序传递,实参与形参必须一一对应,数量也必须一致。如add(3,5)中,3 传给a,5 传给b。如果参数数量不匹配,会报错,例如add(3)会提示缺少一个位置参数。​

2.3 关键字参数​

调用时指定参数名(形参名),可改变参数顺序,使代码更具可读性。例如:​

sum_result = add(b=5, a=3)print(sum_result)  # 输出:8​

这里明确指定b为 5,a为 3,虽然顺序与函数定义时不同,但仍能正确计算结果。使用关键字参数时,关键字必须是函数定义时的形参名,否则会报错。​

2.4 默认参数​

定义函数时给形参设置默认值,调用时可省略该参数,若不省略则使用传递的实参值。示例:​

def greet(name, greeting="Hello"):print(f"{greeting}, {name}!")​
​
greet("Alice")  # 输出:Hello, Alice!​
greet("Bob", "Hi")  # 输出:Hi, Bob!​

在greet函数中,greeting是设置了默认值 “Hello” 的形参,当调用greet(“Alice”)时,没有传递对应greeting的实参,就使用默认值;调用greet(“Bob”, “Hi”)时,传递了实参 “Hi”,则使用该值。需要注意的是,默认参数必须放在位置参数之后,否则会报错,例如def greet(greeting=“Hello”, name):是错误的。​

2.5 不定长参数​

当不确定需要传递多少个实参时,可以使用不定长参数,它们能接收任意数量的实参。​
*args:接收任意数量的位置实参,以元组形式存储,args是约定俗成的名称,也可以使用其他名称,但建议使用args。​

def sum_numbers(*args):​total = 0for num in args:​total += num​return total​
​
print(sum_numbers(1, 2, 3))  # 输出:6​
print(sum_numbers(4, 5, 6, 7))  # 输出:22​

在sum_numbers函数中,*args接收了传递的所有位置实参,然后通过循环将它们相加。​
**kwargs:接收任意数量的关键字实参,以字典形式存储,其中键是参数名(形参名),值是参数值(实参值),kwargs是约定俗成的名称,也可使用其他名称,建议使用kwargs。​

def print_info(** kwargs):for key, value in kwargs.items():print(f"{key}: {value}")​
​
print_info(name="Alice", age=20, gender="female")# 输出:​
# name: Alice​
# age: 20​
# gender: female​

这里**kwargs接收了name、age、gender三个关键字实参,并以字典的形式遍历输出。​

2.6 参数组合使用​

在定义函数时,多种参数可以组合使用,但需要遵循一定的顺序:位置参数在前,然后是默认参数,接着是*args,最后是**kwargs。例如:​

def func(a, b, c=0, *args, **kwargs):print(f"a={a}, b={b}, c={c}")print("args:", args)print("kwargs:", kwargs)​
​
func(1, 2, 3, 4, 5, name="test", age=10)# 输出:​
# a=1, b=2, c=3​
# args: (4, 5)​
# kwargs: {'name': 'test', 'age': 10}​

三、函数的返回值​

函数的返回值是函数执行完成后给出的结果,通过return语句实现。​
用return返回结果,函数执行到return后停止,后续的代码不会执行。​

def check_number(num):if num > 0:return "正数"print("该数不是正数")​
​
print(check_number(5))  # 输出:正数​
print(check_number(-3))  # 输出:该数不是正数  然后输出None​

当num为 5 时,函数执行到return "正数"就停止,不会执行后面的打印语句;当num为 - 3 时,不满足if条件,会执行打印语句,然后函数默认返回None。​

可返回多个值,以元组形式接收,也可分别接收。​

def get_name_and_age():return "Alice", 20​
​
# 以元组形式接收​
info = get_name_and_age()print(info)  # 输出:('Alice', 20)​# 分别接收​
name, age = get_name_and_age()print(name, age)  # 输出:Alice 20​

四、匿名函数​

用lambda创建,语法:lambda 参数: 表达式,适合实现简单的功能,返回值是表达式的结果。​

add = lambda a, b: a + b​
print(add(3, 5))  # 输出:8​# 结合内置函数使用​
numbers = [(1, 3), (4, 1), (2, 5)]# 按元组中第二个元素排序​
numbers.sort(key=lambda x: x[1])print(numbers)  # 输出:[(4, 1), (1, 3), (2, 5)]​

匿名函数通常与map、filter、sorted等内置函数配合使用,使代码更简洁。​


五、函数的作用域​

函数的作用域指的是变量可被访问的范围,分为局部作用域和全局作用域。​

  • 局部作用域:在函数内部定义的变量,只能在函数内部访问,称为局部变量。​
def func():​local_var = 10print(local_var)​
​
func()  # 输出:10​
print(local_var)  # 报错,local_var未定义​

local_var是在func函数内部定义的局部变量,在函数外部无法访问。​

  • 全局作用域:在函数外部定义的变量,可在函数内部访问(但修改需要用global关键字声明),称为全局变量。​
global_var = 20​
​
def func1():print(global_var)  # 访问全局变量​def func2():global global_var  # 声明修改全局变量​global_var = 30​
​
func1()  # 输出:20​
func2()print(global_var)  # 输出:30​

global_var是全局变量,func1函数内部可以直接访问;func2函数要修改全局变量,需要用global关键字声明,否则会被认为是定义了一个局部变量。​

  • 非局部作用域:在嵌套函数中,内部函数访问外部函数的变量(非全局变量),称为非局部变量,若要修改需用nonlocal关键字声明。​
def outer_func():​outer_var = 100def inner_func():nonlocal outer_var  # 声明修改非局部变量​outer_var = 200print("inner:", outer_var)​inner_func()print("outer:", outer_var)​
​
outer_func()# 输出:​
# inner: 200​
# outer: 200​

outer_var是外部函数outer_func定义的变量,内部函数inner_func要修改它,需用nonlocal关键字声明,修改后外部函数中该变量的值也会改变。


六、嵌套函数​

在一个函数内部定义另一个函数,内部的函数称为嵌套函数。嵌套函数可以访问外部函数的变量(若要修改需用nonlocal关键字)。​

def outer_func(x):def inner_func(y):return x + y​return inner_func​
​
add5 = outer_func(5)print(add5(3))  # 输出:8​

inner_func是outer_func的嵌套函数,它可以访问outer_func的参数x。outer_func(5)返回inner_func函数,然后add5(3)调用该函数,计算 5+3 的结果。​


七、闭包​

闭包是指嵌套函数中,内部函数引用了外部函数的变量,并且外部函数返回了内部函数。闭包可以保留外部函数的变量状态。​

def make_multiplier(factor):def multiplier(number):return number * factor​return multiplier​
​
times3 = make_multiplier(3)​
times5 = make_multiplier(5)​
​
print(times3(10))  # 输出:30​
print(times5(10))  # 输出:50​

在这个例子中,multiplier是内部函数,它引用了外部函数make_multiplier的变量factor,并且make_multiplier返回了multiplier,所以形成了闭包。times3和times5分别保留了factor为 3 和 5 的状态,因此调用时会得到不同的结果。​


八、递归函数​

递归函数是指在函数内部调用自身的函数,常用于解决具有递归性质的问题,即问题可以分解为与原问题相似但规模更小的子问题。使用递归函数需要注意设置终止条件,避免无限递归。​

递归函数的应用场景​

  • 数学问题:如阶乘计算、斐波那契数列、汉诺塔问题等。​
  • 数据结构遍历:如树的深度优先遍历、链表的某些操作等。​
  • 算法实现:如快速排序、归并排序等排序算法的递归实现。​

实例​:计算阶乘​

def factorial(n):if n == 1:  # 终止条件​return 1return n * factorial(n - 1)​
​
print(factorial(5))  # 输出:120,5! = 5*4*3*2*1 = 120​

当n为 1 时,函数返回 1,否则返回n乘以n-1的阶乘,通过不断调用自身来计算结果。​

计算斐波那契数列(第 n 项)​

def fibonacci(n):​if n <= 1:  # 终止条件​return n​return fibonacci(n - 1) + fibonacci(n - 2)​
​
print(fibonacci(6))  # 输出:8,斐波那契数列前几项:0,1,1,2,3,5,8...第6项是8​

总结

函数通过模块化设计降低了代码冗余,其丰富的参数类型与高级特性(如闭包、递归)使其能适应从简单计算到复杂逻辑的多种场景。掌握函数的命名规范、参数传递机制、作用域规则及高级特性的应用,是编写高效、可读、可维护 Python 代码的基础。在实际开发中,需根据具体需求选择合适的函数形式与参数类型,充分发挥函数的封装与复用价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93164.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93164.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端Vue】log-viewer组件的使用技巧

目录 修改行号和组件的样式 修改高亮显示的内容和颜色 **log-viewer组件合集** 【前端Vue】如何优雅地展示带行号的日志文件或文本内容&#xff08;log-viewer组件的使用&#xff09; 【前端Vue】使用log-viewer组件时的踩坑记录 【前端Vue】log-viewer组件的使用技巧 【前…

OpenCV Python——报错AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘,解决办法

Python在使用 bgsubmog cv2.bgsegm.createBackgroundSubtractorMOG() 去除背景&#xff0c;报错AttributeError: module ‘cv2‘ has no attribute ‘bgsegm‘ 报错原因&#xff1a;使用的python环境中没有安装扩展包contrib 可以通过pip或者conda安装 pip install opencv-con…

react + i18n:国际化

注意版本 我这是旧版 react react 16.8.6 i18next 20.6.1 react-i18next 11.18.6文件&#xff1a;zh.json {“hello”: "你好" }文件&#xff1a;en.json {“hello”: "hello" }文件&#xff1a;i18n.tsx import i18n from i18next; import { initRea…

lesson38:MySQL数据库核心操作详解:从基础查询到高级应用

目录 引言 一、条件查询&#xff1a;精准筛选数据 1.1 基本语法 1.2 比较运算符 1.3 逻辑运算符 1.4 特殊条件查询 1.4.1 模糊查询&#xff08;LIKE&#xff09; 1.4.2 IN和NOT IN 1.4.3 BETWEEN AND 1.4.4 IS NULL和IS NOT NULL 二、聚合函数&#xff1a;数据统计与…

【数据分析】调控网络分析:调节因子在肿瘤样本中的表达相关性与生存效应分析

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍 数据准备与模拟 相关性分析与边表生成 网络可视化 结果展示与讨论 加载R包 模拟数据 Spearman 相关 -> 边表 画图 所有代码 总结 系统信息 介绍 在生物医学研究中,N⁶-甲基腺…

Flask中ORM的使用

Flask中ORM的使用 本文介绍Flask中ORM框架flask_sqlalchemy的基本使用&#xff0c;包含模型定义(简单模型&#xff0c;一对一&#xff0c;一对多&#xff0c;多对多等)&#xff0c;由于实际开发中很少使用物理外键&#xff0c;所有本文所有模型都不使用物理外键&#xff0c;而关…

FPGA即插即用Verilog驱动系列——高速12位ADC

实现功能&#xff1a;单通道ADC驱动&#xff0c;速率由驱动的时钟决定12位数据并行&#xff0c;可轻松修改为其他位宽&#xff0c;适应不同的ADC模块将ADC输入的unsigned数据转换为signed&#xff0c;便于后续FIR&#xff0c;MULTI操作匹配AXI4-STREAM协议&#xff0c;有tvalid…

DeepSeek 部署中的常见问题及解决方案:从环境配置到性能优化的全流程指南

一、引言随着大模型技术的发展&#xff0c;以 DeepSeek 为代表的开源中文大模型&#xff0c;逐渐成为企业与开发者探索私有化部署、垂直微调、模型服务化的重要选择。然而&#xff0c;模型部署的过程并非 “一键启动” 那么简单。从环境依赖、资源限制&#xff0c;到推理性能和…

【机器人-开发工具】ROS 2 (4)Jetson Nano 系统Ubuntu22.04安装ROS 2 Humble版本

文章目录1. 系统环境准备1.1. Jetpack简介1.2. 下载Jetpack安装系统2. 安装ROS2 Humble2.1. ROS2 简介2.2. ROS2 Humble对比Foxy版本2.3. 安装2.3.1. 更新系统2.3.2. 添加 ROS 2 GPG 密钥2.3.3. 添加 ROS 2 仓库源2.3.4. 更新软件包索引2.3.5. 安装 ROS 2 Humble 桌面版&#x…

2025年Java大厂面试场景题全解析:高频考点与实战攻略

一、2025年Java面试新趋势与技术栈变化2025年的Java技术生态呈现出明显的云原生与AI集成趋势&#xff0c;各大互联网公司在面试中更加注重候选人对新技术栈的掌握程度和实战应用能力。1.1 技术栈升级趋势分析根据最新统计数据&#xff0c;2025年Java面试的技术考察点分布如下&a…

TCP客户端Linux网络编程设计详解

一、TCP 客户端设计流程TCP客户端模式的程序设计流程主要分为&#xff1a;套接字初始化( socket()函数)&#xff0c;连接目标网络服务器 (connect()函数)&#xff0c;向服务器端写入数据&#xff08;write()函数&#xff09;1、socket() 函数#include <sys/types.h> …

webpack》》

Webpark 介绍 官网 Webpack的功能 在现代前端开发中,我们会使用模块化、Sass、TypeScript、图片、字体等资源。但浏览器并不天然支持这些格式,因此我们需要工具将它们打包、转换成浏览器能识别的文件格式。Webpack 就是这样一个强大的前端构建工具。 Webpack 是一个现代 J…

软件测评中HTTP 安全头的配置与测试规范

服务器若缺乏必要的安全头配置&#xff0c;其安全防护能力将大幅降低。X-Content-Type-Options 作为基础安全头&#xff0c;需设置 nosniff 参数&#xff0c;以阻止浏览器对 MIME 类型进行自主猜测&#xff0c;避免 text/css 等资源被误当作脚本执行&#xff0c;从源头切断此类…

5G专网项目外场常见业务测试指南(六)-PingInfoView

5G项目必然涉及到终端用户的使用&#xff0c;终端使用情况测试最常用的手段就是长时间7*24小时长ping&#xff0c;对于一个有着几百用户的5G专网&#xff0c;我们常用的ping工具-PingInfoView。 PingInfoView是一款轻量级工具&#xff0c;用于同时对多个IP地址或主机名执行持续…

C#WPF实战出真汁02--搭建项目三层架构

1、什么是三层架构 三层架构是一种软件设计模式&#xff0c;将应用程序划分为表示层&#xff08;UI&#xff09;、业务逻辑层&#xff08;BLL&#xff09;和数据访问层&#xff08;DAL&#xff09;&#xff0c;以实现高内聚、低耦合的开发目标。 三层架构的核心组成‌ ‌表示层…

什么是费曼学习法?

什么是费曼学习法&#xff1f;一、费曼学习法的核心逻辑 费曼学习法&#xff08;Feynman Technique&#xff09;由诺贝尔物理学奖得主理查德费曼提出&#xff0c;核心思想是通过“以教促学”的方式&#xff0c;用输出倒逼输入&#xff0c;彻底理解知识。其本质是&#xff1a;当…

CVPR 2025 | 北大团队SLAM3R:单目RGB长视频实时重建,精度效率双杀!

北京大学陈宝权团队联合香港大学等推出的实时三维重建系统SLAM3R&#xff0c;首次实现从单目RGB长视频中实时且高质量重建场景稠密点云。该系统通过前馈神经网络无缝集成局部3D重建与全局坐标配准&#xff0c;提供端到端解决方案&#xff0c;使用消费级显卡&#xff08;如4090D…

现代化水库运行管理矩阵建设的要点

2023年8月24日&#xff0c;水利部发布的水利部关于加快构建现代化水库运行管理矩阵的指导意见中指出&#xff0c;在全面推进水库工程标准化管理的基础上&#xff0c;强化数字赋能&#xff0c;加快构建以推进全覆盖、全要素、全天候、全周期“四全”管理&#xff0c;完善体制、机…

【工具】用于视频遮盖行人及车牌的工具,基于YOLO

最近录制数据时&#xff0c;为了保护隐私&#xff0c;我做了一个小工具&#xff1a;video-privacy-blur 在采集街景、测试视频时&#xff0c;经常会拍到人脸和车牌&#xff0c;这些信息在分享或存储前必须做匿名化处理。手动后期太耗时&#xff0c;于是我基于 Ultralytics YOLO…

EtherCAT概念介绍

一、EtherCAT 简介​EtherCAT&#xff08;Ethernet Control Automation Technology&#xff09;是一种工业以太网现场总线&#xff0c;它将计算机网络中的以太网技术应用于工业自动化领域&#xff0c;构成工业控制以太网&#xff08;工业以太网、工业以太网现场总线&#xff09…