当前位置: 首页 > article >正文

Python 函数全攻略:函数基础

函数(Functions)基础

  1. 什么是函数?

    • 一个命名的代码块,代指一大堆代码。

    • 定义: def function_name(): (使用def关键字,英文括号,冒号,缩进代码块)。

    • 执行/调用: function_name() (写函数名加括号)。

    • 特性: 定义时不执行,调用时才执行。可重复调用。

  2. 为什么学习函数?(优势与应用场景)

    • 增强代码重用性: 将重复或公共的代码块提取成函数,需要时调用即可,避免复制粘贴。

    • 提高代码可读性: 将复杂逻辑拆分成多个小函数,每个函数负责一个清晰的功能,使主逻辑更简洁易懂。就像将大任务分解为小任务并命名。

  3. 函数参数(Function Parameters)

    • 基本使用:

      • 定义参数: 在函数名后的括号中定义变量名(形参)。

      • 传递参数: 调用函数时传入值(实参)。

      • 位置传参: 按参数在函数定义中的顺序传值。

        • 示例:def func(x1, x2): ... 调用 func(1, 2)

      • 关键字传参: 调用时指定参数名赋值。顺序不重要。

        • 示例:func(x2=2, x1=1)

      • 混合传参: 位置参数必须在前,关键字参数在后。

        • 示例:func(1, x2=2) (正确),func(x1=1, 2) (错误)。

      • 类型: 任意类型(int, str, list, dict等)都可以作为参数传递。

    • 参数默认值:

      • 定义: def func(x1, x2=default_value): ...

      • 行为: 调用时如果不传该参数,则使用默认值;如果传入,则覆盖默认值。

      • 注意: 带默认值的参数必须放在不带默认值的参数之后。

    • 动态参数(*args**kwargs):

      • *args (星号参数/可变位置参数):

        • 定义: def func(*args): ...

        • 接收: 接收任意数量的位置参数。这些参数会被打包成一个元组(tuple)

        • 示例:func(1, 2, 'hello')args将是(1, 2, 'hello')

        • 不传参数时,args为空元组()

        • 易错点: 传入的列表/元组本身会作为一个整体元素放入args元组中,而不是被解包。

      • **kwargs (双星号参数/可变关键字参数):

        • 定义: def func(**kwargs): ...

        • 接收: 接收任意数量的关键字参数。这些参数会被打包成一个字典(dict)

        • 示例:func(name='Alice', age=30)kwargs将是{'name': 'Alice', 'age': 30}

        • 不传参数时,kwargs为空字典{}

      • 混合使用(*args**kwargs):

        • 定义顺序: 必须是 def func(normal_param, *args, **kwargs): ...

        • 传参顺序: func(位置参数, *args打包的参数, **kwargs打包的参数)

        • 惯例: 动态参数名通常写为 *args**kwargs

        • 应用: 常见于内置函数(如print())和框架/库中,用于灵活接收用户传入的任意参数。

实践案例:Python发送邮件

  • 实现思路: 借助于第三方邮箱服务器(如网易126邮箱)的SMTP服务。

    1. 注册邮箱并开启SMTP服务: 登录邮箱设置,找到POP3/SMTP服务,开启并获取授权码(替代邮箱密码用于代码登录)。记录SMTP服务器地址(如smtp.126.com)。

    2. 导入模块: import smtplibfrom email.mime.text import MIMEText

    3. 构建邮件内容: 使用MIMEText创建邮件对象,指定主题、发件人、收件人、正文。

    4. 发送邮件:

      • 创建SMTP连接:smtp_obj = smtplib.SMTP_SSL('smtp.126.com', 465) (SMTP_SSL使用SSL加密,端口通常为465)。

      • 登录邮箱:smtp_obj.login(sender_email, authorization_code)

      • 发送:smtp_obj.sendmail(sender_email, [receiver_email], msg.as_string())

      • 退出:smtp_obj.quit()

  • 结合函数: 可将发送邮件逻辑封装成函数,通过参数动态传入收件人、主题、内容,实现更灵活的邮件发送功能。


函数的返回值(Return Values)

  • 作用: 执行完函数后,将结果返回给调用者。

  • 语法: return 值

  • return vs. print

    • print:仅输出到控制台。

    • return:将值返回给调用者,可被变量接收。

  • 特性:

    1. 任意类型: 返回值可以是任意Python类型。

    2. 默认 None 函数若无 return 语句,默认返回 None

    3. 终止函数: 函数内部一旦遇到 return,立即终止执行后续代码。

  • 多值返回: return val1, val2, val3 实际返回一个元组。调用时可利用解包 a, b, c = func()

函数内调用函数 (嵌套调用)

  • 函数内部可以调用其他函数。

  • 调用发生时,会先执行被调用的函数,待其执行完毕(及处理返回值)后,再回到原函数继续执行。

