Python程序的核心在于处理各种类型的数据。无论是存储用户的姓名、计算数学公式的结果,还是管理复杂的数据集合,我们都需要了解如何在Python中有效地使用变量和不同的数据类型。 在这一部分,我们将深入探讨Python中的基本数据类型,学习如何创建和使用变量,以及如何操作这些数据来构建功能强大的程序。

当我们运行一个Python程序时,Python解释器会在幕后进行大量的工作。让我们通过一个简单的程序来理解这个过程:
|print("欢迎来到Python的世界!")
当您保存并运行这个程序时,会看到以下输出:
|欢迎来到Python的世界!
在执行过程中,Python解释器首先读取程序文件,识别出这是一个Python程序(通常通过.py文件扩展名)。然后,解释器逐行分析代码,理解每个词语的含义。当它遇到print函数时,会将括号内的内容显示在屏幕上。
现代的代码编辑器为我们提供了语法高亮功能,这使得代码更容易阅读。编辑器会用不同的颜色显示代码的不同部分:函数名、字符串、关键字等都有各自的颜色标识,帮助我们快速识别代码结构。
变量是程序中最基础也是最重要的概念之一。我们可以将变量想象成一个标签,用来标识和引用特定的数据。让我们通过修改之前的程序来体验变量的作用:
|greeting = "欢迎来到Python的世界!" print(greeting)
在这个例子中,我们创建了一个名为greeting的变量,并将字符串"欢迎来到Python的世界!"赋值给它。当Python执行第二行代码时,它会查找变量greeting所对应的值,然后将这个值打印出来。
变量的强大之处在于我们可以随时改变它们的值。考虑下面的程序:
|message = "今天天气真好" print(message) message = "明天我们去郊游吧" print(message)
运行这个程序会得到:
|今天天气真好 明天我们去郊游吧
这个例子展示了变量值的动态特性。Python始终记录着每个变量的当前值,无论它被修改了多少次。
在Python中使用变量时,我们需要遵循一些重要的命名规则和最佳实践。
student_name和_private_var是有效的变量名,而2nd_attempt则不是。user_age是正确的写法,而user age会导致错误。print、if、for等。这些词语在Python中有特殊含义,使用它们作为变量名会引起混淆。良好的变量命名应该具有描述性。name比n更好,student_score比s更有意义。这样的命名方式让代码更容易理解和维护。
需要特别注意的是,字母l(小写L)和字母O(大写o)容易与数字1和0混淆,在命名时应当谨慎使用。
编程过程中,每个人都会犯错误,理解和解决这些错误是学习编程的重要组成部分。让我们看一个常见的错误示例:
|welcome_text = "欢迎使用我们的应用程序!" print(welcom_text)
当运行这个代码时,Python会报告一个名称错误:
|$ python test.py Traceback (most recent call last): File "test.py", line 2, in main print(welcom_text) NameError: name 'welcom_text' is not defined
这个错误信息告诉我们Python无法找到名为welcom_text的变量。仔细观察会发现,我们在定义变量时使用了welcome_text,但在使用时拼写成了welcom_text,少了一个字母e。
Python的错误追踪信息虽然看起来复杂,但实际上提供了很有用的调试信息:它指出了错误发生的位置、错误的类型,以及可能的原因。学会阅读这些错误信息对于提高编程效率非常重要。
很多初学者将变量理解为存储数据的"盒子",但这种比喻并不完全准确。更准确的理解是:变量是指向数据的"标签"或"引用"。这种理解方式在处理复杂数据时会变得很重要。
当我们写name = "张三"时,Python创建了一个字符串对象"张三",然后让变量name指向这个对象。这种机制使得Python能够高效地管理内存和数据。

