Python 入门必吃透:函数、列表与元组核心用法(附实战案例)

Python 入门必吃透:函数、列表与元组核心用法(附实战案例)
在这里插入图片描述

🔥草莓熊Lotso:个人主页
❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!


🎬 博主简介:

在这里插入图片描述

文章目录


前言:

作为 Python 初学者,掌握函数列表元组是从 “写代码” 到 “写好代码” 的关键一步。它们不仅是 Python 语法的核心,更是后续处理复杂数据、构建高效程序的基础。今天这篇文章,就结合入门实战案例,把这三个知识点讲透,新手也能一看就会、一用就通。

一. 函数:告别重复代码的 “代码工厂”

1.1 为什么需要函数?

写代码最忌讳的就是 “复制粘贴”。比如计算不同区间的数列和(1-100、300-400、1-1000),如果不使用函数,需要重复写多组几乎一样的循环代码:

# 1. 计算 1-100 的和 theSum =0for i inrange(1,101): theSum = theSum + i print(theSum)# 2. 计算 300-400 的求和 theSum =0for i inrange(300,401): theSum = theSum + i print(theSum)# 计算 1-1000 的和 theSum =0for i inrange(1,1001): theSum = theSum + i print(theSum)

一旦需要修改计算逻辑(比如改成求平方和),所有重复代码都要改,效率极低。而函数的核心作用,就是提取重复代码,实现代码复用,让程序更简洁、更好维护。

简单理解:函数就像一个 “工厂”,输入 “原材料”(参数),经过内部加工(函数体),输出 “产品”(返回值),一次定义,多次调用。

函数版本代码

# 使用函数的方式来解决刚刚的问题# 定义一个求和函数defcalcSum(begin,end): theSum =0for i inrange(begin,end+1): theSum = theSum + i print(theSum)# 使用函数# 求 1-100 的和 calcSum(1,100)# 求 300-400 的和 calcSum(300,400)# 求 1-1000 的和 calcSum(1,1000)
在这里插入图片描述

1.2 函数的核心语法(重点)

(1)函数定义与调用

# 1. 定义函数:def 函数名(形参列表): 函数体 return 返回值defcalcsum(beg, end):# beg、end是“形式参数”(形参),相当于工厂的“原材料入口”sum=0for i inrange(beg, end +1):sum+= i returnsum# return 输出结果,相当于工厂的“产品出口”# 2. 调用函数:函数名(实参列表) result1 = calcsum(1,100)# 1、100是“实际参数”(实参),是真正传入的原材料 result2 = calcsum(300,400)print(result1, result2)# 输出:5050 35150
deftest(a,b,c):print(a,b,c)# 实参个数不能多也不能少,除非形参有默认参数 test(10,20,30)

⚠️ 关键注意点

  • 函数必须先定义,再调用(就像动漫里“先喊招式名,再释放技能”),否则会报 NameError
  • 定义函数时不会执行函数体,只要调用时才会执行,调用几次就执行几次;
  • 形参和实参的个数必须匹配(比如定义时 2 个形参,调用时就必须传 2 个实参),否则报 TypeError

(2) 函数参数的灵活用法
Python 的函数参数比C++,Java更灵活,核心有 3 个特性:

1. 动态类型:形参无需指定类型,一个函数可接收多种类型参数

defprint_param(a):print(a) print_param(10)# 整数 print_param("hello")# 字符串 print_param(True)# 布尔值(均能正常执行)
defadd(x,y):return x+y print(add(10,20))print(add(1.5,2.5))print(add('hello','world'))# # 这个就肯定不行了.不符合函数体内执行逻辑# print(add(10,'hello'))

2. 参数默认值:给形参指针默认值,调用时可省略该参数(默认值参数必须在无默认值参数后面)

# 计算两数之和,默认不打印调试信息defadd(x, y, debug=False):if debug:print(f"调试:x={x}, y={y}")return x + y print(add(10,20))# 省略debug,使用默认值Falseprint(add(10,20,True))# 显式传参,打印调试信息

3. 关键字参数:调用时显示指定“实参对应哪个形参”,可打乱传参顺序

deftest(x,y):print(f"x = {x}")print(f"y = {y}")# 关键字参数,顺序无关,输出: x = 10,y = 20; test(x =10,y =20) test(y =100,x =200) test(100,y =200)# 这样写就不行了# test(x = 100,200)

