python核心语法(四)- 函数

python核心语法(四)- 函数

一.介绍

1.1 定义

函数是可重复调用的代码块,用来实现特定功能。

1.2 语法

def 函数名(参数1, 参数2, ...):

       """函数文档字符串(可选,说明函数功能)"""

       # 函数体:实现功能的代码

       执行语句

       return 返回值 # 可选,没有则默认返回None

1.3 注意事项

1.参数相关

默认参数:禁用列表 / 字典(可变对象),改用 None(内部初始化:lst = [] if lst is None else lst

参数顺序:必选 → 默认 → *args → **kwargs(违反直接报错)

可变对象传参:函数内修改会影响外部(传副本lst.copy()避免)

2. 作用域相关

修改全局变量加global,修改嵌套变量加nonlocal

未声明直接赋值全局变量 → 被识别为局部变量(报错)

3. 返回值相关

无 return 的函数 → 默认返回 None(别误判有返回值)

多返回值本质是元组,解包时数量要匹配(否则报错)

4. 递归函数

必须写明确终止条件,递归深度≤约 1000 层(否则报 RecursionError)

二.参数与返回值

2.1参数方式及对比

对比维度位置参数默认参数关键字参数可变位置参数 (*args)可变关键字参数 (**kwargs)解包传参
参数数量固定固定固定任意数量任意数量固定(解包后)
参数顺序严格要求需在位置参数后定义调用时可打乱解包后需匹配函数定义顺序
接收数据类型单个值单个值单个值元组字典列表 / 元组 / 字典(解包为单个值)
适用场景参数数量固定、顺序明确参数有常用默认值参数多 / 怕记混顺序不确定位置参数数量不确定关键字参数数量已有列表 / 字典,需快速传参
核心限制少传 / 多传都会报错1. 避免用列表 / 字典等可变对象做默认值;2. 必须在位置参数后定义调用时需在位置参数之后需在默认参数后、**kwargs前定义必须在参数列表最后定义解包后数量 / 名称需匹配函数定义(否则报错)

2.2 返回值类型及对比

返回值形式核心特点关键注意事项
无返回值(默认)return,默认返回None别误判有 “隐形返回值”,仅执行操作时用
单个返回值返回单一值,类型不限返回值类型需与调用处预期匹配
多个返回值本质返回元组,可解包接收解包时变量数量必须与返回值数量匹配(否则报错)
返回容器(列表 / 字典)单个容器存储多个值,数量可灵活调整空容器需考虑调用处的空值处理逻辑

三.变量作用域

3.1 定义

变量作用域指的是变量在程序中可以被访问、修改的范围

3.2 类型

3.2.1 全局作用域(Global)

定义:在所有函数外部定义的变量,属于全局作用域。

特点:整个程序运行期间都存在,可被程序中所有函数 “读取”(默认不能直接修改,用 global 关键字声明)。

3.2.2 局部作用域(Local)

定义:在函数内部定义的变量,属于局部作用域。

特点:仅在定义它的函数内部可用,函数执行结束后变量会被销毁,外部无法访问。

3.2.3 非局部作用域(Enclosing)

定义:嵌套函数中,外层函数的变量对于内层函数来说,属于非局部作用域。

特点:内层函数可读取,(默认不能修改,需用 nonlocal 声明)。

3.3 作用域查找规则(LEGB)

L(Local):先找当前函数 / 代码块的局部作用域;

E(Enclosing):如果没找到,找嵌套外层函数的非局部作用域;

G(Global):如果没找到,找全局作用域;

B(Built-in):最后找 Python 内置的变量 / 函数。

四.匿名函数

4.1 本质

临时、简化的函数,无名称,仅实现一行简单逻辑

4.2 语法

# 语法结构:lambda + 参数列表 + : + 单个表达式

lambda 参数1, 参数2, ...: 表达式

4.3 lambda与常见内置函数的使用

4.3.1 lambda + sorted(最常用:自定义排序)

核心作用:指定排序的 “依据”,比如按元组 / 字典的某个值排序

极简语法sorted(序列, key=lambda x: 排序依据)

e.g.元组列表按第二个元素排序

输入:

data = [(1,5), (4,8), (6,9),(1,7)] print(sorted(data, key=lambda x: x[1]))

输出:

4.3.2 lambda + map(批量处理元素)

核心作用:对序列中每个元素执行同一简单操作

极简语法list(map(lambda x: 处理逻辑, 序列))(转列表才能看到结果)

e.g.提取字典列表的指定字段

输入:

students = [{"name":"张三","age":18}, {"name":"李四","age":16},{"name":"小胡","age":20}] print(list(map(lambda x: x["age"], students)))

输出:

4.3.3 lambda + filter(过滤元素)

核心作用:按条件筛选序列中的元素(保留返回 True 的元素)

极简语法list(filter(lambda x: 过滤条件, 序列))(转列表才能看到结果)

e.g.筛选奇数

输入:

num = [1,2,3,4,5,6,7,8,9,10] print(list(filter(lambda x: x%2==1, num)))

输出:

五.嵌套函数

5.1 定义

嵌套函数指的是在一个函数(外部函数)内部定义另一个函数(内部函数)

5.2 机制

函数调用遵循栈结构,最后被调用的函数最先返回 LIFO (Last In First Out,后进先出)

5.3 应用 

  1. 封装私有逻辑:把仅在主函数内使用的辅助函数嵌套,避免污染全局命名空间;
  2. 实现闭包:保留外部函数的变量状态;
  3. 减少参数传递:内部函数可直接用外部函数的变量,无需重复传参。

六.递归函数

6.1 定义

递归函数就是在函数体内调用自身的函数

必须满足 2 个条件:

基线条件:什么时候停止调用自己(避免无限循环)
递归条件:什么时候调用自己(逐步靠近基线条件)

6.2 递归与循环对比

对比维度递归循环
代码风格简洁、逻辑直观稍繁琐,需手动控制循环变量
性能有函数调用开销,执行速度稍慢无额外调用开销,执行速度更快
内存占用占用栈内存,递归深度有限制内存占用稳定,无深度限制
易错点遗漏基线条件 → 触发无限递归报错遗漏终止条件 → 导致死循环
适用场景逻辑简单、追求代码简洁时数据量大、追求速度 / 低内存占用时

6.3 示例

e.g. 阶乘的计算(简易)

输入:

n = int(input("请输入n的值:")) if n < 0: print("错误:负数没有阶乘!") else: def Factorial(m): if m == 0 or m == 1: return 1 else: return m * Factorial(m - 1) print(f"{n}的阶乘为{Factorial(n)}") 

输出:

Read more

解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程

解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程

文章目录 * 解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程 * 引言:技术融合的奇妙开篇 * 认识主角:Dify、MCP 与 MySQL * (一)Dify:大语言模型应用开发利器 * (二)MCP:连接的桥梁 * (三)MySQL:经典数据库 * 准备工作:搭建融合舞台 * (一)环境搭建 * (二)安装与配置 Dify * (三)安装与配置 MySQL * 关键步骤:Dify 与 MySQL 的牵手过程 * (一)安装必要插件 * (二)配置 MCP SSE * (三)创建 Dify 工作流 * (四)配置 Agent 策略 * (五)搭建MCP

By Ne0inhk
如何在Cursor中使用MCP服务

如何在Cursor中使用MCP服务

前言 随着AI编程助手的普及,越来越多开发者选择在Cursor等智能IDE中进行高效开发。Cursor不仅支持代码补全、智能搜索,还能通过MCP(Multi-Cloud Platform)服务,轻松调用如高德地图API、数据库等多种外部服务,实现数据采集、处理和自动化办公。 本文以“北京一日游自动化攻略”为例,详细讲解如何在 Cursor 中使用 MCP 服务,完成数据采集、数据库操作、文件生成和前端页面展示的全流程。 学习视频:cursor中使用MCP服务 一、什么是MCP服务? MCP(Multi-Cloud Platform)是Cursor内置的多云服务接口,支持调用地图、数据库、文件系统等多种API。通过MCP,开发者无需手动写HTTP请求或繁琐配置,只需在对话中描述需求,AI助手即可自动调用相关服务,极大提升开发效率。 二、环境准备 2.1 cursor Cursor重置机器码-解决Too many free trials. 2.

By Ne0inhk
MCP客户端与服务端初使用——让deepseek调用查询天气的mcp来查询天气

MCP客户端与服务端初使用——让deepseek调用查询天气的mcp来查询天气

本系列主要通过调用天气的mcp server查询天气这个例子来学习什么是mcp,以及怎么设计mcp。话不多说,我们开始吧。主要参考的是B站的老哥做的一个教程,我把链接放到这里,大家如果有什么不懂的也可以去看一下。 https://www.bilibili.com/video/BV1NLXCYTEbj?spm_id_from=333.788.videopod.episodes&vd_source=32148098d54c83926572ec0bab6a3b1d https://blog.ZEEKLOG.net/fufan_LLM/article/details/146377471 最终的效果:让deepseek-v3使用天气查询的工具来查询指定地方的天气情况 技术介绍 MCP,即Model Context Protocol(模型上下文协议),是由Claude的母公司Anthropic在2024年底推出的一项创新技术协议。在它刚问世时,并未引起太多关注,反响较为平淡。然而,随着今年智能体Agent领域的迅猛发展,MCP逐渐进入大众视野并受到广泛关注。今年2月,

By Ne0inhk
可以在命令行通过大模型使用上下文协议(MCP)与外部工具交互的软件:小巧的MCPHost

可以在命令行通过大模型使用上下文协议(MCP)与外部工具交互的软件:小巧的MCPHost

小巧的MCPHost MCPHost 可以在命令行下使用,使大型语言模型(LLM)能够通过模型上下文协议(MCP)与外部工具进行交互。目前支持Claude 3.5 Sonnet和Ollama等。本次实践使用自己架设的Deepseek v3模型,跑通了Time MCP服务。  官网:GitHub - mark3labs/mcphost: A CLI host application that enables Large Language Models (LLMs) to interact with external tools through the Model Context Protocol (MCP). 下载安装 使用非常方便,直接下载解压即可使用。官网提供Windows、Linux和MacOS三个系统的压缩包: https://github.com/

By Ne0inhk