第3章 Python 基础语法入门(变量、函数、条件、列表、类)
目标概述
本章面向零编程经验的读者,快速介绍 Python 这门编程语言的基础语法和概念。我们将学习变量与数据类型、运算符、条件判断、循环、函数定义、列表操作以及简单的类和对象。目标是让你具备阅读和编写基础Python代码的能力,为下一章实现 ChatBot 打下扎实基础。通过本章,你将能够编写简单的小程序,理解常见语法错误并规避,并对编程逻辑有初步认识。
主要知识点
-
Python 简介:Python是一种高级解释型语言,语法简洁、可读性强,适合初学者。与很多语言不同,Python使用缩进来表示代码块层次,这点非常重要:缩进不正确会导致语法错误。
-
变量和数据类型:变量是储存值的容器,无需声明类型,直接赋值即可。例如:
message = "Hello, Python" # 字符串 str 类型
count = 42 # 整数 int 类型
price = 19.99 # 浮点数 float 类型
is_valid = True # 布尔 bool 类型(True/False)
-
Python 会根据赋值自动确定类型,可以用 type(message) 获取类型。变量命名建议使用小写字母和下划线,有描述意义。注意区分大小写,name 和 Name 是不同变量。
-
算术和比较运算:Python支持常见算术运算:+ - * /,整数除法//取整,%取余,**幂次方等。比较运算符:==等于,!=不等,> < >= <=。运算结果可用于条件判断。
-
字符串:用单引号或双引号括起来。可以拼接("Hello " + name)或格式化(f字符串:f"Hello, {name}!")。字符串是不可变对象,但有许多方法如 .lower() 转小写等。
-
条件判断:使用 if、elif、else 关键字,根据条件执行不同代码块。例如:
if count > 0:
print("Count is positive")
elif count == 0:
print("Count is zero")
else:
print("Count is negative")
-
注意条件末尾有冒号 :,而且从下一行开始要缩进(通常4个空格)表示属于 if 代码块[48]。不正确缩进会报 IndentationError。
-
循环:主要有 for 循环和 while 循环。
for 循环遍历序列(如列表、字符串等)。例如:
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
print(fruit)
-
这会依次打印列表中的每个水果名称。
-
while 循环根据条件重复执行,条件为 False 时结束:
i = 1
while i <= 3:
print(i)
i += 1 # i = i + 1 的简写
-
输出1,2,3然后循环结束。务必确保循环能终止,否则将陷入死循环。
-
列表和字典:
-
列表(list):有序元素集合,用方括号[]表示。列表可以动态增删改。例如:
numbers = [10, 20, 30]
numbers.append(40) # 在末尾添加元素40
print(numbers[1]) # 输出第二个元素20(索引从0开始)
numbers[0] = 5 # 修改第一个元素为5
-
列表常用函数有 len(numbers) 获取长度,numbers.pop() 弹出末尾元素,numbers.remove(val) 删除值val第一个匹配项等。
-
字典(dict):键-值对集合,用花括号{}表示。例如:
person = {"name": "Alice", "age": 30}
print(person["name"]) # 根据键获取值,输出 "Alice"
person["age"] = 31 # 更新键对应的值
person["city"] = "New York" # 新增键值对
-
字典键通常是字符串(也可为数字或元组等不可变类型),通过键快速查找对应的值。
-
函数:使用 def 定义函数,封装一段可复用逻辑,可接受参数并返回值。例如:
def add(x, y):
result = x + y
return result
sum_val = add(3, 5)
print(sum_val) # 输出 8
-
函数定义以 def 函数名(参数): 开始,缩进的块是函数体。return 返回值(如果省略则返回 None)。理解函数参数的作用域在函数内部,函数外部使用其返回值或全局变量。
-
类和对象:Python支持面向对象编程。类是对象的蓝图,包含属性和方法。简单示例:
class Dog:
def __init__(self, name):
self.name = name
def bark(self):
print(f"{self.name} says: Woof!")
dog1 = Dog("Buddy") # 创建Dog对象
dog1.bark() # 调用方法 => 输出 "Buddy says: Woof!"
-
其中 init 是构造方法,在创建对象时调用,self 代表实例自身。我们为 Dog 定义了属性 name 和方法 bark。初学面向对象时,重点掌握类的定义、实例化对象、调用方法即可。
-
模块导入:Python按文件组织代码,每个.py文件是一个模块。可用 import 模块名 导入,或 from 模块 import 成员 导入特定变量/函数/类。标准库提供大量模块(如 math, os 等)。我们稍后会用到 openai 第三方模块调用 AI 接口。
完整代码示例
下面通过一个综合示例演示上述知识点。在 Cursor 中创建 basics_demo.py,并输入以下代码尝试运行(Cursor 内可按右上角三角形运行Python,或终端执行 python basics_demo.py):
# 1. 变量和数据类型
name = "Alice"
age = 28
is_student = False
print(f"姓名: {name}, 年龄: {age}, 学生? {is_student}") # f字符串格式化输出
# 2. 条件判断
if age < 18:
status = "未成年"
elif age < 65:
status = "成年人"
else:
status = "老年人"
print(f"{name} 是{status}")
# 3. 循环和列表
scores = [85, 92, 78, 90]
total = 0
for score in scores:
total += score
average = total / len(scores)
print("成绩列表:", scores)
print("平均分:", average)
# 4. 函数定义和调用
def greet(person):
return f"Hello, {person}!"
greeting = greet(name)
print(greeting)
# 5. 字典和 while
person_info = {"name": name, "job": "Engineer"}
# 使用 while 遍历字典键
keys = list(person_info.keys())
i = 0
while i < len(keys):
key = keys[i]
print(f"{key} => {person_info[key]}")
i += 1
# 6. 类与对象
class Calculator:
def __init__(self):
self.history = [] # 属性:保存运算历史
def add(self, x, y):
result = x + y
self.history.append(f"add: {x}+{y}={result}")
return result
# 创建对象并使用
calc = Calculator()
print("计算 5+7 =", calc.add(5, 7))
print("操作历史:", calc.history)
预期输出(每行解释):
姓名: Alice, 年龄: 28, 学生? False # 变量输出
Alice 是成年人 # 条件判断结果
成绩列表: [85, 92, 78, 90] # 列表遍历和累加
平均分: 86.25 # 计算平均分
Hello, Alice! # 函数返回值
name => Alice # while循环遍历字典
job => Engineer #
计算 5+7 = 12 # 类方法计算结果
操作历史: ['add: 5+7=12'] # 对象属性history
请尝试运行这段代码,理解每一部分的输出是如何产生的。你也可以修改参数值、添加打印语句来实验,比如修改 scores 列表的值看平均分如何变化,或者给 Calculator 类再添加一个 multiply 方法试试。
操作截图或流程
-
运行 Python 脚本:下图展示在 Cursor 中编辑并运行 basics_demo.py 的过程,右侧终端输出对应结果。注意 Cursor AI 可能会根据你的注释尝试补全代码,例如当你键入 def greet(person): 并按回车,它或许会自动补全 return f"Hello, {person}!"[49]。善用这些自动提示可以加快编码,但也要确保理解每行代码作用。
-
调试 错误示例:将示例代码中的 if age < 18: 缩进错误地写成不缩进,这将导致 IndentationError: expected an indented block。Cursor 会在错误处标红并在终端输出错误信息。我们该如何修正?(提示:为 if 后续的print增加4空格缩进,使其成为if的代码块。)新手常见错误包括漏掉冒号、字符串引号不成对等,Python 错误信息相对容易读,多利用 AI 问:“这个错误是什么意思?” 可得到帮助解释。
[50]上图:Python 调用 OpenAI API 的代码片段,其中 while 循环不断读取用户输入并生成回答。理解这个例子需掌握输入/输出、函数调用、字符串处理等基础。
(出于篇幅原因,这里省略真实截图,推荐你亲自在 Cursor 中运行上述示例,体验实时结果和可能的 AI 建议提示。)
常见错误
-
缩进错误:Python严格依赖缩进来确定代码块。新手经常混用Tab和空格或缩进不一致。解决:在Cursor中设置 Tab 自动转换为空格(通常默认如此),并保持每级缩进4个空格。出错信息若提示“IndentationError”或“不期望的缩进”,仔细检查前一行是否缺冒号,当前行缩进层次是否合理。
-
语法拼写错误:例如忘记在 if 后加冒号 :,或误写成 def add(x, y 缺括号闭合。这类错误会抛 SyntaxError。解决:根据错误消息行号找到对应代码,检查符号是否遗漏或多余。利用Cursor的代码高亮和对齐辅助,通常很快能发现不匹配的引号、括号等[51]。
-
变量未定义:使用一个变量前如果没有赋值,会出现 NameError: name 'x' is not defined。解决:检查变量名拼写是否一致,确保在使用变量之前已给它赋值。例如 for 循环外使用循环内的变量,也会NameError,要把需要的值存在外部变量。
-
类型错误:对不兼容类型执行操作会 TypeError。常见如数字和字符串拼接:"Age: " + 28 会出错,因为不能直接加 int 和 str。解决:使用 f字符串或显式转换类型(如 str(28))。再如将列表当作数字加减,也会TypeError,遇到此类错误先打印变量类型,理解其实际类型后调整代码逻辑。
-
索引错误:访问列表或字符串越界索引(如列表长度3却访问索引3)会 IndexError。解决:使用 len() 检查长度或使用循环迭代而非硬编码索引。
-
属性错误:调用不存在的方法或访问不存在的属性时会 AttributeError。例如 text = "hi"; text.append('!') 会报错,因为字符串没有append方法。解决:仔细阅读错误信息中提到的对象类型和属性名,确认该类型支持的操作(用 dir() 函数也可列出对象属性方法)。
延伸思考
-
善用 AI 学习:Cursor 的 AI 聊天对初学者特别有用。你可以在写代码时询问AI:“while 循环和 for 循环有什么区别?”、“Python 列表和元组的区别是什么?”等。这样在编码实践中即时获取概念解释[52]。思考如何将AI当作导师辅助学习,但也要主动验证AI给出的信息,因为AI偶尔会出错或表达不清。
-
编程思维:通过这些基础,你能看懂简单算法。尝试写一个小程序巩固:比如猜数字游戏——随机生成一个1-100的数,让用户输入猜测,输出猜大了/猜小了/猜对了,用到循环、条件和输入输出。又或者写一个函数判断年份是否闰年。把你的思路转为代码,多练习培养编程思维。
-
面向对象:我们简单介绍了类。思考现实中哪些事物可以抽象为类,例如“学生”类有姓名、年龄属性,有学习方法;“图书”类有标题、作者属性,有被借阅的方法。尝试设计一个简单类表示现实事物。面向对象编程是更高级的主题,将在以后学习中更深入。
掌握以上Python基础,你就有能力编写简单程序和理解后续章节代码了。接下来,我们正式动手构建第一个实际项目:命令行聊天机器人!