在Python编程中,函数、列表、元组、字典和文件操作是最基础也是最常用的知识模块。很多初学者学完每个知识点后,却难以在实际代码中灵活组合使用。本文将从函数定义开始,逐步深入到参数、返回值、变量作用域、递归,再到列表、元组、字典的增删改查,最后讲解文件读写操作,并通过一个综合示例串联这些内容。
一、函数:封装重复代码
在没有函数时,如果我们要计算多个不同区间的整数和,可能需要反复写类似的for循环。例如计算1-100、300-400、1-1000的和,每段代码几乎相同,只是起始值和终止值不同。这种重复代码不仅冗余,而且修改时容易遗漏。
函数可以把重复逻辑封装起来,起个名字,以后直接调用。Python定义函数的基本格式是:- def 函数名(参数列表):
- 函数体
- return 返回值
复制代码
例如:- def say_hello():
- print("hello")
- say_hello()
复制代码
注意:定义函数本身不会执行函数体,只有调用时才会执行。
二、函数参数与返回值
参数让函数处理不同数据。形参是定义时括号里的变量名,实参是调用时传入的具体值。- def calc_sum(beg, end):
- total = 0
- for i in range(beg, end + 1):
- total += i
- return total
- print(calc_sum(1, 100))
复制代码
参数个数必须匹配,否则报错。Python是动态类型语言,参数不需要声明类型,但开发者需要清楚函数期望接收什么类型。
返回值是函数的输出。建议函数只负责计算逻辑,把结果交给调用者处理(打印、写入文件等),遵循“低耦合,高内聚”原则。- def calc_sum(beg, end):
- total = 0
- for i in range(beg, end + 1):
- total += i
- return total
- result = calc_sum(1, 100)
- print(result)
复制代码
return会立即结束函数。Python函数可以返回多个值,本质上是返回一个元组。- def get_point():
- x = 10
- y = 20
- return x, y
- a, b = get_point()
- print(a, b) # 10 20
复制代码
三、变量作用域与global
函数内部定义的变量是局部变量,只在函数内有效,外部无法直接访问。定义在函数外部的变量是全局变量。如果在函数内需要修改全局变量,必须使用global声明。- x = 20
- def test():
- global x
- x = 10
- test()
- print(x) # 10
复制代码
但大量使用global不利于维护,建议通过参数和返回值传递数据。
四、递归:函数调用自己
递归适用于天然递归的问题,如阶乘、树遍历等。写递归必须有结束条件,且每次递归都要向结束条件靠近。- def factor(n):
- if n == 1:
- return 1
- return n * factor(n - 1)
- print(factor(5)) # 120
复制代码
递归代码简洁,但理解成本高,深度过大可能导致栈溢出。能用循环解决的问题优先用循环。
五、默认参数与关键字参数
默认参数在定义时指定默认值,须放在参数列表末尾。- def add(x, y, debug=False):
- if debug:
- print(f"调试:x={x}, y={y}")
- return x + y
- print(add(10, 20)) # 30
- print(add(10, 20, True)) # 30 并打印调试信息
复制代码
关键字参数在调用时显式指定参数名,顺序可调,提高可读性。- def test(x, y):
- print(x, y)
- test(y=100, x=200)
复制代码
六、列表:可变序列
列表用方括号[]创建,可保存多个元素,甚至不同类型,但通常存放同类数据。- alist = [1, 2, 3, 4]
- print(alist[0]) # 下标从0开始
- alist[2] = 100 # 修改
- print(len(alist)) # 长度
复制代码
切片操作一次取出一段列表,前闭后开。- print(alist[1:3]) # [2, 3]
- print(alist[::-1]) # 反转列表
复制代码
遍历列表常用for循环:- for elem in alist:
- print(elem)
- for i, elem in enumerate(alist):
- print(i, elem) # 同时获取下标和元素
复制代码
列表常见操作:- alist.append(4) # 尾插
- alist.insert(1, "hello") # 指定位置插入
- print(2 in alist) # 判断存在
- index = alist.index(3) # 查找下标(不存在报错)
- alist.pop() # 删除最后一个
- alist.pop(2) # 按下标删除
- alist.remove(2) # 按值删除
- c = a + b # 连接生成新列表
- a.extend(b) # 在原列表后追加
复制代码
七、元组:不可变的序列
元组用圆括号()创建,创建后不能修改(增、删、改都不支持)。支持读操作,如下标、切片、遍历。- atuple = (1, 2, 3)
- print(atuple[0]) # 1
- for elem in atuple:
- print(elem)
复制代码
元组适用于固定数据组合,如坐标、函数多返回值。列表可变,元组不可变,根据需求选择。
八、字典:键值对存储
字典用花括号{}创建,每个元素是key: value对。key通常是不可变类型(如字符串、数字、元组),不能是列表等可变对象。- student = {
- "id": 1,
- "name": "zhangsan",
- "score": 90
- }
- # 判断key是否存在
- print("id" in student)
- # 获取值,不存在报错
- print(student["name"])
- # 更安全使用get,可指定默认值
- print(student.get("score", 0))
- # 新增或修改
- student["grade"] = "A" # key不存在则新增
- student["score"] = 100 # key存在则修改
- # 删除
- student.pop("score")
- # 遍历
- for key in student:
- print(key, student[key])
- for key, value in student.items():
- print(key, value)
复制代码
字典依赖哈希表,因此key必须可哈希,即不可变。元组可作为key,列表不行。
九、文件操作:持久化数据
内存中的数据程序结束即消失,文件可以把数据保存到硬盘。文件操作三步走:打开、读写、关闭。
路径写法:推荐使用斜杠/或双反斜杠\\。绝对路径从盘符开始,相对路径相对于当前工作目录。
打开文件用open(),模式包括:
- "r":读(文件必须存在)
- "w":写(覆盖原有内容,文件不存在则创建)
- "a":追加(在末尾写入)
- "rb" / "wb":二进制读写
建议使用with语句自动关闭文件:- # 写文件
- with open("D:/test.txt", "w", encoding="utf-8") as f:
- f.write("hello Python\n")
- # 追加
- with open("D:/test.txt", "a", encoding="utf-8") as f:
- f.write("追加一行\n")
- # 读全部
- with open("D:/test.txt", "r", encoding="utf-8") as f:
- content = f.read()
- print(content)
- # 逐行读取
- with open("D:/test.txt", "r", encoding="utf-8") as f:
- for line in f:
- print(line, end="")
复制代码
读大文件时,用for循环逐行读取比read()一次性全部读入更省内存。
十、综合练习:统计平均分
将函数、列表、字典结合,计算学生成绩平均分。- students = [
- {"name": "张三", "score": 80},
- {"name": "李四", "score": 95},
- {"name": "王五", "score": 70}
- ]
- def calc_average(students):
- total = 0
- for s in students:
- total += s["score"]
- return total / len(students)
- avg = calc_average(students)
- print(f"平均分:{avg}")
复制代码
通过这个例子可以看到,函数封装计算逻辑,列表保存多个学生字典,字典存储每个学生的属性。这种组合是Python项目中非常常见的模式。
掌握以上基础后,你可以更高效地编写Python脚本,处理数据、读写配置文件、构建自动化任务等。 |