一、函数

1、函数是什么

编程中的函数和数学中的函数有一定的相似之处。

数学上的函数,比如 y = sin x,x 取不同的值,y 就会得到不同的结果。

编程中的函数是一段可以被重复使用的代码片段。

(1)求数列的和,不使用函数

可以发现,这几组代码基本是相似的,只有一点点差异,可以把重复代码提取出来做成一个函数。

在实际开发中,复制粘贴是一种不太好的策略,实际开发的重复代码可能存在几十份甚至上百份。一旦这个重复代码需要被修改,那就得改几十次,非常不便于维护。

(2)求数列的和,使用函数

2、语法格式

(1)创建函数 / 定义函数

def 函数名(形参列表):函数体return 返回值# def:define定义
# 形参列表中可以有多个形参,多个形参(形式参数)之间用逗号分隔
# 函数体要带有一定的缩进(带有缩进的代码才是函数内部的语句)
# 函数执行到 return 就意味着执行完了,return 后面的值就是函数的返回值

(2)调用函数 / 使用函数 

函数名(实参列表)            // 不考虑返回值
返回值 = 函数名(实参列表)   // 考虑返回值# 此处的实参个数要和形参个数匹配

函数定义并不会执行函数体内容,必须要调用才会执行,调用几次就会执行几次。 

def test1():print('hello')# 如果光是定义函数, 而不调用, 则不会执行

函数必须先定义,再使用:

test3()          # 还没有执行到定义, 就先执行调用了, 此时就会报错. 
def test3():print('hello')


3、函数参数

在函数定义的时候,可以在 ( ) 中指定 “形式参数”(简称形参),然后在调用的时候,由调用者把 “实际参数”(简称实参) 传递进去。这样就可以做到一份函数,针对不同的数据进行计算处理。

前面这段代码中, beg、end 就是函数的形参; 1、100 / 300、400 就是函数的实参。

  • 在执行 sum(1, 100) 的时候,就相当于 beg = 1、end = 100,然后在函数内部就可以针对 1-100进行运算。
  • 在执行 sum(300, 400) 的时候,就相当于 beg = 300、end = 400,然后在函数内部就可以针对 300-400 进行运算。

注意 一个函数可以有一个形参, 也可以有多个形参, 也可以没有形参。 一个函数的形参有几个, 那么传递实参的时候也得传几个, 保证个数要匹配。

  • 和 C++ / Java 不同,Python 是动态类型的编程语言,函数的形参不必指定参数类型。换句话说,一个函数可以支持多种不同类型的参数。

4、函数返回值

函数的参数可以视为是函数的 “输入”,则函数的返回值就可以视为是函数的 “输出”。

此处的 “输入”,“输出” 是更广义的输入输出,不是单纯指通过控制台输入输出。

可以把函数想象成一个 “工厂”,工厂需要买入原材料,进行加工,并生产出产品。

函数的参数就是原材料,函数的返回值就是生产出的产品。

上面这两段代码的区别就在于:前者直接在函数内部进行了打印,后者则使用 return 语句把结果返回给函数调用者,再由调用者负责打印。一般倾向于第二种写法。

在实际开发中的一个通常的编程原则是:“逻辑和用户交互分离”。而第一种写法的函数中既包含了计算逻辑,又包含了和用户交互(打印到控制台上),这种写法是不太好的,如果后续我们需要的是把计算结果保存到文件中或者通过网络发送,或者展示到图形化界面里,那么第一种写法的函数就难以胜任了。而第二种写法则专注于做计算逻辑,不负责和用户交互,那么就很容易把这个逻辑搭配不同的用户交互代码,来实现不同的效果。

(1)一个函数中可以有多个 return 语句

(2)执行到 return 语句,函数就会立即执行结束,回到调用位置 

下面这段代码和上一段代码的逻辑是等价的。

如果 num 是偶数,则进入 if 之后,就会触发 return False,也就不会继续执行 return True。

(3)一个函数是可以一次返回多个返回值的,使用 ',' 来分割多个返回值

(4)如果只想关注其中的部分返回值,可以使用 _ 来忽略不想要的返回值

5、变量作用域