函数参数传递:引用 vs. 值

  • 结论: Python函数参数传递的是引用,不会重新拷贝数据。

  • 证明:

    • 可变类型 (如列表): 函数内部对参数的修改(如 append, remove)会直接影响到外部传入的原始数据,因为它们指向同一内存地址。

    • 不可变类型 (如字符串、数字、元组): 虽然传递的是引用,但由于不可变类型本身无法被原地修改,任何"修改"操作(如 str.upper())都会生成新对象,原引用保持不变。

作用域(Scope)

  • 定义: 一块共享的区域,区域内数据可被访问。

  • Python中的作用域:

    1. 全局作用域: 最外层代码块,全局变量可在任何地方被访问。

    2. 函数作用域: 每个函数都是一个独立的作用域(局部作用域)。

  • 查找规则: 在函数内部查找变量时,优先在自身局部作用域查找;若无,则向上一级(父级,通常是全局作用域)查找。

  • 局部变量 vs. 全局变量:

    • 局部变量: 函数内部定义的变量,仅在该函数内有效。

    • 全局变量: 在任何函数之外定义的变量。

    • 规范: 全局变量通常使用大写命名,局部变量使用小写。

  • global 关键字:

    • 作用:在函数内部声明变量为全局变量。

    • 效果:使用 global var_name 后,函数内部对 var_name 的任何操作都将直接作用于全局作用域中的同名变量,而不是在局部作用域内创建新变量。

    • 示例:global name; name = 'new_val' 会修改全局 name

函数名本质是一个变量

  • 概念: 函数名像其他变量一样,可以被赋值、作为参数传递、存储在数据结构(列表、字典)中。

  • func vs. func()

    • func:代表函数本身(函数对象),不执行。

    • func():表示调用并执行函数,获取其返回值。

  • 应用场景:

    1. 批量执行: 将多个函数名存储在列表/元组中,通过循环统一调用执行,避免重复代码。

    2. 调度中心 (命令模式): 使用字典将功能编号/名称映射到对应的函数名。根据用户选择获取并执行相应函数,简化 if/elif/else 结构。

拉姆达式(Lambda Expressions)/ 匿名函数

  • 定义: 一种用于创建小型、单行匿名函数的简洁方式。

  • 语法: lambda 参数: 表达式

    • lambda:关键字。

    • 参数:函数参数,可省略或多个。

    • 表达式:函数体,执行后隐含 return

  • 特点:

    • 匿名: 没有名称。

    • 单行: 只能包含一个表达式,结果被隐式返回。

    • 简洁: 适用于逻辑简单的函数。

  • 应用: 常用于作为参数传递给其他高阶函数(如 map, filter, sortedkey 参数),如filter(lambda x:x>5, [1,6,3]),或作为数据结构中的元素。


相关文章:

Python 函数全攻略:函数基础

函数(Functions)基础 什么是函数? 一个命名的代码块,代指一大堆代码。 定义: def function_name(): (使用def关键字,英文括号,冒号,缩进代码块)。 执行/调用: function…...

机器学习基础(四) 决策树

决策树简介 决策树结构: 决策树是一种树形结构,树中每个内部节点表示一个特征上的判断,每个分支代表一个判断结果的输出,每个叶子节点代表一种分类结果 决策树构建过程(三要素): 特征选择 选…...

DDPM优化目标公式推导

