字符串变量与操作
引言
在上一章中,我们学习了如何让程序“说话“(输出)和“倾听“(输入)。你可能已经注意到,input() 函数接收到的内容,以及 print() 函数输出的那些文字,都叫做“字符串“(string)。
字符串就是计算机处理文字信息的方式。它就像一串珍珠项链,每个字符(字母、数字、符号、汉字)都是一颗珍珠,按顺序串在一起。
💾 计算机如何存储文字?
你可能好奇,计算机怎么“记住“这些文字呢?
🖥️ 计算机的小知识:
- 计算机的内存(RAM)就像一个巨大的柜子,里面有很多小格子
- 每个格子里可以存放一个字符
- 字符串就是一连串的格子,每个格子里放一个字符
- 比如
"Hello"就需要5个格子,分别存放 H、e、l、l、o
内存中的样子:
┌───┬───┬───┬───┬───┐
│ H │ e │ l │ l │ o │
└───┴───┴───┴───┴───┘
📏 内存占用:
- 每个字符在内存中占用一定的空间
- 在Python中,一个英文字符通常占用1-2个字节
- 一个中文字符通常占用2-4个字节
- 所以,字符串越长,占用的内存空间越大
这一章,我们要深入了解:
- 什么是字符串变量
- 如何创建和使用字符串变量
- 字符串的基本操作:拼接、重复
- 如何让字符串和数字一起工作
- 📐 字符串位置与数轴的关系
回顾:变量是什么
在上一章中,我们已经学过变量的概念。还记得我们用的“盒子“类比吗?
变量就像一个盒子:
- 盒子有一个名字(变量名)
- 盒子里可以装一个东西(变量的值)
- 我们可以随时把盒子里的东西拿出来或换成别的东西
name = "小明" # 创建一个叫name的盒子,里面装了"小明"
age = "10" # 创建一个叫age的盒子,里面装了"10"
👨🏫 给家长的小贴士:
- 变量名要使用有意义的英文名字,比如用
name而不是n - 变量名区分大小写,
name和Name是两个不同的变量 - 变量名不能用数字开头,也不能包含空格
- 变量名最好用小写字母,多个单词用下划线连接,如
first_name - 教学建议:
- 变量名就像盒子的标签,要清晰说明盒子里装的是什么
- 可以用实物(盒子、标签)演示变量的概念
- 数据存储的抽象性:孩子可能对“看不见的存储“感到困惑,可以解释为:
- 变量就像在纸上写下的名字,我们可以随时查看这个名字代表什么
- 计算机内存就是计算机的“草稿纸“,用来暂时存放信息
字符串变量的创建
在Python中,创建字符串变量非常简单,只需要用引号把文字括起来。
引号的用法
Python支持三种引号:
- 双引号
"":最常用 - 单引号
'':和双引号一样,看个人喜好 - 三引号
"""或''':用于多行文字
# 使用双引号
s1 = "hello"
print(s1) # 输出:hello
# 使用单引号
s2 = 'world'
print(s2) # 输出:world
# 如果文字中本身就包含引号,可以使用另一种引号
s3 = "He said: 'Hello!'"
print(s3) # 输出:He said: 'Hello!'
s4 = 'It\'s a nice day' # 使用反斜杠转义
print(s4) # 输出:It's a nice day
👨🏫 给家长的小贴士:
- 建议让孩子主要使用双引号,这样更统一
- 如果字符串中包含双引号,就用单引号包裹
\是“转义字符“,告诉Python后面的引号是文字的一部分,不是字符串的结束- 暂时不用深入讲解转义字符的概念,孩子遇到时再解释即可
- 计算机编码知识(补充):
- 计算机不认识“字母“或“汉字“,只认识数字
- 所以需要把每个字符对应到一个数字,这就是“编码“
- ASCII码:英文字符的编码,比如A=65,B=66,a=97
- Unicode:统一的编码标准,可以表示所有语言的字符
- 现在Python默认使用Unicode,可以处理中文、日文、韩文等各种语言
- 这些知识不用深入讲,只是让孩子知道:计算机用数字来存储文字
多行字符串
有时候我们需要写很长、很多行的文字,比如一首诗或一段对话,这时可以用三引号:
poem = """静夜思
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。"""
print(poem)
运行结果:
静夜思
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
字符串的基本操作
1. 字符串拼接(+)
就像把两段绳子接在一起,我们可以用 + 号把两个字符串连接成一个新的字符串。
first_name = "张"
last_name = "三"
full_name = first_name + last_name
print(full_name) # 输出:张三
# 也可以直接拼接文字
greeting = "Hello, " + "World!"
print(greeting) # 输出:Hello, World!
注意:拼接时不会自动添加空格,需要自己加上:
s1 = "Hello"
s2 = "World"
# 错误:没有空格
print(s1 + s2) # 输出:HelloWorld
# 正确:手动添加空格
print(s1 + " " + s2) # 输出:Hello World
2. 字符串重复(*)
如果你想打印一条分隔线,比如 10 个 -,不需要一个一个敲出来,可以用 * 号让字符串“复制“多次:
line = "-" * 10
print(line) # 输出:----------
# 也可以用于其他文字
laugh = "哈" * 5
print(laugh) # 输出:哈哈哈哈哈
# 组合使用
border = "=" * 20
print(border)
print(" 我的通知 ")
print(border)
运行结果:
====================
我的通知
====================
3. 获取字符串长度
有时候我们需要知道一个字符串有多少个字符,可以使用 len() 函数:
name = "张三"
print(len(name)) # 输出:2
sentence = "Hello World"
print(len(sentence)) # 输出:11(包含空格)
empty = ""
print(len(empty)) # 输出:0
给家长的小贴士:
len()是 length(长度)的缩写- 空格也是字符,会被计入长度
- 每个汉字算 1 个字符(在 Python 中)
- 空字符串
""的长度是 0
实践 1:制作名片
让我们用字符串拼接来制作一张简单的名片:
# 名片程序
print("=" * 30)
name = "张小明"
age = "10岁"
school = "阳光小学"
hobby = "画画、读书"
print("姓名:" + name)
print("年龄:" + age)
print("学校:" + school)
print("爱好:" + hobby)
print("=" * 30)
运行结果:
==============================
姓名:张小明
年龄:10岁
学校:阳光小学
爱好:画画、读书
==============================
练习 1:自我介绍
请编写一个程序,输出你自己的自我介绍。要求:
- 使用变量存储你的姓名、年龄、喜欢的颜色、喜欢的食物
- 使用字符串拼接把信息组合起来
- 使用
*号制作上下边框 - 使用
len()函数显示你名字的字数
📝 点击查看参考答案
# 自我介绍程序
print("=" * 25)
# 存储个人信息
my_name = "李小花"
my_age = "9岁"
my_color = "粉色"
my_food = "冰淇淋"
# 输出信息
print("我是:" + my_name)
print("今年:" + my_age)
print("喜欢的颜色:" + my_color)
print("喜欢的食物:" + my_food)
print("我的名字有" + str(len(my_name)) + "个字")
print("=" * 25)
运行结果:
=========================
我是:李小花
今年:9岁
喜欢的颜色:粉色
喜欢的食物:冰淇淋
我的名字有3个字
=========================
给家长的小贴士:
- 如果孩子在
len()的输出拼接时遇到困难,可以提示他们用str()把数字转换成字符串 - 鼓励孩子尝试改变边框的样式和长度
字符串的索引和切片
字符串中的每个字符都有一个位置编号,这个编号叫做“索引“(index)。我们可以通过索引来获取字符串中的某个字符或某一部分。
📐 索引与数轴
在数学课上,你学过数轴吗?数轴是一条直线,上面有很多刻度,每个刻度对应一个数字:
数轴:
0 1 2 3 4 5
│ │ │ │ │ │
────┼────┼────┼────┼────┼────
│ │ │ │ │ │
字符串的索引就像数轴:
字符串: H e l l o ,
索引: 0 1 2 3 4 5
↓ ↓ ↓ ↓ ↓ ↓
- 索引 0 对应第一个字符 H (就像数轴上的 0)
- 索引 1 对应第二个字符 e (就像数轴上的 1)
- 以此类推…
📐 数学联系:
- 数轴上的每个点对应一个数字
- 字符串中的每个位置对应一个索引
- 它们都是用数字来标识“位置“的方法
索引从 0 开始
在Python中,索引从 0 开始计数,而不是 1。这对初学者来说需要适应一下:
字符串: H e l l o , W o r l d !
索引: 0 1 2 3 4 5 6 7 8 9 10 11
为什么要从0开始?
- 这与计算机的底层工作方式有关
- 可以理解为“偏移量“:要找第1个字符,需要偏移0个位置;要找第2个字符,需要偏移1个位置
- 就像在数轴上,0是起始点,不是第1个点
s = "Hello, World!"
# 获取单个字符
print(s[0]) # 输出:H(第1个字符)
print(s[4]) # 输出:o(第5个字符)
print(s[7]) # 输出:W(第8个字符)
负数索引
Python还支持从右边数,使用负数索引:
字符串: H e l l o , W o r l d !
负索引: -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
s = "Hello, World!"
print(s[-1]) # 输出:!(倒数第1个)
print(s[-6]) # 输出:W(倒数第6个)
👨🏫 给家长的小贴士:
- 可以用“从0开始“和“从-1开始倒着数“来记忆
- 索引
0是第一个字符,索引-1是最后一个字符 - 可以用手指着每个字符数给孩子看,帮助他们理解
- 数学类比:
- 可以用数轴来帮助孩子理解索引的概念
- 强调索引就像数轴上的刻度,从0开始标记位置
- 负数索引就像从数轴的右边往左数
字符串切片
切片(slice)可以获取字符串的一部分。语法是:字符串[开始位置:结束位置]
s = "Hello, World!"
# 获取子串(注意:不包含结束位置)
print(s[0:5]) # 输出:Hello(从位置0到4)
print(s[7:12]) # 输出:World(从位置7到11)
# 省略开始或结束位置
print(s[:5]) # 输出:Hello(从开头到位置4)
print(s[7:]) # 输出:World!(从位置7到结尾)
print(s[:]) # 输出:Hello, World!(复制整个字符串)
# 使用负数索引
print(s[-6:]) # 输出:World!(倒数第6个到结尾)
print(s[:-7]) # 输出:Hello(开头到倒数第7个)
重要提示:切片的“结束位置“是不包含的!s[0:5] 只包含索引 0,1,2,3,4,不包含 5。
给家长的小贴士:
- 切片的概念对孩子来说可能比较抽象,可以用“切蛋糕“来类比
- 强调“结束位置不包含“这个规则
- 建议先掌握基本用法
s[开始:结束],负数索引可以以后慢慢理解 - 如果孩子感到困惑,不要强求,以后用到时再巩固
练习 2:名字的秘密
编写一个程序,分析一个名字:
- 获取名字的第一个字
- 获取名字的最后一个字
- 如果名字是两个字,分别输出两个字
- 如果名字是三个字,输出中间的字
- 使用
len()判断名字有几个字
📝 点击查看参考答案
# 名字分析程序
name = "张小明"
# 输出名字长度
length = len(name)
print("名字有" + str(length) + "个字")
# 获取第一个字
first = name[0]
print("第一个字:" + first)
# 获取最后一个字
last = name[-1]
print("最后一个字:" + last)
# 根据长度做不同处理
if length == 2:
print("姓:" + name[0])
print("名:" + name[1])
elif length == 3:
print("姓:" + name[0])
print("名:" + name[1:3])
给家长的小贴士:
- 这个练习需要用到第5章的条件语句,如果孩子还没学,可以先让他们处理固定长度的名字
- 可以让孩子先试试处理自己的名字,然后试试同学的不同长度的名字
- 这个练习展示了字符串操作的实际应用
字符串和数字的转换
还记得我们在上一章遇到过一个问题吗?当我们用 input() 获取数字时,程序计算长方形面积出错了:
l = input("length ?\n") # 输入:5
w = input("weight ?\n") # 输入:3
print(l * w) # 错误!输出:333(而不是15)
为什么会这样?因为 input() 得到的是字符串,不是数字!字符串的 * 操作是重复,不是乘法:
s = "3"
print(s * 5) # 输出:33333(重复5次)
字符串转数字:int()
要让字符串“变成“数字,我们需要使用 int() 函数:
s = "5"
n = int(s) # 把字符串"5"转换成数字5
print(n * 3) # 输出:15(这是数学乘法)
# 在输入时直接转换
l = input("length ?\n")
w = input("weight ?\n")
# 转换成数字
l = int(l)
w = int(w)
# 现在可以正常计算了
print("面积:", l * w) # 输出:面积:15
数字转字符串:str()
有时候我们也需要把数字转换成字符串,比如拼接文字:
age = 10 # 这是一个数字
message = "我今年" + age + "岁" # 错误!不能直接拼接
# 需要转换
age = 10
message = "我今年" + str(age) + "岁" # 正确
print(message) # 输出:我今年10岁
给家长的小贴士:
int是 integer(整数)的缩写str是 string(字符串)的缩写- 强调:字符串的
*是重复,数字的*是乘法 - 这个转换过程叫做“类型转换“(type conversion)
- 可以用“翻译“来类比:就像把中文翻译成英文,我们把“字符串“翻译成“数字“
实践 2:改进的长方形计算器
现在我们可以修复上一章的计算器程序了:
# 长方形计算器(改进版)
print("=" * 30)
print(" 长方形计算器 ")
print("=" * 30)
# 获取输入
l = input("请输入长度(数字):")
w = input("请输入宽度(数字):")
# 转换成数字
l = int(l)
w = int(w)
# 计算
area = l * w
perimeter = (l + w) * 2
# 输出结果
print()
print("计算结果:")
print("-" * 20)
print("长度:" + str(l))
print("宽度:" + str(w))
print("面积:" + str(area))
print("周长:" + str(perimeter))
print("-" * 20)
运行示例:
==============================
长方形计算器
==============================
请输入长度(数字):5
请输入宽度(数字):3
计算结果:
--------------------
长度:5
宽度:3
面积:15
周长:16
--------------------
练习 3:正方形计算器
编写一个完整的正方形计算器程序:
- 询问用户正方形的边长
- 计算正方形的面积和周长
- 输出格式化结果(使用拼接和重复)
- 添加分隔线和标题
📝 点击查看参考答案
# 正方形计算器
print("=" * 25)
print(" 正方形计算器 ")
print("=" * 25)
print()
# 获取边长并转换
side = input("请输入正方形的边长:")
side = int(side)
# 计算
area = side * side
perimeter = side * 4
# 输出
print()
print("✿ 计算结果 ✿")
print("-" * 20)
print("边长:" + str(side))
print("面积:" + str(area))
print("周长:" + str(perimeter))
print("-" * 20)
print()
print("小提示:")
print(" 面积 = 边长 × 边长")
print(" 周长 = 边长 × 4")
字符串的常用方法
在Python中,字符串有很多内置的“工具“,叫做“方法“(method)。这些方法可以让字符串做各种有趣的事情。
大小写转换
s = "Hello World"
# 全部大写
print(s.upper()) # 输出:HELLO WORLD
# 全部小写
print(s.lower()) # 输出:hello world
# 首字母大写
print(s.title()) # 输出:Hello World
去除空格
s = " hello "
# 去除两边空格
print(s.strip()) # 输出:hello
# 去除左边空格
print(s.lstrip()) # 输出:hello
# 去除右边空格
print(s.rstrip()) # 输出: hello
查找和替换
s = "Hello World"
# 查找子串位置
print(s.find("World")) # 输出:6
print(s.find("Python")) # 输出:-1(找不到)
# 替换
print(s.replace("World", "Python")) # 输出:Hello Python
判断
# 判断开头
s = "Hello World"
print(s.startswith("Hello")) # 输出:True
print(s.startswith("World")) # 输出:False
# 判断结尾
print(s.endswith("World")) # 输出:True
# 判断全是数字
print("123".isdigit()) # 输出:True
print("abc".isdigit()) # 输出:False
# 判断全是字母
print("abc".isalpha()) # 输出:True
print("abc123".isalpha()) # 输出:False
给家长的小贴士:
- 这些方法的语法是
字符串.方法名(),可以理解为“让字符串做什么事“ - 方法名后面的括号
()是必须的,即使里面什么都不放 - 暂时不需要深入理解“方法“的概念,孩子只要会用即可
- 第5章我们会学到,
True和False是布尔值,用于判断
综合练习:密码检查器
让我们做一个简单的密码检查器:
- 密码不能少于6个字符
- 密码必须包含字母和数字
- 去除密码前后的空格
# 密码检查器
print("🔐 密码检查器 🔐")
print("=" * 25)
print()
# 获取密码
password = input("请输入密码:")
# 去除空格
password = password.strip()
# 检查长度
if len(password) < 6:
print("❌ 密码太短了,至少需要6个字符")
else:
# 检查是否包含数字
has_digit = False
for char in password:
if char.isdigit():
has_digit = True
break
# 检查是否包含字母
has_alpha = False
for char in password:
if char.isalpha():
has_alpha = True
break
if has_digit and has_alpha:
print("✅ 密码符合要求!")
else:
print("❌ 密码必须包含字母和数字")
if not has_digit:
print(" 缺少数字")
if not has_alpha:
print(" 缺少字母")
给家长的小贴士:
- 这个练习用到了第5章的条件语句和第6章的循环语句
- 如果孩子还没学到,可以先做简化版:只检查长度
- 这是一个实际应用的例子,让孩子看到编程的实用性
字符串的格式化(补充)
在第2章中,我们学习了用 + 拼接字符串。Python还有更强大的格式化方法。
f-string(推荐)
f-string 是Python 3.6引入的新特性,非常方便:
name = "小明"
age = 10
# 使用 f-string
message = f"我叫{name},今年{age}岁"
print(message) # 输出:我叫小明,今年10岁
# 可以进行计算
side = 5
area = side * side
print(f"边长是{side}的正方形,面积是{area}")
给家长的小贴士:
- f-string 的
f表示 format(格式化) - 花括号
{}中的变量会被替换成它的值 - 这比用
+和str()方便很多 - 建议让孩子使用 f-string,这是现代Python的推荐方式
章节小结
恭喜你完成了这一章!让我们回顾一下学到的内容:
核心概念
- 字符串:用引号括起来的一串字符
- 字符串变量:存储字符串的变量
- 索引:字符在字符串中的位置(从0开始)
- 切片:获取字符串的一部分
- 类型转换:
int()转成数字,str()转成字符串
常用操作
- 拼接:
+把两个字符串连起来 - 重复:
*让字符串重复多次 - 长度:
len()获取字符个数 - 索引:
s[0]获取第1个字符,s[-1]获取最后1个字符 - 切片:
s[0:5]获取从位置0到4的子串
常用方法
s.upper()/s.lower():大小写转换s.strip():去除空格s.find():查找子串s.replace():替换s.isdigit()/s.isalpha():判断
重要提示
- ✅ 字符串的
*是重复,数字的*是乘法 - ✅
input()得到的是字符串,需要int()转换才能计算 - ✅ 索引从 0 开始,切片不包括结束位置
- ✅ 字符串在内存中占用空间,越长占用越多
🖥️ 计算机知识回顾
- 内存存储:字符串存在内存的格子中,每个字符占一个格子
- 字符编码:计算机用数字来存储文字(ASCII、Unicode)
- 内存占用:字符越长,占用的内存空间越大
- 数据抽象:变量是数据的“标签“,让我们方便地访问和操作数据
📐 数学知识回顾
- 数轴类比:字符串的索引就像数轴上的刻度
- 位置标记:从0开始标记位置,是数学和编程中常用的方法
- 负数概念:负数索引就像从数轴右边往左数
给家长的小贴士:教学建议
教学重点
- 变量概念:用“盒子“类比,多举生活中的例子
- 类型转换:这是最容易出错的地方,要强调字符串和数字的区别
- 索引从0开始:这对孩子来说很反直觉,需要多练习
- 切片不包括结束位置:同样需要反复强调
常见问题及解答
-
问:为什么索引要从0开始?
- 答:这是计算机科学的传统,可以解释为“偏移量“——第1个字符的偏移量是0。如果孩子不理解,就说“这是规定,记住就好“。
-
问:什么时候用单引号,什么时候用双引号?
- 答:都可以,但要保持一致。建议主要用双引号,除非文字中包含双引号。
-
问:为什么
int("3.5")会出错?- 答:
int()只能转换整数,"3.5"是小数。这是进阶内容,现在先记住int()转换整数即可。
- 答:
-
问:
len()计算的是字数还是字符数?- 答:是字符数。在Python中,每个汉字、字母、符号、空格都是1个字符。
练习建议
- 让孩子用字符串操作制作各种“小工具“:名片生成器、密码检查器、名字分析器
- 多用生活中的例子:名字、地址、课程表
- 鼓励孩子尝试不同的组合,发现新玩法
挑战练习
-
回文检查器:编写程序检查一个词或句子是否是“回文“(正读反读都一样,如“上海自来水来自海上“)
-
名字生成器:输入姓氏和名字,生成3个不同的昵称
-
文字加密器:把每个字母替换成字母表中下一个字母(a→b, b→c, …, z→a)
-
格式化输出:把一个数字(如123456789)格式化成货币格式(如“123,456,789“)
🔗 下一章:数值变量与操作
在下一章中,我们将学习:
- 整数和小数的区别
- 数值的运算(加减乘除、求余数、幂运算)
- 数学函数的使用
- 数值的格式化输出
字符串帮我们处理文字,数值帮我们处理数字。两者结合起来,我们就可以编写更强大的程序了!