Python函数与列表元组全解析

一、函数

1.1函数的定义与作用

编程中的函数是可重复使用的代码片段,类似数学函数(输入不同参数得到不同结果),主要作用是:

  • 消除重复代码,提升代码复用性;
  • 便于代码维护(修改函数即可同步所有调用处)。

示例对比:求不同区间的和时,用函数可将重复的求和逻辑封装,只需调用时传入不同参数。

1.2函数的语法格式

1.定义函数

2.调用函数

1.3函数的核心规则
  1. 定义与调用的关系
    • 函数定义后不会自动执行,必须调用才会执行,调用次数对应执行次数;
    • 函数必须先定义,再调用(否则会报NameError)。
  2. 参数(形参 & 实参)
    • 形参:函数定义时的参数(如calcSum(beg, end)中的begend);
    • 实参:函数调用时传递的实际值(如calcSum(1, 100)中的1100);
    • 规则:形参与实参的数量必须匹配;函数可无参数、单参数或多参数。
1.4函数参数的特性

Python 是动态类型语言,函数形参无需指定类型,可接收多种类型的参数(如同一函数可传入整数、字符串、布尔值)。

  • 注意:调用函数时,实参数量必须与形参匹配,否则会报TypeError
1.5函数返回值

返回值是函数的 "输出"(类比工厂的产品),通过return语句实现,核心规则:

  1. 逻辑与交互分离 :函数应专注于计算逻辑(用return返回结果),而非直接进行用户交互(如打印),便于适配不同的交互场景(保存文件、网络发送等)。
  2. 多 return 语句 :函数可包含多个return,执行到return时函数立即结束并返回。
  3. 多返回值 :函数可通过逗号分隔返回多个值,调用时用多个变量接收;若需忽略部分返回值,可用_占位。

一个函数中可以有多个 return 语句:

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

一个函数是可以一次返回多个返回值的. 使用 , 来分割多个返回值:

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

1.6变量作用域

函数内部定义的变量(局部变量)仅在函数内部生效,外部无法直接访问;函数内外同名变量是不同的独立变量。

  1. 局部变量与全局变量
    • 函数内部定义的是局部变量,仅在函数内生效;
    • 函数外部定义的是全局变量,作用域覆盖整个代码。
  2. 同名变量的独立性 :不同作用域中允许存在同名变量,实际是独立的变量(如函数内外的x互不影响)。
  3. 变量查找逻辑:函数内部访问变量时,先找局部变量;局部不存在则查找全局变量。
  4. 修改全局变量 :函数内修改全局变量需用global关键字声明,否则会被视为创建局部变量。
  5. 语句块不影响作用域if/while/for等语句块内定义的变量,在块外部仍可使用(与函数作用域不同)。
1.7函数的执行过程
  • 函数仅在被调用时执行内部代码,不调用则不执行;
  • 函数执行到return语句或代码结束时,回到调用位置继续执行后续代码。
补充:函数执行的调试方法

可通过 PyCharm 的调试功能观察执行流程:插入断点→以 Debug 模式运行→用Step Into逐行执行。

1.8函数的调用方式
  1. 链式调用 :将一个函数的返回值直接作为另一个函数的参数,简化代码(如print(isOdd(10))替代先赋值再打印)。

2.嵌套调用 :函数内部调用其他函数,可多层嵌套;执行顺序由调用顺序决定(如d()调用c()c()调用b()b()调用a(),则执行顺序为d→c→b→a)。

1.9函数调用栈

Python 用函数调用栈管理函数调用关系:

  • 每次函数调用会在栈中新增一个 "栈帧",存储该函数的局部变量;
  • 函数执行结束后,对应的栈帧会从调用栈中移除;
  • 可通过 PyCharm 调试工具查看调用栈及各栈帧的局部变量。

补充:嵌套调用的执行逻辑

嵌套函数的执行顺序取决于调用语句的位置:若b()中先调用a()再打印,则执行顺序为a→b;若先打印再调用a(),则顺序为b→a

1.10函数递归

递归是函数嵌套调用自身的特殊情况,需满足两个核心条件:

  1. 存在递归结束条件 (如计算阶乘时n == 1);
  2. 实参逐渐逼近结束条件 (如n - 1)。
  • 若条件不满足,会出现 "无限递归",导致RecursionError(调用栈溢出)。
  • 优缺点
    • 优点:代码量少,符合数学归纳法逻辑;
    • 缺点:可读性差、易栈溢出,执行效率低于循环。
1.11参数默认值

函数形参可指定默认值,调用时若不传递该参数,则使用默认值:

  • 规则:带默认值的参数必须放在无默认值参数的后面 ,否则会报SyntaxError
  • 示例:def add(x, y, debug=False)中,debug为默认参数,调用时可省略。
1.12关键字参数

调用函数时,可通过 "形参名=实参值" 的方式显式指定参数,不受形参顺序限制:

  • 示例:test(x=10, y=20)test(y=100, x=200)均合法,参数按指定名称匹配。