在这个代码中,函数内部存在 x、y,函数外部也有 x、y。但是这两组 x、y 不是相同的变量,而只是恰好有一样的名字。

(1)变量只能在所在的函数内部生效

在函数 getPoint() 内部定义的 x、y 只是在函数内部生效。一旦出了函数的范围,这两个变量就不再生效了。

(2)在不同的作用域中允许存在同名的变量

虽然名字相同,但实际上是不同的变量。

注意 :

  • 在函数内部的变量也称为 “局部变量”。
  • 不在任何函数内部的变量也称为 “全局变量”。

(3)如果函数内部尝试访问的变量在局部不存在,就会尝试去全局作用域中查找

(4)如果是想在函数内部修改全局变量的值,需要使用 global 关键字声明

如果此处没有 global,则函数内部的 x = 10 就会被视为是创建一个局部变量 x,这样就和全局变量 x 不相关了。

(5)if / while / for 等语句块不会影响到变量作用域

换而言之,在 if / while / for 中定义的变量在语句外面也可以正常使用。

6、函数执行过程

  • 调用函数才会执行函数体代码,不调用则不会执行。
  • 函数体执行结束(或者遇到 return 语句),则回到函数调用位置,继续往下执行。

这个过程还可以使用 PyCharm 自带的调试器来观察。

  • 点击行号右侧的空白,可以在代码中插入断点
  • 右键,Debug,可以按照调试模式执行代码。每次执行到断点,程序都会暂停下来。
  • 使用 Step Into (F7) 功能可以逐行执行代码。

7、链式调用

 

前面有一段代码:

实际上也可以简化写作:

把一个函数的返回值作为另一个函数的参数,这种操作称为链式调用。链式调用先执行 () 里面的函数,再执行外面的函数,换句话说,调用一个函数就需要先对它的参数求值。

8、嵌套调用 

函数内部还可以调用其他的函数,这个动作称为 “嵌套调用”。

test 函数内部调用了 print 函数,这里就属于嵌套调用。

(1)一个函数里面可以嵌套调用任意多个函数

函数嵌套的过程是非常灵活的。

如果把代码稍微调整,打印结果则可能发生很大变化:

函数之间的调用关系,在 Python 中会使用一个特定的数据结构来表示,称为函数调用栈每次函数调用,都会在调用栈里新增一个元素,称为栈帧

可以通过 PyCharm 调试器看到函数调用栈和栈帧。

在调试状态下,PyCharm 左下角一般就会显示出函数调用栈。

(2)每个函数的局部变量,都包含在自己的栈帧中 

选择不同的栈帧就可以看到各自栈帧中的局部变量。

上述代码,a、b、c、d 函数中的局部变量名各不相同。

如果变量名是相同的,比如都是 num,那么这四个函数中的 num 是属于同一个变量,还是不同变量呢?

虽然每个变量同名,但是它们是不同变量,属于不同的函数作用域,每个变量保存在各自的栈帧中(每个栈帧也是保存在内存上),变量本质就是一块内存空间。

9、函数递归

递归嵌套调用中的一种特殊情况,即一个函数嵌套调用自己:

注意递归代码务必要保证存在递归结束条件。比如 if n == 1 就是结束条件,当 n 为 1 的时候,递归就结束了。每次递归的时候,要保证函数的实参是逐渐逼近结束条件的。

如果上述条件不能满足,就会出现 “无限递归”,这是一种典型的代码错误:

如前面所描述,函数调用时会在函数调用栈中记录每一层函数调用的信息,但是函数调用栈的空间不是无限大的。如果调用层数太多就会超出栈的最大范围,导致出现问题。

(1)递归的优点

  1. 递归类似于 “数学归纳法”,明确初始条件和递推公式就可以解决一系列的问题。
  2. 递归代码往往代码量非常简介。(尤其是处理一些 “问题本身就是通过递归的方式定义的”)

(2)递归的缺点 

  1. 递归代码往往执行过程非常复杂、难以理解,很容易超出掌控范围。
  2. 递归代码容易出现栈溢出的情况。(代码不小心写错导致每次递归,参数不能正确的接近递归结束条件,从而导致无限递归的情况)
  3. 递归代码一般都可以转换成等价的循环代码,且通常来说循环版本的代码执行效率要略高于递归版本。(函数调用也是有开销的)

