Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

字符串变量与操作

引言

在上一章中,我们学习了如何让程序“说话“(输出)和“倾听“(输入)。你可能已经注意到,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
  • 变量名区分大小写,nameName 是两个不同的变量
  • 变量名不能用数字开头,也不能包含空格
  • 变量名最好用小写字母,多个单词用下划线连接,如 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:自我介绍

请编写一个程序,输出你自己的自我介绍。要求:

  1. 使用变量存储你的姓名、年龄、喜欢的颜色、喜欢的食物
  2. 使用字符串拼接把信息组合起来
  3. 使用 * 号制作上下边框
  4. 使用 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:名字的秘密

编写一个程序,分析一个名字:

  1. 获取名字的第一个字
  2. 获取名字的最后一个字
  3. 如果名字是两个字,分别输出两个字
  4. 如果名字是三个字,输出中间的字
  5. 使用 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:正方形计算器

编写一个完整的正方形计算器程序:

  1. 询问用户正方形的边长
  2. 计算正方形的面积和周长
  3. 输出格式化结果(使用拼接和重复)
  4. 添加分隔线和标题
📝 点击查看参考答案
# 正方形计算器
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章我们会学到,TrueFalse 是布尔值,用于判断

综合练习:密码检查器

让我们做一个简单的密码检查器:

  1. 密码不能少于6个字符
  2. 密码必须包含字母和数字
  3. 去除密码前后的空格
# 密码检查器
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的推荐方式

章节小结

恭喜你完成了这一章!让我们回顾一下学到的内容:

核心概念

  1. 字符串:用引号括起来的一串字符
  2. 字符串变量:存储字符串的变量
  3. 索引:字符在字符串中的位置(从0开始)
  4. 切片:获取字符串的一部分
  5. 类型转换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开始标记位置,是数学和编程中常用的方法
  • 负数概念:负数索引就像从数轴右边往左数

给家长的小贴士:教学建议

教学重点

  1. 变量概念:用“盒子“类比,多举生活中的例子
  2. 类型转换:这是最容易出错的地方,要强调字符串和数字的区别
  3. 索引从0开始:这对孩子来说很反直觉,需要多练习
  4. 切片不包括结束位置:同样需要反复强调

常见问题及解答

  1. 问:为什么索引要从0开始?

    • 答:这是计算机科学的传统,可以解释为“偏移量“——第1个字符的偏移量是0。如果孩子不理解,就说“这是规定,记住就好“。
  2. 问:什么时候用单引号,什么时候用双引号?

    • 答:都可以,但要保持一致。建议主要用双引号,除非文字中包含双引号。
  3. 问:为什么 int("3.5") 会出错?

    • 答:int() 只能转换整数,"3.5" 是小数。这是进阶内容,现在先记住 int() 转换整数即可。
  4. 问:len() 计算的是字数还是字符数?

    • 答:是字符数。在Python中,每个汉字、字母、符号、空格都是1个字符。

练习建议

  • 让孩子用字符串操作制作各种“小工具“:名片生成器、密码检查器、名字分析器
  • 多用生活中的例子:名字、地址、课程表
  • 鼓励孩子尝试不同的组合,发现新玩法

挑战练习

  1. 回文检查器:编写程序检查一个词或句子是否是“回文“(正读反读都一样,如“上海自来水来自海上“)

  2. 名字生成器:输入姓氏和名字,生成3个不同的昵称

  3. 文字加密器:把每个字母替换成字母表中下一个字母(a→b, b→c, …, z→a)

  4. 格式化输出:把一个数字(如123456789)格式化成货币格式(如“123,456,789“)

🔗 下一章:数值变量与操作

在下一章中,我们将学习:

  • 整数和小数的区别
  • 数值的运算(加减乘除、求余数、幂运算)
  • 数学函数的使用
  • 数值的格式化输出

字符串帮我们处理文字,数值帮我们处理数字。两者结合起来,我们就可以编写更强大的程序了!