二、列表与元组

2.1列表与元组的概念

两者都是批量存储数据的容器,核心区别是可变性

  • 列表:类似 "散装辣条",元素可修改、新增、删除(可变容器);
  • 元组:类似 "包装辣条",元素在创建时固定,无法修改(不可变容器)。
2.2列表的基础操作
  1. 创建列表
    • 空列表:alist = []alist = list()
    • 带初始值:alist = [1, 2, 3],支持不同类型元素 (如[1, 'hello', True])。

2.访问元素(下标)

  • 下标从 0 开始,通过alist[下标]读取 / 修改元素(如alist[2]对应第 3 个元素);
  • 下标越界会报IndexError,有效范围是[0, len(alist)-1]len()可获取列表长度);
  • 支持负下标(如alist[-1]表示倒数第 1 个元素)。
2.3列表的进阶操作

通过下标操作是一次取出里面第一个元素.

通过切片, 则是一次取出一组连续的元素, 相当于得到一个子列表

1.切片 :通过[起始:结束:步长]获取连续子列表,规则:

  • 区间是前闭后开 (如[1:3]取下标 1、2 的元素);
  • 可省略边界([1:]取到末尾,[:-1]取到倒数第 2 个);
  • 步长可正(正向取)、负(反向取),越界不报错。
  • 切片操作中可以省略前后边界
  • 切片操作还可以指定 "步长" , 也就是 "每访问一个元素后, 下标自增几步"
  • 切片操作指定的步长还可以是负数, 此时是从后往前进行取元素. 表示 "每访问一个元素之后, 下标自 减几步"
  • 如果切片中填写的数字越界了, 不会有负面效果. 只会尽可能的把满足条件的元素过去到

2.遍历

  • 也可以使用 for 按照范围生成下标, 按下标访问
  • 还可以使用 while 循环. 手动控制下标的变化

3.新增元素:

  • 使用 append 方法, 向列表末尾插入一个元素(尾插).
  • 使用 insert 方法, 向任意位置插入一个元素

insert 第一个参数表示要插入元素的下标.

4.查找元素
  • 使用 in 操作符, 判定元素是否在列表中存在. 返回值是布尔类型.
  • 使用 index 方法, 查找元素在列表中的下标. 返回值是一个整数. 如果元素不存在, 则会抛出异常.
5.删除元素
  • 使用 pop 方法删除最末尾元素
  • pop 也能按照下标来删除元素
  • 使用 remove 方法, 按照值删除元素.

6.连接列表

  • 使用 + 能够把两个列表拼接在一起.

此处的 + 结果会生成一个新的列表. 而不会影响到旧列表的内容.

  • 使用 extend 方法, 相当于把一个列表拼接到另一个列表的后面.

a.extend(b) , 是把 b 中的内容拼接到 a 的末尾. 不会修改 b, 但是会修改 a.

2.4元组的核心特性
  • 定义 :用()表示,功能与列表类似,但元素不可修改
  • 支持操作 :仅支持读操作 (下标、切片、遍历、inindex+),不支持写操作(修改、增删);
  • 优势
    1. 数据安全(避免函数乱改数据);
    2. 可作为字典的键(列表不可,因字典键需为不可变对象);
  • 应用场景:函数多返回值默认是元组。
2.5列表与元组的选择
  • 元素需修改→选列表;
  • 元素无需修改→选元组(更安全、支持字典键)。
相关推荐
流星蝴蝶没有剑2 分钟前
CoPaw Agent 对接 Python 客户端开发指南:实现流式响应与实时打印
开发语言·python
咬_咬10 分钟前
go语言学习(数组与切片)
开发语言·学习·golang·数组·切片
小陈工12 分钟前
Python Web开发入门(十八):跨域问题解决方案——从“为什么我的请求被拦了“到“我让浏览器乖乖听话“
开发语言·python·机器学习·架构·数据挖掘·回归·状态模式
Chef_Chen13 分钟前
Agent学习--LLM--推理熵
人工智能·学习·机器学习
ECT-OS-JiuHuaShan17 分钟前
科学的本来意义,是基于规范的共识逻辑,而非共识方法
人工智能·科技·学习·算法·生活
赵优秀一一18 分钟前
Python 工程化基础1:环境(conda)、pip、requirements.txt
linux·开发语言·python
kaizq19 分钟前
Python-Nacos电商订单分布微服系统开发
python·nacos·分布微服务·ai-ima-glm·电商订单
知识分享小能手27 分钟前
MongoDB入门学习教程,从入门到精通,MongoDB的了解应用程序的动态(18)
数据库·学习·mongodb
kishu_iOS&AI32 分钟前
机器学习 —— 线性回归(实例)
人工智能·python·机器学习·线性回归
CheerWWW37 分钟前
C++学习笔记——函数指针、Lambda表达式、谨慎使用using namespace std、命名空间
c++·笔记·学习