实际开发的时候,使用递归要慎重!

10、参数默认值 

Python 中的函数可以给形参指定默认值。

带有默认值的参数可以在调用的时候不传参。

此处 debug=False 即为参数默认值。当我们不指定第三个参数的时候,默认 debug 的取值即为 False。

(1)带有默认值的参数需要放到没有默认值的参数的后面

11、关键字参数 

在调用函数的时候,需要给函数指定实参。一般默认情况下是按照形参的顺序来依次传递实参的。

但是我们也可以通过关键字参数来调整这里的传参顺序,显式指定当前实参传递给哪个形参。

形如上述 test(x=10, y=20) 这样的操作,即为关键字参数

按照先后顺序来传参,这种传参风格称为 “位置参数”。位置参数和关键字参数可以混着用,只不过混着用的时候要求位置参数在前,关键字参数在后。

关键字参数一般搭配默认参数来使用。

一个函数可以提供很多的参数来实现对这个函数的内部功能做出一些调整设定,为了降低调用者的使用成本,可以把大部分参数设定出默认值。

当调用者需要调整其中的一部分参数时,可以搭配关键字参数来进行操作。

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

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

相关文章

Windows/Linux系统 Ollama部署deepseek 大模型

Ollama 是一个开源工具,专门用于在本地计算机上运行和操作大型语言模型(LLM) 官方下载网站(https://ollama.ai/) Windows系统安装方法 建议命令行安装(默认安装会直接安装到C盘) OllamaSetu…

用Tensorflow进行线性回归和逻辑回归(一)

这一章告诉你如何用TensorFlow构建简单的机器学习系统。第一部分回顾构建机器学习系统的基础特别是讲函数,连续性,可微性。接着我们介绍损失函数,然后讨论机器学习归根于找到复杂的损失函数最小化的点的能力。我们然后讲梯度下降,…

java/.net跨平台UI浏览器SDK,浏览器控件开发包分析

在 Linux 系统中,虽然没有完全等同于安卓 WebView 的内置浏览器 SDK,但存在多种基于开源浏览器引擎的解决方案,支持通过 Java 代码控制网页加载和执行 JavaScript。以下是具体实现方案和技术细节: 一、核心技术方案对比 方案名称…

Taro 状态管理全面指南:从本地状态到全局方案

在跨端应用开发中,状态管理是构建可维护、可扩展应用的核心环节。作为京东凹凸实验室推出的多端统一开发框架,Taro 支持 React/Vue 等主流前端框架,自然也继承了丰富的状态管理生态。本文将全面剖析 Taro 中的各种状态管理方案,从…

记录一下jar做成windows服务问题

1、打包好jar 2、把jdk防止到和jar同一目录下 3、下载winsw-x64.exe 和 sample-minimal.xml https://github.com/winsw/winsw/releases/download/v2.12.0/WinSW-x64.exehttps://github.com/winsw/winsw/releases/download/v2.12.0/WinSW-x64.exe sample-minimal.xmlhttps://…

【Dify 案例】【MCP实战】【二】【超级助理】

我们创建一个工作流。你是一个超级助理,能够根据输入的指令,进行推理和自主调用工具,完成并输出结果。 注意,需要判断是否调用高德MCP来获取对应工具协助你完成任务。 1.开始 2.策略大脑 2.1 AEGNT策略 2.2 工具列表 2.3 指令

Qt Quick 与 QML(二)qml中的顶级窗口

一、前言 在QML中,‌顶级窗口不是绝对必需的‌,但它在大多数应用场景中扮演着关键角色。 需要顶级窗口的典型场景: 1.独立桌面/移动应用‌ 必须使用Window或ApplicationWindow作为根元素。 2.多窗口应用 每个独立窗口都需要一个顶级窗口实例…

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 免费服务开通全流程与Rest API和OpenAI SDK调用详解

华为云FlexusDeepSeek征文|DeepSeek-V3/R1 免费服务开通全流程与Rest API和OpenAI SDK调用详解 前言 本文将详细介绍DeepSeek-V3/R1 免费服务开通全流程,并且详细讲解通过本地方式Rest API和OpenAI SDK两种方式调用DeepSeek-V3/R1 前提准备 1、访问 Mod…

Qt 连接信号使用lambda表达式和槽函数的区别

1. 语法与代码结构 成员函数 需在类中显式声明槽函数(public slots: 或 Qt 5 后的任意成员函数),并在连接时指定接收对象。 class Receiver : public QObject {Q_OBJECT public slots:void handleSignal(int value) { /* ... */ } };// 连接…

学习笔记丨AR≠VR:透视沉浸式技术的“虚实象限”法则

AR(增强现实)和VR(虚拟现实)是沉浸式技术的两大分支,核心区别在于虚拟与现实的融合程度。以下是两者的详细对比: 对比维度 AR(增强现实) VR(虚拟现实) 技术…

本地使用 modelscope 大模型 来进行文本生成视频(Text-to-Video)

1. ✅ 创建并激活 Conda 环境(Python 3.8) conda create -n modelscope python3.8 -yconda activate modelscope 2.✅ 安装了 PyTorch(CPU 版本) 如果你是 CPU-only 用户(没有 NVIDIA 显卡 或不想用 GPU&#xff0…

文生视频(Text-to-Video)

🕒 生成时间:每张图大概 10–60 秒(取决于设备) ✅ 二、文生视频(Text-to-Video) 以下项目中,很多都基于 SD 模型扩展,但视频生成复杂度高,生成时间一般 超过 30 秒&am…

CLion + STM32环境配置,亲测有效(2025.06.19记)

CLion STM32环境配置 遇到的问题描述: > "moniton" command not supported by this target. > You cant do that when your target is exec > 上传完成,但存在问题 > monitor reset > "monitor" command not …

借助ChatGPT快速开发图片转PDF的Python工具

一、开发背景与适用场景 随着数字文档处理需求的激增,图片转PDF的需求日益广泛。从学生提交图像化作业,到教师整合扫描试卷等资料,再到行政人员归档证件照片,工作中的方方面面都离不开图片的处理。如何高效、批量地将多个图片文件…

SuGAR代码精简解读

目录 一、全流程训练脚本 train_full_pipeline.py 二、核心训练逻辑 train.py 粗优化 (coarse_density_and_dn_consistency.py) 网格提取 (extract_mesh_from_coarse_sugar) 精优化 (refined_training) 两次优化(粗优化和精优化)中使用的损失函数及…

大模型安全关键技术研究

​ 引言 随着人工智能技术的迅猛发展,大模型已成为推动各行业变革的核心力量。从智能客服、医疗影像识别到金融风险预测,大模型的应用场景不断拓展,深刻改变着人们的生产生活方式。大模型已经转变为AI领域的基础设施,为解决各种…

java面试题04成员变量和局部变量的区别

成员变量(Member Variable)和局部变量(Local Variable)是面向对象编程中两种作用域和生命周期不同的变量,主要区别体现在以下几个方面: 1. 声明位置 成员变量: 声明在类内部、方法/构造器/代码块外部。 例如: public class Person {// 成员变量(实例变量)private Str…

升级到 .NET 9 分步指南

随着激动人心的 .Net 9 更新正式发布,漫长的等待终于结束了。它带来了一些令人惊叹的特性,例如改进的 LINQ 功能、HybridCache 等等。此外,凭借其卓越的性能提升、更佳的安全性、更完善的协议和更易维护的特性,它必将吸引开发者和…

day30打卡

# 导入模块 import math print("方式1:使用 import math") print(f"圆周率π的值:{math.pi}") print(f"2的平方根:{math.sqrt(2)}\n") # 导入特定项 from math import pi, sqrt print("方式2&#…

优化数据库查询

优化数据库查询 在实际开发中,数据库查询的性能直接关系到系统响应速度和用户体验。尤其在高并发环境下,低效的SQL语句会成为瓶颈,导致系统负载升高,甚至引发宕机。因此,查询优化是数据库性能优化中最为关键的一环。 为了系统性地理解数据库查询优化策略,本节将从SQL语…