字符串是程序中最常用的数据类型之一,它用来表示文本信息。在Python中,任何被引号包围的内容都被视为字符串。我们可以使用单引号或双引号来创建字符串:
|"这是一个字符串" '这也是一个字符串'
引号的灵活使用让我们能够在字符串中包含其他类型的引号:
|'小明说:"Python是我最喜欢的编程语言!"' "Python这个名字来源于'Monty Python'喜剧团" "Python的一大优势是它拥有'多样化且友好的社区'"
Python为字符串提供了许多有用的方法来处理文本。其中最常用的是大小写转换方法。
|student_name = "李明华" print(student_name.title())
这会输出:
|李明华
虽然中文名字的首字母大写在这里看起来没有明显变化,但对于包含英文的字符串,title()方法会将每个单词的首字母转换为大写。
对于英文字符串,我们还可以使用upper()和lower()方法:
|course_name = "Python Programming" print(course_name.upper()) print(course_name.lower())
输出:
|PYTHON PROGRAMMING python programming
lower()方法在数据处理中特别有用,因为它可以统一用户输入的格式,避免因大小写差异导致的数据不一致问题。
在实际编程中,我们经常需要将变量的值插入到字符串中。Python的f-字符串功能为此提供了优雅的解决方案:
|first_name = "王" last_name = "小明" full_name = f"{first_name}{last_name}" print(full_name)
通过在字符串前加上字母f,并将变量名放在花括号内,Python会自动用变量的值替换花括号中的内容。这种方法被称为f-字符串(格式化字符串),它让字符串的构建变得直观和高效。
我们可以利用f-字符串创建更复杂的消息:
|student_name = "张同学" score = 95 print(f"恭喜{student_name},您的考试成绩是{score}分!")
f-字符串还可以在插值过程中调用方法:
|first_name = "刘" last_name = "小红" print(f"欢迎您,{(first_name + last_name).upper()}同学!")
在编程中,空白字符包括空格、制表符和换行符等不可见字符。正确处理这些字符对于程序的正常运行很重要。
我们可以使用特殊字符序列在字符串中添加制表符和换行符:
|print("编程语言:\n\tPython\n\tJava\n\tJavaScript")
这会产生格式良好的输出:
|编程语言: Python Java JavaScript
其中\n表示换行,\t表示制表符。组合使用这些字符可以创建结构化的输出格式。
在处理用户输入时,经常需要清除多余的空白字符。Python提供了三个有用的方法:
|user_input = " python编程 " print(f"原始输入:'{user_input}'") print(f"右侧清空:'{user_input.rstrip()}'") print(f"左侧清空:'{user_input.lstrip()}'") print(f"两侧清空:'{user_input.strip()}'")
这些方法帮助我们确保数据的一致性,特别是在比较字符串或存储用户输入时。
在使用引号时,需要注意匹配问题。如果在单引号字符串中使用撇号,会导致语法错误:
|# 这会导致错误 message = 'It's a cat.'
正确的做法是使用双引号包围包含撇号的字符串:
|message = "It's a cat." print(message)
现代编程编辑器的语法高亮功能可以帮助我们快速识别这类问题,当引号不匹配时,代码的颜色显示会出现异常。
数字在编程中无处不在:游戏计分、数据可视化、Web应用的统计信息等都需要数字运算。Python提供了灵活且强大的数字处理能力。
Python支持所有基本的数学运算。我们可以直接在Python解释器中进行计算:
|>>> 8 + 12 20 >>> 15 - 7 8 >>> 6 * 4 24 >>> 20 / 4 5.0
Python使用双星号表示幂运算:
|>>> 2 ** 3 8 >>> 5 ** 2 25 >>> 10 ** 4 10000
Python遵循数学中的运算优先级规则,支持使用括号改变运算顺序:
|>>> 3 + 4 * 5 23 >>> (3 + 4) * 5 35
Python将带有小数点的数字称为浮点数。这个术语在大多数编程语言中都通用,它反映了小数点可以出现在数字的任何位置这一特性。
|>>> 0.2 + 0.3 0.5 >>> 0.8 - 0.3 0.5 >>> 2 * 0.4 0.8
但是,浮点数运算有时会产生意想不到的结果:
|>>> 0.1 + 0.2 0.30000000000000004
这种现象在所有编程语言中都存在,是由于计算机内部数字表示方式的限制造成的。在大多数情况下,这种微小的误差可以忽略不计。
当整数和浮点数进行运算时,结果总是浮点数:
|>>> 4 / 2 2.0 >>> 3 + 2.0 5.0 >>> 2 * 3.5 7.0
这种设计确保了运算结果的精确性,避免了数据类型转换带来的问题。
对于较大的数字,Python允许使用下划线分组数字以提高可读性:
|>>> population = 1_400_000_000 >>> print(population) 1400000000
虽然在定义时使用了下划线,但Python在输出时会忽略这些下划线。这个特性在处理大数值时特别有用。
Python允许在一行中同时给多个变量赋值,这在初始化多个变量时很有用:
|>>> x, y, z = 0, 0, 0 >>> print(x, y, z) 0 0 0
这种语法要求变量的数量与值的数量完全匹配,是一种简洁高效的编程技巧。
虽然Python没有内置的常量类型,但按照约定,我们使用全大写字母来表示应该被视为常量的变量:
|MAX_STUDENTS = 30 PI = 3.14159
这种命名约定提醒其他程序员(包括未来的自己)这些值不应该被修改。
随着程序变得越来越复杂,添加注释变得至关重要。注释是用自然语言解释代码功能的文本,它们不会被Python解释器执行。
在Python中,注释以井号(#)开始:
|# 计算学生的平均成绩 total_score = 85 + 92 + 78 average = total_score / 3 print(f"平均成绩:{average}")
好的注释应该解释代码的目的和实现思路,而不是简单地重复代码的字面意思。注释对于代码维护和团队协作至关重要,它们帮助其他人(包括未来的自己)快速理解代码的意图。 当面临复杂的问题需要特殊的解决方案时,注释显得尤为重要。它们记录了我们的思考过程,节省了日后重新理解代码的时间。
无论何时,我们都应该在合适的位置添加注释!这是一个良好的编程习惯。
列表是Python中最灵活和常用的数据结构之一。它允许我们在一个变量中存储多个相关的数据项,这些数据项按照特定的顺序排列。
列表使用方括号[]定义,其中的元素用逗号分隔:
|fruits = ['苹果', '香蕉', '橙子', '葡萄'] print(fruits)
输出:
|['苹果', '香蕉', '橙子', '葡萄']
这种直接打印列表的方式会显示方括号和引号,这是Python的内部表示形式。在实际应用中,我们通常需要以更友好的方式访问列表中的元素。
列表中的每个元素都有一个位置索引,我们可以通过索引来访问特定的元素:
|fruits = ['苹果', '香蕉', '橙子', '葡萄'] print(fruits[0])
输出:
|苹果
我们发现我们使用fruits[0]来访问列表中的第一个元素。这是因为Python的索引从0开始计数,这是大多数编程语言的惯例。这意味着第一个元素的索引是0,第二个元素的索引是1,以此类推。
我们可以对列表中的元素应用字符串方法:
|fruits = ['苹果', '香蕉', '橙子', '葡萄'] print(f"我最喜欢的水果是{fruits[0]}")
Python提供了一种特殊的索引方式——负索引,它允许我们从列表的末尾开始计数:
|fruits = ['苹果', '香蕉', '橙子', '葡萄'] print(fruits[-1]) # 最后一个元素 print(fruits[-2]) # 倒数第二个元素
输出:
|葡萄 橙子
负索引在我们不知道列表确切长度但需要访问末尾元素时特别有用。
列表中的元素可以像普通变量一样使用。我们可以利用f-字符串创建包含列表元素的消息:
|colors = ['红色', '蓝色', '绿色', '黄色'] message = f"我的房间墙壁是{colors[2]}的" print(message)
输出:
|我的房间墙壁是绿色的
列表的强大之处在于它们是可变的,我们可以在程序运行过程中添加、删除和修改元素。
要修改列表中的元素,假设我们想将列表中的第一个元素修改为'老虎',我们可以使用类似于访问元素的语法:
|animals = ['猫', '狗', '兔子'] print(f"原始列表:{animals}") animals[0] = '老虎' print(f"修改后:{animals}")
输出:
|原始列表:['猫', '狗', '兔子'] 修改后:['老虎', '狗', '兔子']
Python提供了多种方法向列表添加新元素。最简单的方法是使用append()方法,它将新元素添加到列表的末尾。
|hobbies = ['阅读', '游泳', '绘画'] print(f"当前爱好:{hobbies}") hobbies.append('摄影') print(f"添加新爱好后:{hobbies}")
从空列表开始构建也是一种常见的模式:
|shopping_list = [] shopping_list.append('面包') shopping_list.append('牛奶') shopping_list.append('鸡蛋') print(f"购物清单:{shopping_list}")
如果需要在列表的特定位置插入元素,可以使用insert()方法:
|subjects = ['数学', '英语', '历史'] subjects.insert(1, '物理') print(f"插入物理课后:{subjects}")
这会在索引1的位置插入'物理',原来位置1及其后的所有元素都会向右移动一位。
Python提供了几种删除列表元素的方法,每种方法适用于不同的场景。
如果知道要删除元素的确切位置,可以使用del语句:
|cities = ['北京', '上海', '广州', '深圳'] print(f"原始城市列表:{cities}") del cities[1] print(f"删除上海后:{cities}")
当需要删除元素但还要使用它的值时,pop()方法是更好的选择:
|tasks = ['洗衣服', '买菜', '做饭', '打扫'] completed_task = tasks.pop() print(f"剩余任务:{tasks}") print(f"刚完成的任务:{completed_task}")
pop()方法也可以删除任意位置的元素:
|priorities = ['紧急', '重要', '普通', '低优先级'] urgent_task = priorities.pop(0) print(f"处理的紧急任务:{urgent_task}") print(f"剩余优先级:{priorities}")
当只知道要删除的值而不知道其位置时,使用remove()方法:
|inventory = ['苹果', '香蕉', '橙子', '苹果'] inventory.remove('香蕉') print(f"移除香蕉后:{inventory}")
需要注意的是,remove()方法只删除第一次出现的指定值。
在实际应用中,列表中的数据顺序很重要。Python提供了多种方法来组织和排序列表。
sort()方法会永久改变列表的顺序:
|students = ['张三', '李四', '王五', '赵六'] students.sort() print(f"按字母顺序排序:{students}")
要按相反顺序排序,可以传递reverse=True参数:
|numbers = [3, 1, 4, 1, 5, 9, 2, 6] numbers.sort(reverse=True) print(f"降序排列:{numbers}")
如果需要保持原始顺序不变,只是临时以排序方式显示列表,可以使用sorted()函数:
|original_list = ['香蕉', '苹果', '橙子'] print(f"原始顺序:{original_list}") print(f"临时排序:{sorted(original_list)}") print(f"仍然是原始顺序:{original_list}")
reverse()方法会反转列表的当前顺序:
|years = [2020, 2021, 2022, 2023] print(f"原始顺序:{years}") years.reverse() print(f"反转后:{years}")
len()函数返回列表中元素的数量:
|team_members = ['小明', '小红', '小刚', '小丽'] print(f"团队成员数量:{len(team_members)}")
这个函数在需要根据列表大小进行决策时特别有用。
在使用列表时,索引错误是最常见的问题之一。当试图访问不存在的索引位置时,Python会报告索引错误:
|colors = ['红', '绿', '蓝'] # print(colors[3]) # 这会导致索引错误
这种错误通常发生在我们对列表长度的估计有误时。使用负索引访问最后一个元素是避免此类错误的好方法:
|colors = ['红', '绿', '蓝'] print(f"最后一种颜色是:{colors[-1]}")
但是,当列表为空时,即使使用负索引也会出错。在处理可能为空的列表时,应该先检查列表是否包含元素。
当需要对列表中的每个元素执行相同操作时,for循环是最有效的工具。
|students = ['小明', '小红', '小刚'] for student in students: print(f"{student},请准备上台发言")
输出:
|小明,请准备上台发言 小红,请准备上台发言 小刚,请准备上台发言
for循环的工作原理是:Python从列表中取出第一个元素,将其赋值给临时变量student,然后执行循环体中的代码。完成后,Python取出下一个元素,重复这个过程,直到处理完列表中的所有元素。
循环体可以包含任意数量的代码行:
|fruits = ['苹果', '香蕉', '橙子'] for fruit in fruits: print(f"{fruit}是一种很好的水果") print(f"我喜欢吃{fruit}\n")
只要代码行正确缩进,它们就会在每次循环迭代中执行。
循环结束后,我们经常需要执行一些总结性操作:
|team_members = ['张三', '李四', '王五'] for member in team_members: print(f"欢迎{member}加入我们的团队!") print("感谢大家,让我们一起努力工作!")
不缩进的代码行只会在循环完成后执行一次。
在数据处理和科学计算中,经常需要处理数字列表。Python提供了高效的工具来创建和操作数值列表。
range()函数可以生成一系列数字:
|for number in range(1, 6): print(number)
输出:
|1 2 3 4 5
range()函数遵循Python的标准约定:包含起始值,但不包含结束值。
结合list()函数和range()函数,我们可以快速创建数字列表:
|numbers = list(range(1, 11)) print(numbers)
range()函数还可以指定步长:
|even_numbers = list(range(2, 21, 2)) print(f"1到20之间的偶数:{even_numbers}")
我们可以使用循环创建更复杂的数字列表:
|squares = [] for value in range(1, 6): square = value ** 2 squares.append(square) print(f"前5个数的平方:{squares}")
Python提供了几个有用的函数来处理数字列表:
|grades = [85, 92, 78, 96, 88] print(f"最高分:{max(grades)}") print(f"最低分:{min(grades)}") print(f"总分:{sum(grades)}") print(f"平均分:
列表推导式是Python的一个高级特性,它允许我们用一行代码创建列表:
|squares = [value**2 for value in range(1, 11)] print(f"前10个数的平方:{squares}")
这种语法结合了循环和列表创建,代码更加简洁。列表推导式包含一个表达式、一个for循环,以及可选的条件语句。
切片是Python中一个强大的特性,它允许我们处理列表的部分元素。
要创建切片,需要指定起始索引和结束索引:
|students = ['小明', '小红', '小刚', '小丽', '小华'] print(f"前三名学生:{students[0:3]}") print(f"中间三名学生:{students[1:4]}")
如果省略起始索引,切片会从列表开头开始:
|print(f"前四名学生:{students[:4]}")
如果省略结束索引,切片会包含到列表末尾:
|print(f"后三名学生:{students[2:]}")
负索引也可以用于切片:
|print(f"最后三名学生:{students[-3:]}")
切片在数据处理中很有用。例如,在游戏中显示排行榜的前几名:
|high_scores = [9500, 8900, 8700, 8200, 7900, 7500] print("排行榜前三名:") for i, score in enumerate(high_scores[:3], 1): print(f"第{i}名:{score}分")
使用切片可以创建列表的副本:
|original_menu = ['汉堡', '薯条', '可乐'] new_menu = original_menu[:] original_menu.append('鸡块') new_menu.append('奶昔') print(f"原菜单:{original_menu}") print(f"新菜单:{new_menu}")
这种复制方法创建了两个独立的列表,修改其中一个不会影响另一个。
有时候我们需要创建一个不能修改的数据集合,Python为此提供了元组(tuple)数据类型。
元组使用圆括号而不是方括号定义:
|screen_size = (1920, 1080) print(f"屏幕宽度:{screen_size[0]}像素") print(f"屏幕高度:{screen_size[1]}像素")
尝试修改元组元素会导致错误:
|# screen_size[0] = 2560 # 这会导致类型错误
可以像遍历列表一样遍历元组:
|rgb_colors = (255, 128, 0) for value in rgb_colors: print(f"颜色值:{value}")
虽然不能修改元组的元素,但可以重新定义整个元组:
|dimensions = (800, 600) print(f"原始尺寸:{dimensions}") dimensions = (1024, 768) print(f"新尺寸:{dimensions}")
元组在需要存储不应改变的数据时很有用,比如游戏中的固定设置、坐标点或颜色值等。它们提供了数据完整性的保证,防止意外的修改。
|x = 5 x = x + 3 x = x * 2
7. 变量赋值和f-字符串
创建一个程序,将字符串"Python编程"赋值给变量,然后使用f-字符串输出"欢迎学习Python编程"。
|# 将字符串"Python编程"赋值给变量course_name course_name = "Python编程" # 使用f-字符串输出"欢迎学习Python编程" print(f"欢迎学习{course_name}")
输出结果:
|欢迎学习Python编程
8. 列表操作
创建一个列表,执行添加、插入、删除等操作,并输出最终结果。
|# 创建列表 numbers = [1, 2, 3, 4, 5] # 在末尾添加元素6 numbers.append(6) # 在索引0的位置插入元素0 numbers.insert(0, 0) # 删除值为3的元素 numbers.remove(3) # 输出结果 print(numbers) # 输出结果:[0, 1, 2, 4, 5, 6]
执行过程说明:
[1, 2, 3, 4, 5][1, 2, 3, 4, 5, 6][0, 1, 2, 3, 4, 5, 6][0, 1, 2, 4, 5, 6](删除第一个值为3的元素)9. 字符串方法使用
编写一个程序,对字符串进行各种处理:去除空格、转换为大写、首字母大写等。
|text = " Hello World " # 去除两端空格 print(text.strip()) # 输出: Hello World # 转换为大写 print(text.upper()) # 输出: HELLO WORLD # 首字母大写 print(text.capitalize()) # 输出: hello world # 组合使用 print(text.strip().upper()) # 输出: HELLO WORLD
完整示例:
|text = " Hello World " # 去除两端空格 cleaned = text.strip() print(
10. 变量和自我介绍
编写一个程序,创建变量存储你的姓名、年龄、城市,使用f-字符串输出自我介绍,然后将年龄加1并输出更新后的信息。
|# 创建变量存储信息 name = "张三" age = 20 city = "北京" # 使用f-字符串输出自我介绍 print(f"大家好,我是{name},今年{age}岁,来自{city}。") # 将年龄加1 age = age + 1 # 输出更新后的信息 print(f"明年我就
输出结果:
|大家好,我是张三,今年20岁,来自北京。 明年我就21岁了!