(3) 函数返回值
返回值是函数的 “输出”,核心用法有两点:

1. 一个函数可以有多个 return 语句,执行到 return 时函数立刻结束(后续代码不执行)

# 这种情况不算是有多个 return 语句# def tes():# return 1# return 2# 一般情况下多个 return 语句是搭配 分支语句/循环语句 的# 用来判断 num 是不是奇数defisOdd(num):if num %2==0:returnFalseelse:returnTrueprint(isOdd(10))print(isOdd(19))

2. 一次返回多个值:用逗号分隔,接收时用多个变量接收(无需接收的用 _ 忽略)

# 写一个函数, 返回平面上的一个点# 横坐标,纵坐标defgetPoint(): x =10 y =20return x,y # 可以返回两个值# a,b = getPoint() # 接收所有返回值# 如果只想用其中一个可以使用 _ 占位# _,b=getPoint() # 忽略x,只接收y

(4) 变量作用域

变量的作用域决定了 “变量能在哪些地方使用”,核心规则:

  • 局部变量:函数内部定义的变量,仅在函数内部生效(出了函数就失效);
  • 全局变量:函数外部定义的变量,函数内部可访问,但 修改时需要用global 声明;
  • 同名变量:不同作用域可存在同名变量(本质是不同变量,互不影响)
x =10deftest(): x =20print(f'函数内部:{x}') test()print(f'函数外部:{x}')
x =10# 全局变量在函数里也可以使用# def test():# print(f'x = {x}')## test()# 使用这个函数,把全局变量 x 给改成 20!deftest():global x x =20 test()print(f'x = {x}')

1.3 函数的进阶用法(嵌套 + 递归)

(1)链式调用:把一个函数的返回值,作为另一个函数的参数

defisOdd(num):if num %2==0:returnFalsereturnTruedefadd(x,y):return x+y # result = isOdd(10)# print(result)#print(isOdd((add(5,5))))

(2)嵌套调用:函数内部调用其他函数(包括自身)

deftest():print("hello") test()# 嵌套调用可以有很多层defa(): num =10print("函数 a")defb(): num =20 a()print("函数 b")defc(): num =30 b()print("函数 c")defd(): num =40 c()print("函数 d") d()

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

  • 可以通过 PyCharm 调试器看到函数调用栈和栈帧。
  • 在调试状态下,PyCharm 左下角一般就会显示出函数调用栈。
在这里插入图片描述


在这里插入图片描述

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

思考:上述代码,a,b,c,d 函数中的局部变量名各不相同,如果变量名是相同的,比如都是 num,那么这四个函数中的 num 是属于同一个变量,还是不同变量呢? – 不同变量

(3)递归调用:函数调用自身(慎用!)

递归是嵌套调用的特使情况,核心是"有结束条件 + 每次逼近结束条件",否则会无限递归导致 RecursionError

案例:递归计算 5 的阶乘 (5! = 5 * 4 * 3 * 2 * 1)

# 写一个函数,来求 n 的阶乘(n是正整数)# def factor(n):# result = 1# for i in range(1,n+1):# result *= i# return result# 递归# n! => n * (n-1)!# 1! => 1deffactor(n):if n ==1:return1return n * factor(n -1)print(factor(5))
  • 务必存在递归结束条件,比如 if n == 1 就是结束条件。当 n 为 1 的时候,递归就结束了。
  • 每次递归的时候,要保证函数的实参是逐渐逼近结束条件的。

⚠️ 注意:递归代码简洁但难理解,易栈溢出,实际开发中优先用循环替代。

1.4 函数核心小结

掌握 3 点,搞定 Python 函数:

  • 定义def 函数名(形参):函数体 return 返回值
  • 调用:函数名(实参),支持默认值,关键字参数;
  • 核心价值:复用代码,拆分逻辑,让程序更容易维护。

二. 列表和元组:批量存储数据的 “容器”

当需要存储多个数据(比如10个学生的成绩,20个城市名)时,单独定义多个变量不现实,此时就需要列表(list)和元组(tuple)—— 它们是 Python 中最常用的 “序列类型”,专门用来批量存储数据。

核心区别(一句话记牢):

  • 列表(list):可变容器(像 “散装辣条”),元素可增删改;
  • 元组(tuple):不可变容器(像 “包装辣条”),元素创建后无法修改。

