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


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


🎬 博主简介:


文章目录

  • 前言:
  • [一. 函数:告别重复代码的 "代码工厂"](#一. 函数:告别重复代码的 “代码工厂”)
    • [1.1 为什么需要函数?](#1.1 为什么需要函数?)
    • [1.2 函数的核心语法(重点)](#1.2 函数的核心语法(重点))
    • [1.3 函数的进阶用法(嵌套 + 递归)](#1.3 函数的进阶用法(嵌套 + 递归))
    • [1.4 函数核心小结](#1.4 函数核心小结)
  • [二. 列表和元组:批量存储数据的 "容器"](#二. 列表和元组:批量存储数据的 “容器”)
    • [2.1 列表(list):最常用的可变容器](#2.1 列表(list):最常用的可变容器)
    • [2.2 元组(tuple):不可变的序列容器](#2.2 元组(tuple):不可变的序列容器)
    • [2.3 列表的元组小结](#2.3 列表的元组小结)
  • 结尾:

前言:

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


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

1.1 为什么需要函数?

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

python 复制代码
# 1. 计算 1-100 的和
theSum = 0
for i in range(1,101):
    theSum = theSum + i
print(theSum)

# 2. 计算 300-400 的求和
theSum = 0
for i in range(300,401):
    theSum = theSum + i
print(theSum)

# 计算 1-1000 的和
theSum = 0
for i in range(1,1001):
    theSum = theSum + i
print(theSum)

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

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

函数版本代码

python 复制代码
# 使用函数的方式来解决刚刚的问题

# 定义一个求和函数
def calcSum(begin,end):
    theSum = 0
    for i in range(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)函数定义与调用

python 复制代码
# 1. 定义函数:def 函数名(形参列表): 函数体 return 返回值
def calcsum(beg, end):  # beg、end是"形式参数"(形参),相当于工厂的"原材料入口"
    sum = 0
    for i in range(beg, end + 1):
        sum += i
    return sum  # return 输出结果,相当于工厂的"产品出口"

# 2. 调用函数:函数名(实参列表)
result1 = calcsum(1, 100)  # 1、100是"实际参数"(实参),是真正传入的原材料
result2 = calcsum(300, 400)
print(result1, result2)  # 输出:5050 35150
python 复制代码
def test(a,b,c):
    print(a,b,c)

# 实参个数不能多也不能少,除非形参有默认参数
test(10,20,30)

⚠️ 关键注意点

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

(2) 函数参数的灵活用法

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

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

python 复制代码
def print_param(a):
    print(a)
print_param(10)    # 整数
print_param("hello")# 字符串
print_param(True)   # 布尔值(均能正常执行)
python 复制代码
def add(x,y):
    return x+y

print(add(10,20))
print(add(1.5,2.5))
print(add('hello','world'))
# # 这个就肯定不行了.不符合函数体内执行逻辑
# print(add(10,'hello'))

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

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

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

python 复制代码
def test(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 时函数立刻结束(后续代码不执行)

python 复制代码
# 这种情况不算是有多个 return 语句
# def tes():
#     return 1
#     return 2

# 一般情况下多个 return 语句是搭配 分支语句/循环语句 的
# 用来判断 num 是不是奇数
def isOdd(num):
    if num % 2 == 0:
        return False
    else:
        return True

print(isOdd(10))
print(isOdd(19))

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

python 复制代码
# 写一个函数, 返回平面上的一个点
# 横坐标,纵坐标
def getPoint():
    x = 10
    y = 20
    return x,y

# 可以返回两个值
# a,b = getPoint()  # 接收所有返回值
# 如果只想用其中一个可以使用 _ 占位
# _,b=getPoint()    # 忽略x,只接收y

(4) 变量作用域

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

  • 局部变量:函数内部定义的变量,仅在函数内部生效(出了函数就失效);
  • 全局变量 :函数外部定义的变量,函数内部可访问,但 修改时需要用global 声明;
  • 同名变量:不同作用域可存在同名变量(本质是不同变量,互不影响)
python 复制代码
x = 10

def test():
    x = 20
    print(f'函数内部:{x}')

test()
print(f'函数外部:{x}')
python 复制代码
x = 10

# 全局变量在函数里也可以使用
# def test():
#     print(f'x = {x}')
#
# test()

# 使用这个函数,把全局变量 x 给改成 20!
def test():
    global x
    x = 20

test()
print(f'x = {x}')

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

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

python 复制代码
def isOdd(num):
    if num % 2 == 0:
        return False
    return True


def add(x,y):
    return x+y

# result = isOdd(10)
# print(result)
#
print(isOdd((add(5,5))))

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

python 复制代码
def test():
    print("hello")


test()

# 嵌套调用可以有很多层

def a():
    num = 10
    print("函数 a")


def b():
    num = 20
    a()
    print("函数 b")

def c():
    num = 30
    b()
    print("函数 c")

def d():
    num = 40
    c()
    print("函数 d")

d()

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

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


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

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

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

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

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

python 复制代码
# 写一个函数,来求 n 的阶乘(n是正整数)

# def factor(n):
#     result = 1
#     for i in range(1,n+1):
#         result *= i
#     return result

# 递归
# n! => n * (n-1)!
# 1! => 1

def factor(n):
    if n == 1:
        return 1
    return 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)创建列表

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

python 复制代码
# 创建列表
# 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))
  • 下标访问
python 复制代码
# 5. 使用下标来访问列表元素
a = [1,2,3,4]
print(a[2]) # 3

# 6. 使用下标来修改列表元素
a = [1,2,3,4]
a[2] = 100
print(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])
  • 循环遍历
python 复制代码
# 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 = 0
while i < len(a):
    print(a[i])
    i += 1
  • 增删查改 && 连接等
python 复制代码
# 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") # 会在最后插入一个 hello
print(a)
python 复制代码
# 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)) # 会报错
python 复制代码
# 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)
python 复制代码
# 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 + b
print(a)
print(b)

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

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

python 复制代码
# 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(),注意单个元素的元组要加逗号(避免被当作普通括号):

python 复制代码
# 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
python 复制代码
# 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(3 in 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. 当进行多元赋值的时候,其实本质上是按照元组的方式来进行工作的,
def getPoint():
    x = 10
    y = 20
    return x,y

x,y = getPoint()
print(type(getPoint()))

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

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

补充

2.3 列表的元组小结

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

结尾:

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

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

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

相关推荐
fthux12 小时前
RenoPit 能为普通业主做什么?看懂图纸、审查合同,提前发现装修坑
javascript·人工智能·ai·开源·github·chrome扩展·open source·edge扩展·firefox扩展
程序员小崔日记14 小时前
20块钱注册一年 .COM 域名!Spaceship 最新优惠教程,支付宝即可付款(附优惠码)
服务器·腾讯云·域名
火山引擎开发者社区14 小时前
火山引擎混合云 veStack 智算平台 Day0 适配 Kimi K3
人工智能
RSABLOCKCHAIN15 小时前
AI Agents in LangGraph-2
人工智能·python
晓子文集15 小时前
Tushare接口文档:期货日线行情(fut_daily)
大数据·数据库·金融数据·量化投资·tushare
实心儿儿15 小时前
Linux —— 进程间关系和守护进程
linux·运维·服务器
cd_9492172115 小时前
哪些AI工具适合生成游戏开发用的3D道具模型?从道具草稿到引擎测试的选择方法
人工智能·3d
FII工业富联科技服务15 小时前
工业设备运维如何Agentic化?拆解Factory Brain的设备运维架构
大数据·运维·人工智能·架构·制造
WA内核拾荒者15 小时前
WhatsApp 账号异常检测的自动化告警系统设计
数据库·python·自动化
糖果店的幽灵15 小时前
人已经用 WorkBuddy 找工作拿了面试,你还在一份份手工改简历
人工智能·面试·职场和发展·langgraph