DDPM优化目标公式推导 DDPM优化目标公式推导**1. 问题定义****2. 优化目标:最大化对数似然****3. 变分下界的分解****4. 关键步骤:简化 KL 散度项****(a) 后验分布 q ( x t − 1 ∣ x t , x 0 ) q(\mathbf{x}_{t-1} | \mathbf{x}_t, \mathbf{x}_0) q(xt…...

CentOS 7如何编译安装升级gcc至7.5版本?

CentOS 7如何编译安装升级gcc版本? 由于配置CentOS-SCLo-scl.repo与CentOS-SCLo-scl-rh.repo后执行yum install -y devtoolset-7安装总是异常,遂决定编译安装gcc7.5 # 备份之前的yum .repo文件至 /tmp/repo_bak 目录 mkdir -p /tmp/repo_bak && cd /etc…...

为什么React列表项需要key?(React key)(稳定的唯一标识key有助于React虚拟DOM优化重绘大型列表)

文章目录 1. **帮助 React 识别列表项的变化**2. **性能优化**3. **避免组件状态混乱**4. **为什么使用 rpid 作为 key**5. **不好的做法示例**6. **✅ 正确的做法** 在 React 中添加 key{item.rpid} 是非常重要的,主要有以下几个原因: 1. 帮助 React 识…...

Playwright自动化测试全栈指南:从基础到企业级实践(2025终极版)

引言 在Web应用复杂度指数级增长的今天,传统自动化测试工具面临​​动态渲染适配难​​、​​多浏览器兼容差​​、​​测试稳定性低​​三大挑战。微软开源的Playwright凭借​​跨浏览器支持​​、​​自动等待机制​​和​​原生异步架构​​,成为新一代自动化测试的事实标…...

飞牛云一键设置动态域名+ipv6内网直通访问内网的ssh服务-家庭云计算专家

IPv6访问SSH的难点与优势并存。难点主要体现在网络环境支持不足:部分ISP未完全适配IPv6协议,导致客户端无法直接连通;老旧设备或工具(如Docker、GitHub)需额外配置才能兼容IPv6,技术门槛较高;若…...

虚实共生时代的情感重构:AI 恋爱陪伴的崛起、困局与明日图景

一、虚拟恋人:从技术幻想到情感刚需的跨越 在 5G 网络编织的数字浪潮里,AI 驱动的虚拟恋人正打破次元界限。深度学习算法剖析 3000 万段真实对话语料库,搭配 VR 设备带来的多维度交互体验,如今的虚拟对象已能精准模拟瞳孔微表情&…...

嵌入式面试高频(5)!!!C++语言(嵌入式八股文,嵌入式面经)

一、C有几种传值方式之间的区别 一、值传递(Pass by Value) 机制:创建参数的副本,函数内操作不影响原始数据语法:void func(int x)特点: 数据安全:原始数据不受影响性能开销:需要复…...

C++动态规划-线性DP

这是一套C线性DP题目的答案。如果需要题目&#xff0c;请私信我&#xff0c;我将会更新题干 P1:单子序列最大和 #include <bits/stdc.h> using namespace std; int n,A,B,C; int a[200005]; int s[200005]; int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)…...

Java高级 | 【实验七】Springboot 过滤器和拦截器

隶属文章&#xff1a;Java高级 | &#xff08;二十二&#xff09;Java常用类库-CSDN博客 系列文章&#xff1a;Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…...

es地理信息索引的类型以及geo_point‌和geo_hash的关系

Elasticsearch中地理信息索引的主要数据类型有两种&#xff1a; geo_point&#xff1a;用于存储单个地理点坐标&#xff08;如纬度/经度&#xff09;&#xff0c;支持精确位置查询和基于距离的搜索操作。geo_shape&#xff1a;用于存储复杂的地理形状&#xff08;如点、线、多…...

深入理解 Spring IOC:从概念到实践

目录 一、引言 二、什么是 IOC&#xff1f; 2.1 控制反转的本质 2.2 类比理解 三、Spring IOC 的核心组件 3.1 IOC 容器的分类 3.2 Bean 的生命周期 四、依赖注入&#xff08;DI&#xff09;的三种方式 4.1 构造器注入 4.2 Setter 方法注入 4.3 注解注入&#xff08;…...

Vue解决开发环境 Ajax 跨域问题

一、前言 在使用 Vue 进行前后端分离开发时&#xff0c;前端通常运行在本地开发服务器&#xff08;如 http://localhost:8080&#xff09;&#xff0c;而后端接口可能部署在其他域名或端口下&#xff08;如 http://api.example.com:3000&#xff09;。这时就可能出现 跨域&…...

行为设计模式之Command (命令)

行为设计模式之Command &#xff08;命令&#xff09; 前言&#xff1a; 需要发出请求的对象&#xff08;调用者&#xff09;和接收并执行请求的对象&#xff08;执行者&#xff09;之间没有直接依赖关系时。比如遥控器 每个按钮绑定一个command对象&#xff0c;这个Command对…...

若依添加添加监听容器配置(删除键,键过期)

1、配置Redis的键触发事件 # 基础配置 bind 0.0.0.0 # 允许所有IP连接 protected-mode no # 关闭保护模式&#xff08;生产环境建议结合密码使用&#xff09; port 6379 # 默认端口 daemonize no …...

NeRF 技术深度解析:原理、局限与前沿应用探索(AI+3D 产品经理笔记 S2E04)

引言&#xff1a;光影的魔法师——神经辐射场概览 在前三篇笔记中&#xff0c;我们逐步揭开了 AI 生成 3D 技术的面纱&#xff1a;从宏观的驱动力与价值&#xff08;S2E01&#xff09;&#xff0c;到主流技术流派的辨析&#xff08;S2E02&#xff09;&#xff0c;再到实用工具的…...

ROS2,工作空间中新建了一个python脚本,需要之后作为节点运行。告诉我步骤?

提问 ROS2&#xff0c;工作空间中新建了一个python脚本&#xff0c;需要之后运行。告诉我步骤&#xff1f; 大概要包括而不限于&#xff1a;chmod给可执行权限、setup.py中entry point的配置&#xff0c;如果在launch文件中要使用&#xff0c;还涉及到launch.py文件的配置。最…...

【AI智能体】Spring AI MCP 从使用到操作实战详解

目录 一、前言 二、MCP 介绍 2.1 什么是MCP 2.2 MCP 核心特点 2.3 MCP 核心价值 2.4 MCP 与Function Calling 区别 三、Spring AI MCP 架构介绍 3.1 整体架构 3.1.1 三层架构实现说明 3.2 服务端与客户端 3.2.1 MCP 服务端 3.2.1 MCP 客户端 3.3 MCP中SSE和STDIO区…...

Vue:Ajax

AJAX 允许我们在不刷新页面的情况下与服务器交互&#xff0c;实现&#xff1a;动态加载数据&#xff0c;提交表单信息&#xff0c;实时更新内容&#xff0c;与后端 API 通信。通常使用专门的 HTTP 客户端库来处理 AJAX 请求。 npm install axiosimport axios from axios;expor…...

法律大语言模型(Legal LLM)技术架构

目录 摘要 1 法律AI大模型技术架构 1.1 核心架构分层 1.2 法律知识增强机制 2 关键技术突破与对比 2.1 法律专用组件创新 2.2 性能对比(合同审查场景) 3 开发部署实战指南 3.1 环境搭建流程 3.2 合同审查代码示例 4 行业应用与挑战 4.1 典型场景效能提升 4.2 关…...

理解 RAG_HYBRID_BM25_WEIGHT:打造更智能的混合检索增强生成系统

目录 理解 RAG_HYBRID_BM25_WEIGHT&#xff1a;打造更智能的混合检索增强生成系统 一、什么是 Hybrid RAG&#xff1f; 二、什么是 RAG_HYBRID_BM25_WEIGHT&#xff1f; 三、参数设置示例 四、什么时候该调整它&#xff1f; 五、实战建议 六、总结 理解 RAG_HYBRID_BM25…...

Hive终极性能优化指南:从原理到实战

摘要​&#xff1a;本文系统总结Hive在生产环境的核心调优手段&#xff0c;涵盖执行引擎选择、存储优化、SQL技巧、资源调配及数据倾斜解决方案&#xff0c;附可复用的参数配置与实战案例。 一、执行引擎优化&#xff1a;突破MapReduce瓶颈 ​启用Tez/Spark引擎​ ​优势​&am…...

第六十二节:深度学习-加载 TensorFlow/PyTorch/Caffe 模型

在计算机视觉领域,OpenCV的DNN(深度神经网络)模块正逐渐成为轻量级模型部署的利器。本文将深入探讨如何利用OpenCV加载和运行三大主流框架(TensorFlow、PyTorch、Caffe)训练的模型,并提供完整的代码实现和优化技巧。 一、OpenCV DNN模块的核心优势 OpenCV的DNN模块自3.3…...

MobaXterm配置跳转登录堡垒机

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 背景操作步骤 背景 主要是为了能通过MobaXterm登录堡垒机&#xff0c;其中需要另外一台服务器进行跳转登录 操作步骤 MobaXterm登录堡垒机的操作&#xff0c;需…...

零基础在实践中学习网络安全-皮卡丘靶场(第八期-Unsafe Filedownload模块)

这期内容更是简单和方便&#xff0c;毕竟谁还没在浏览器上下载过东西&#xff0c;不过对于url的构造方面&#xff0c;可能有一点问题&#xff0c;大家要多练手 介绍 不安全的文件下载概述 文件下载功能在很多web系统上都会出现&#xff0c;一般我们当点击下载链接&#xff0c…...

测试 FreeSWITCH 的 mod_loopback

bgapi originate loopback/answer,park/default/inline park inline show channels as xml show calls as xml 有 2 个 channels 有 2 个 calls 比较有意思 在 loopback-a 是播放 wav 在 loopback-b 上可以录音 这就是回环 有什么用呢&#xff1f; 除了做测试&#x…...

【C++快读快写】

算法竞赛中用于解决卡常问题 int rd(){int k 0;char c getchar();while(!isdigit(c)){c getchar();}while(isdigit(c)){k (k << 1) (k << 3) (c^0), c getchar();}return k; }void wr(int x) {if (x > 9)wr(x / 10);putchar((x % 10) ^ 0); }用法&#x…...

测试(面经 八股)

目录 前言 一&#xff0c;软件测试&#xff08;定义&#xff09; 1&#xff0c;定义 2&#xff0c;目的 3&#xff0c;价值 4&#xff0c;实践 二&#xff0c;软件测试&#xff08;目的&#xff09; 1&#xff0c;找 bug 2&#xff0c;验证达标 3&#xff0c;质量评价…...

[面试精选] 0104. 二叉树的最大深度

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点…...