2.1 列表(list):最常用的可变容器

(1)创建列表

两种核心方式,推荐用 [ ] (更简洁)

# 创建列表# 1. 直接使用字面值来创建# [] 就表示一个 空的列表 a =[]print(type(a))# 2. 使用 list() 来创建 b =list()print(type(b))# 3. 可以在创建列表的时候,在[]中指定列表的初始值# 元素之间使用 , 来分割 a =[1,2,3,4]print(a)# 4. 可以在同一个列表里放不同类型的变量 a =[1,'hello',True,[4,5,6]]print(a)

⚠️ 注意:不要用 list 作为变量名(会覆盖内置函数 list()),建议命名为 list1,alist 等。

(2)列表的核心操作(必练)

列表的操作都围绕 “下标” 展开,下标从 0 开始(负数表示倒数,-1 是最后一个元素),核心操作如下:

操作目的代码示例说明
访问元素list3[2]访问下标 2 的元素(list3 [2] = 3),下标越界报 IndexError
修改元素list3[2] = 100把下标 2 的元素改成 100,list3 变成 [1,2,100,4]
切片(取子列表)list3[1:3]取下标 1 到 3(左闭右开)的元素,输出 [2,100]
新增元素list3.append(5)尾插(添加到末尾);list3.insert(1, "a")(插入到下标 1)
删除元素list3.pop()删除末尾元素;list3.pop(2)(删除下标 2 元素);list3.remove(2)(按值删除)
查找元素2 in list3判断元素是否存在(返回布尔值);list3.index(2)(找下标,不存在报异常)
连接列表list3 + list4拼接两个列表(生成新列表);list3.extend(list4)(拼接到 list3 末尾,修改原列表)
遍历元素for elem in list3:直接遍历元素(推荐);也可按下标遍历(for i in range(len(list3))
  • 下标访问
# 5. 使用下标来访问列表元素 a =[1,2,3,4]print(a[2])# 3# 6. 使用下标来修改列表元素 a =[1,2,3,4] a[2]=100print(a)# 7. 超出下标有效范围,就会出现异常# a = [1,2,3,4]# a[100] = 0# print(a)# Traceback (most recent call last):# File "D:\Gitee.code\python-fundamentals-\PythonProject\2025--11--24\code42.py", line 33, in <module># a[100] = 0# ~^^^^^# IndexError: list assignment index out of range# 8. 可以使用内建函数 len 来获取列表的长度(元素个数),和字符串类似 a =[1,2,3,4]print(len(a))# 9. Python 中的下标,其实还可以写成负数!!!# 例如写成 -1,其实等价于 len(a) - 1 a =[1,2,3,4]print(a[len(a)-1])# -1 就是倒数第一个元素print(a[-1])
  • 循环遍历
# 1. 使用 for 循环来遍历列表# 不会改变原来的数组# a = [1,2,3,4,5]# for elem in a:# elem = elem + 10# print(elem)# print(a)# 2. 使用 for 循环遍历,通过下标的方式# 会改变原来的数组# a = [1,2,3,4,5]# for i in range(0,len(a)):# a[i] = a[i] + 10## print(a)# 3. 使用 while 循环,通过下标遍历这个列表 a =[1,2,3,4,5] i =0while i <len(a):print(a[i]) i +=1
  • 增删查改 && 连接等
# 1. 使用 append 往列表末尾新增一个元素# a = [1,2,3,4]# a.append(5)# a.append("hello")# print(a)# b = [5,6,7,8]# b.append("world")# print(b)# 2. 还可以使用 insert 方法,往列表的任意位置来新增元素 a =[1,2,3,4] a.insert(1,"hello") a.insert(100,"hello")# 会在最后插入一个 helloprint(a)
# 1. 使用 in 来判定某个元素是否在列表中存在# a = [1,2,3,4]# print(1 in a)# print(10 in a)# print(1 not in a)# print(10 not in a)# 2. 使用 index 方法,来判定当前元素在列表中的位置,得到一个下标 a =[1,2,3,4]print(a.index(2))print(a.index(3))# print(a.index(10)) # 会报错
# 1. 使用 pop 删除列表中的最末尾的元素 a =[1,2,3,4] a.pop()print(a)# 2. 使用 pop 还能删除任意位置的元素,pop的参数 a =[1,2,3,4] a.pop(1)print(a)# 3. 使用 remove 方法,可以按照值来进行删除 a =["aa","bb","cc","dd"] a.remove("cc")print(a)
# 1. 使用 + 针对两个列表进行拼接# a = [1,2,3,4]# b = [5,6,7,8]# c = b + a# print(c)# c = a + b# print(c)# print(a)# print(b)# 2. 使用 extend 来进行拼接# 这个拼接是把后一个列表的内容拼接到前一个列表里头# a = [1,2,3,4]# b = [5,6,7,8]# c = a.extend(b) # extend 不返回任何内容# a.extend(b)# print(a) # a 这里改变了# print(b)# 3. 使用 += 来进行拼接 a =[1,2,3,4] b =[5,6,7,8] a += b # a = a + bprint(a)print(b)

(3)切片操作的灵活用法(重点)

切片是列表的 “灵魂操作”,支持省略边界、指定步长(正数从左到右,负数从右到左):

# 1. 切片操作的基本使用 a =[1,2,3,4]# 左闭右开区间print(a[1:3])# 2. 使用切片的时候,可以省略边界 a =[1,2,3,4]# 省略右边界,意思是从指定的开始位置,一直取到整个列表结束print(a[1:])# 省略左边界,意思是从列表的 0 号元素开始取,一直取到指定的结束位置print(a[:2])# 此处切边中的下标也可以写成负数print(a[:-1])# 还可以把开始边界和结束边界都省掉,得到的就还是列表本身print(a[:])# 3. 带有步长的切片操作 a =[1,2,3,4,5,6,7,8,9,0]print(a[::1])print(a[::2])print(a[::3])print(a[1:-1:2])# 4. 步长的数值还可以是负数,当步长为负数的时候,意思是从后往前来取元素 a =[1,2,3,4,5,6,7,8,9,0]print(a[::-1])print(a[::-2])# 5. 当切片中的范围超出有效下标之后,不会出现异常!,而是尽可能的把符合要求的元素给获取到 a =[1,2,3,4,5,6,7,8,9,0]print(a[1:100])

2.2 元组(tuple):不可变的序列容器

元组的用法和列表几乎一致,但核心区别是"不可变"(元素无法增删改),适合存储不需要修改的数据(比如身份证号,坐标)。

(1)创建元组

()表示,空元组用()tuple(),注意单个元素的元组要加逗号(避免被当作普通括号):

# 1. 创建元组 a =()print(type(a)) b =tuple()print(type(b))# 2. 创建元组的时候,指定初始值 a =(1,2,3,4)print(a)# 3. 元组中的元素也可以是任意类型的 a =(1,2,'hello',True,[])print(a)

(2)元组的核心操作

  • 支持的操作(和列表一致):访问下标、切片、遍历、in判断、index查找、+拼接;
  • 不支持的操作(因为不可变):修改元素、append/insert/pop/remove/extend
# 4. 通过下标来访问元组中的元素,下标也是从 0 开始,到 len - 1 结束 a =(1,2,3,4)print(a[1])print(a[-1])# print(a[100]) # 错误# 5. 通过切片来获取元组的一部分 a =[1,2,3,4]print(a[1:3])# 6. 也同样可以使用 for 循环等方式来进行遍历元素 a =(1,2,3,4)for elem in a:print(elem)# 7. 可以使用 in 来判断元素是否存在,使用 index 查找元素的下标 a =(1,2,3,4)print(3in a)print(a.index(3))# 8. 可以使用 + 来拼接两个元组 a =(1,2,3) b =(4,5,6)print(a + b)# 9. 元组只支持 “读” 操作,不能支持 “修改” 操作 a =(1,2,3,4)# 不支持以下修改的操作# a[0] = 100# a.append(5)# a.pop()# a.extend()# 10. 当进行多元赋值的时候,其实本质上是按照元组的方式来进行工作的,defgetPoint(): x =10 y =20return x,y x,y = getPoint()print(type(getPoint()))

(3)为什么有了列表,还需要元组?

  • 安全性: 传递数据时,用元组可避免数据被意外修改(比如传给一个未知函数,元组更安全);
  • 可作为字典的键: 后续要学的字典,键必须是 “可哈希对象”(不可变类型),元组可以,列表不行。

补充

在这里插入图片描述

2.3 列表的元组小结

特性列表(list)元组(tuple)
定义方式[]list()()tuple()
是否可变可变(增删改)不可变(无增删改)
适用场景需频繁修改数据(比如学生成绩)数据无需修改(比如身份证号)
核心操作支持所有序列操作 + 增删改仅支持读操作,无写操作
  • 列表和元组都是日常开发中最常用到的类型,最核心的操作就是根据 [ ] 来按下标操作。
  • 在需要表示一个 “序列” 的场景下,就可以考虑使用列表和元组。
  • 如果元素不需要改变,则优先考虑元组。
  • 如果元素需要改变,则优先考虑列表。

结尾:

🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点: 👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长 ❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量 ⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用 💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑 🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解 技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标! 

结语:不知不觉这篇 Python 相关的分享就到尾声啦~ 作为一门灵活又实用的语言,Python 的魅力从来都藏在 “上手易、场景广” 里 —— 不管是入门时的语法摸索,还是实战中的问题拆解,每一次代码跑通的瞬间,都是对 “实践出真知” 的最好印证。如果这篇内容帮你理清了某个知识点,或是给你的项目开发带来了一点启发,欢迎在评论区交流你的心得或疑问~ 后续会持续分享 Python 进阶技巧、实战案例等干货,从基础夯实到场景落地,陪大家一起在编程路上少踩坑、多收获!
编程之路漫漫,但热爱可抵岁月漫长~ 咱们下篇博客见!

✨把这些内容吃透超牛的!放松下吧✨ʕ˘ᴥ˘ʔづきらど

Read more

02-mcp-server案例分享-Excel 表格秒变可视化图表 HTML 报告,就这么简单

02-mcp-server案例分享-Excel 表格秒变可视化图表 HTML 报告,就这么简单

1.前言 MCP Server(模型上下文协议服务器)是一种基于模型上下文协议(Model Context Protocol,简称MCP)构建的轻量级服务程序,旨在实现大型语言模型(LLM)与外部资源之间的高效、安全连接。MCP协议由Anthropic公司于2024年11月开源,其核心目标是解决AI应用中数据分散、接口不统一等问题,为开发者提供标准化的接口,使AI模型能够灵活访问本地资源和远程服务,从而提升AI助手的响应质量和工作效率。 MCP Server 的架构与工作原理 MCP Server 采用客户端-服务器(Client-Server)架构,其中客户端(MCP Client)负责与服务器建立连接,发起请求,而服务器端则处理请求并返回响应。这种架构确保了数据交互的高效性与安全性。例如,客户端可以向服务器发送请求,如“查询数据库中的某个记录”或“调用某个API”,而服务器则根据请求类型,调用相应的资源或工具,完成任务并返回结果。 MCP Server 支持动态发现和实时更新机制。例如,当新的资源或工具被添加到服务器时,

By Ne0inhk
将现有 REST API 转换为 MCP Server工具 -higress

将现有 REST API 转换为 MCP Server工具 -higress

Higress 是一款云原生 API 网关,集成了流量网关、微服务网关、安全网关和 AI 网关的功能。 它基于 Istio 和 Envoy 开发,支持使用 Go/Rust/JS 等语言编写 Wasm 插件。 提供了数十个通用插件和开箱即用的控制台。 Higress AI 网关支持多种 AI 服务提供商,如 OpenAI、DeepSeek、通义千问等,并具备令牌限流、消费者鉴权、WAF 防护、语义缓存等功能。 MCP Server 插件配置 higress 功能说明 * mcp-server 插件基于 Model Context Protocol (MCP),专为 AI 助手设计,

By Ne0inhk
MCP 工具速成:npx vs. uvx 全流程安装指南

MCP 工具速成:npx vs. uvx 全流程安装指南

在现代 AI 开发中,Model Context Protocol(MCP)允许通过外部进程扩展模型能力,而 npx(Node.js 生态)和 uvx(Python 生态)则是两种即装即用的客户端工具,帮助你快速下载并运行 MCP 服务器或工具包,无需全局安装。本文将从原理和对比入手,提供面向 Windows、macOS、Linux 的详细安装、验证及使用示例,确保你能在本地或 CI/CD 流程中无缝集成 MCP 服务器。 1. 工具简介 1.1 npx(Node.js/npm) npx 是 npm CLI(≥v5.2.0)

By Ne0inhk
解锁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