嘿,朋友,又见面了!昨天我们打了地基,今天要开始搭房子的骨架了。如果你昨天认真敲了代码,现在应该已经能用Python做简单的输入输出和判断循环了。今天我们要接触一些真正让Python变得强大的东西:数据结构和函数。这些概念听起来有点唬人,但其实它们就是你身边常见的东西——比如购物清单、通讯录、菜谱。准备好了吗?我们开搞!
复习一下
还记得昨天我们怎么让程序跟你打招呼的吗?用变量存名字,用input获取输入,用if判断年龄。今天我们会在这些基础上,把数据组织得更优雅。比如,如果你要管理一个班级的学生成绩,用单独的变量 score1, score2... 会累死,这时候就需要列表出马了。
列表(List):能装东西的“购物车”
列表是Python里最常用的数据结构。你可以把它想象成一个超级购物车,什么都能往里放:数字、字符串,甚至其他列表。定义列表用方括号 [],元素之间用逗号隔开。
python
scores =[98,76,85,92,67]names =["小明","小红","小刚"]mixed =["hello",42,True,3.14]
访问列表元素
列表里的每个元素都有一个位置,叫索引。注意,Python的索引从0开始,所以第一个元素是 scores[0],第二个是 scores[1],以此类推。你也可以用负数索引,-1 表示最后一个,-2 表示倒数第二个。
python
print(scores[0])# 98print(names[-1])# "小刚"
切片(Slicing)
一次性拿多个元素?切片搞定。格式是 列表[开始:结束],注意结束位置不包含在内。
python
print(scores[1:3])# [76, 85] (从索引1到2,不包括3)print(scores[:2])# [98, 76] (从头到索引1)print(scores[3:])# [92, 67] (从索引3到最后)
修改列表
列表是“可变的”,也就是说你可以随时增删改:
python
# 修改scores[2]=88# 把85改成88# 添加scores.append(100)# 在末尾加一个scores.insert(0,100)# 在索引0处插入100# 删除scores.remove(92)# 删除第一个值为92的元素popped = scores.pop()# 删除最后一个元素,并返回它del scores[0]# 删除索引0的元素
列表推导式(List Comprehension)
这是Python的特色语法,让你用一行代码生成列表。比如,要生成0到9的平方:
python
squares =[x**2for x inrange(10)]print(squares)# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
甚至可以加条件:[x**2 for x in range(10) if x % 2 == 0] 只取偶数的平方。酷不酷?
元组(Tuple):不可变的“固定套餐”
元组跟列表几乎一样,但它用圆括号 () 定义,而且不可变——一旦创建,就不能修改。这有点像快餐店的固定套餐,你不能把汉堡换成鸡翅。
python
colors =("red","green","blue")print(colors[0])# "red"# colors[0] = "yellow" # 报错!元组不支持修改那什么时候用元组?当你希望数据不会被意外修改时,比如坐标 (x, y),或者作为字典的键(列表不能做键,元组可以)。
字典(Dictionary):你的通讯录
字典是一种键值对的数据结构,就像通讯录:名字(键)对应电话号码(值)。用花括号 {} 定义,键和值用冒号分隔。
python
phonebook ={"小明":"13800138000","小红":"13912345678","老师":"110"}访问和修改
通过键来访问值,就像查字典:
python
print(phonebook["小明"])# 13800138000phonebook["小明"]="10086"# 修改phonebook["小刚"]="120"# 添加新条目
如果你不确定键是否存在,可以用 get 方法,不存在时返回None或你指定的默认值:
python
print(phonebook.get("小刚"))# 120print(phonebook.get("校长","未知"))# 未知遍历字典
经常需要把字典里的东西都拿出来看看:
python
for name in phonebook:print(name, phonebook[name])# 或者更优雅的 items() 方法for name, number in phonebook.items():print(name,"->", number)
还有 keys() 获取所有键,values() 获取所有值。
集合(Set):去重小能手
集合就像数学里的集合,元素无序且不重复。用花括号或 set() 函数创建。
python
fruits ={"apple","banana","orange","apple"}# 重复的apple会被自动去重print(fruits)# {'banana', 'orange', 'apple'} (顺序可能不同)集合最常用的就是去重和集合运算(交集、并集、差集):
python
a ={1,2,3,4}b ={3,4,5,6}print(a & b)# 交集 {3, 4}print(a | b)# 并集 {1, 2, 3, 4, 5, 6}print(a - b)# 差集 {1, 2}
函数(Function):把你的代码打包成“工具”
函数就是把一段代码打包起来,起个名字,以后想用的时候直接调用。避免重复写同样的代码。
定义函数
用 def 关键字:
python
defgreet(name):"""这是一个简单的打招呼函数"""print("Hello, "+ name +"!")调用:greet("小明") 输出 Hello, 小明!
参数和返回值
函数可以接收参数,也可以返回值(用 return):
python
defadd(a, b):return a + bresult = add(3,5)print(result)# 8
参数类型
python
defintroduce(name, age=18, city="北京"):print(f"我叫{name},今年{age}岁,来自{city}")introduce("小明")# 我叫小明,今年18岁,来自北京introduce("小红",20)# 我叫小红,今年20岁,来自北京introduce("小刚", city="上海")# 我叫小刚,今年18岁,来自上海作用域
函数内部的变量是局部变量,外部无法访问。函数外部的变量是全局变量,函数内部可以读取,但修改要用 global 声明(不过一般不推荐随便改全局变量)。
python
x =10# 全局deffunc(): y =5# 局部print(x)# 可以读取全局# x = 20 # 这样会创建一个新的局部变量x,不会影响全局func()print(y)# 报错!y是局部变量,外部访问不到
模块(Module):Python的百宝箱
Python自带了很多现成的功能模块,就像工具箱。用 import 导入就能用。
比如随机数模块 random:
python
import randomprint(random.randint(1,10))# 生成1到10之间的随机整数
也可以只导入特定函数:from random import randint,这样就能直接用 randint() 了。
数学模块 math:
python
import mathprint(math.pi)# 3.141592653589793print(math.sqrt(16))# 4.0
自己写的 .py 文件也可以作为模块被别的文件导入,等以后项目大了就明白了。
综合小练习(烧脑时间)
来,写一个小程序,把今天学的东西串起来。需求如下:
有一个字典,存储学生姓名和分数:{"小明": 88, "小红": 95, "小刚": 67, "小丽": 82}
写一个函数,接收字典,返回平均分。
找出最高分的学生(可能有并列)。
打印所有及格(≥60)的学生名单。
用集合找出所有分数是否都在60以上(即是否有不及格)。
试试看,能不能自己写出来?卡住了可以看看提示:
python
scores ={"小明":88,"小红":95,"小刚":67,"小丽":82}defaverage(score_dict): total =sum(score_dict.values())return total /len(score_dict)deffind_top(score_dict): max_score =max(score_dict.values()) tops =[name for name, score in score_dict.items()if score == max_score]return topsdefpass_students(score_dict): passed =[name for name, score in score_dict.items()if score >=60]return passeddefall_pass(score_dict):returnall(score >=60for score in score_dict.values())# all函数判断是否全部为Trueprint("平均分:", average(scores))print("最高分学生:", find_top(scores))print("及格学生:", pass_students(scores))print("全部及格?", all_pass(scores))运行一下,看看结果。
第二天小结
今天信息量有点大,但都是以后天天用的东西。你学会了:
列表(可变、有序、可重复)
元组(不可变、有序)
字典(键值对、高效查找)
集合(无序、不重复、集合运算)
函数(封装代码、参数、返回值、作用域)
模块(导入和使用现成功能)
这些工具组合起来,你已经能处理很多实际问题了。明天我们将深入字符串处理、文件读写和异常处理——这些是让程序更健壮、更实用的技能。
记得,每敲一行代码,都要理解它为什么这么写。如果遇到报错,别慌,那是Python在跟你交流,告诉你哪里需要注意。多读报错信息,你会越来越懂它。
作业(选做)
写一个函数,接收一个列表,返回列表中的最大值和最小值(不能直接用 max 和 min)。
创建一个字典记录你身边5个朋友的生日,然后写一个程序,让用户输入名字,输出生日;如果名字不在字典里,提示“查无此人”。
用列表推导式生成一个包含1到20所有奇数的平方的列表。
明天见!继续加油!💪