第 11 课 · 字符串魔法

密码生成器

让字符串学会「变身」:拼接、重复、数长度、取字符、切一段、转大小写——再用随机数造一个自己的密码生成器!

120 分钟完整闭环 5 个知识点 5 段示范代码 难度 ★★
🏠 学期课件主页 ← 上一课:随机数下一课:期末项目 →
01

本课导览

先看这节课教什么、怎么分配 120 分钟,老师心里有底,课堂节奏就不乱。

第11课字符串魔法
🎯 趣味项目:密码生成器
字符串索引切片字符串方法len()
🎯教学目标(学完这节课,学生能…)
  • 掌握字符串的基本操作:用 + 拼接、用 * 重复、用 len() 数长度;
  • 理解字符串索引:每个字符都有编号、从 0 开始,s[0] 取第一个,s[-1] 取最后一个;
  • 学会字符串切片 s[起始:结束],知道「顾头不顾尾」,会用 s[::-1] 反转;
  • 了解常用字符串方法:upper()、lower()、replace()、isupper()、islower()、isdigit();
  • 综合运用 random 和字符串,编写一个能生成随机密码并检查强度的密码生成器。
🔑 教学重点
  • 索引从 0 开始:s[0] 是第一个字符
  • 切片「顾头不顾尾」:s[0:3] 取第 0~2 个;s[::-1] 反转
🧗 教学难点 / 易卡点
  • 把第 1 个字符的索引记成 1(其实是 0)
  • 切片结束位置多 1 记不住
  • 密码强度检查的三类字符计数逻辑
🧰课前准备(老师 / 学生)
  • 老师:准备「字符串魔法」小道具:写有 P y t h o n 的字母卡片一字排开,现场演示编号 0~5 和负数编号;预演密码生成器。
  • 学生:打开作品文件夹;今天作品保存为「第11课_密码生成器.py」。
  • 口令:老师说「下标」,学生答「从 0 开始」;老师说「顾头」,学生答「不顾尾」。
⏱️120 分钟教学流程(建议时间轴,可按班级情况微调)
时间环节做什么 / 师生互动要点
0–5候课 · 设备检查开机 → 打开编辑器 → 确认作品文件夹就位。
5–12上节回顾 · 快问快答import 干什么?randint 含不含两端?choice 从哪抽?谁做了随机点名器?
12–20情景导入讲「账号密码被吐槽太弱」的故事:密码既要记得住又要够强——让电脑帮我们生成一个。
20–35知识讲解字符串基础(拼接/重复/len)→ 索引(从 0 开始、负数倒着数)→ 切片(顾头不顾尾、反转)。
35–55示范代码 + 上机(示例1~3)拼接重复实验 → 索引取字符 → 切片取一段,每段代码都先猜结果再运行。
55–72字符串方法 + 上机(示例4)upper/lower/replace 变身 + isupper/islower/isdigit 自报家门,给密码强度检查做铺垫。
72–90主项目:密码生成器字符池拼接 → for 循环拼密码 → 计数器查三类字符 → 强度三档判断,分段带读后整体上机。
90–100课堂练习 A/B练习 1 生成 10 位密码;练习 2 输入一句话输出长度/大写/小写;投屏找茬。
100–108挑战练习 C回文判断器(s[::-1]);学有余力的同学做邮箱格式检查。
108–115总结 · 保存作品齐读口诀;保存「第11课_密码生成器.py」;预告第 12 课期末大项目!
115–120布置作业 · 预告布置必做/选做/思考;预告:用一学期学的所有本领做文字冒险游戏。

时间轴把 2 小时切成 8 段:复习→导入→讲解→示范→上机→练习→检测→小结,每段都有明确产出。

02

情景导入 · 复习热身

先用 5 分钟把上节课的记忆叫醒,再用故事和类比把新知识挂到孩子已有的经验上。

🔁上节回顾 · 快问快答(建议 5 分钟)

问 1:import random 之后,掷骰子用哪个函数?它含不含两端?
→ random.randint(1, 6);含两端,真的可能出 6。 randint 不是顾头不顾尾。

问 2:random.choice(["石头","剪刀","布"]) 是干嘛的?
→ 从列表里随机选一个元素返回。 列表 = 方括号 + 逗号。

问 3:石头剪刀布 v2 里 continue 是干嘛的?
→ 输入错字时跳过本轮,回到 while 开头重新输入,不计数。 break 出圈,continue 回圈。

📖情景故事 · 今天学什么

小刚注册游戏账号,网页提示:密码太弱啦!请包含大小写字母和数字,至少 8 位。

小刚挠头:abcdef 太弱,123456 更弱,可自己想的密码不是记不住就是通不过检查。

同桌小美凑过来:让电脑帮你生成一个不就行了!电脑最会「变」字符串——变大写、变小写、数长度、切一段,还会随机抽字符拼起来。

小刚恍然大悟:字符串在 Python 里就像有魔法——能拼接、能重复、能切开、能翻转。今天就来学这些「字符串魔法」,再让电脑当你的密码管家!

💡生活类比:把新知识挂在旧经验上
🔤

字符串 = 一串珠子

每个字符是一颗珠子,整串用引号穿着;可以串起来(+)、复制一串(*)、数有几颗(len)。

字符序列
🔢

索引 = 珠子编号

第一颗珠子编号 0(不是 1!),往后 1、2、3……从后往前数用负数:-1 是最后一颗。

从 0 开始
✂️

切片 = 剪一段彩带

s[起始:结束] 从彩带中间剪一段,顾头不顾尾:s[0:3] 剪到第 2 颗为止,第 3 颗不剪。

取子串
🪄

方法 = 念咒语变身

s.upper() 变大声(大写)、s.lower() 变小声(小写)、s.replace("a","b") 把 a 换成 b。

变身咒语
🗝️本课核心口诀(板书 / 齐读)
核 心 口 诀字符串是串珠,编号从 0 开始数;
切片顾头不顾尾,upper 大写魔法酷!
03

知识讲解

分小块讲透语法点,每一块都配生活类比 + 要点小结,讲完立刻口头小试。

🔤字符串基础——拼接、重复、数长度

字符串就是用引号括起来的文字。除了打印,它还有三样本领:拼接、重复、数长度。

拼接 +:"小" + "刚" 得到 "小刚"(第 1 课就见过);拼接时别忘了每段都要加引号。

重复 *:"ha" * 3 得到 "hahaha"——字符串乘整数,把整串复制 N 遍(第 6 课打印三角形用过)。

数长度 len():len("Python") 得到 6——数一数里面有几个字符,空格也算一个哦。

+ 拼接:"小"+"刚"="小刚"* 重复:"ha"*3="hahaha"len() 数长度,空格也算
💡 字符串 + 数字会报错:"我今年" + 9 不行,要先 str(9) 把数字变文字(第 2 课学过)。
🔢字符串索引——取单个字符

字符串里的每个字符都有编号,用 方括号 加编号就能取出那一个字符,这个编号叫索引。

索引从 0 开始!s = "Python",s[0] 是 "P",s[1] 是 "y",s[5] 是 "n"——第 6 个字符的编号是 5。

负数索引从右往左数:s[-1] 是最后一个字符 "n",s[-2] 是 "o"。倒数第 1 个 = -1。

注意:取出的单个字符还是字符串;用 s[6](超出长度)会报错 IndexError。

s[0] 是第一个字符s[-1] 是最后一个字符超出长度会报错
💡 记牢「第一个是 0」——这是新手最容易错的地方,也是编程世界的「行规」。
✂️字符串切片——取一段

想取字符串的一段,用切片:s[起始:结束],从起始编号取到结束编号之前(顾头不顾尾)。

s = "Python":s[0:3] 取 "Pyt"(第 0~2 个,第 3 个不取);结束位置永远取不到。

偷懒写法:s[:3] 和 s[0:3] 一样(开头省略 = 从 0 开始);s[3:] 从第 3 个取到末尾。

反转神技 s[::-1]:把字符串倒过来。"Python"[::-1] 得到 "nohtyP"——回文判断就靠它!

s[起:止],止不包含s[:3] 从头取,s[3:] 取到末尾s[::-1] 反转
💡 [::-1] 里的 -1 是「步长为 -1、倒着走」,先把这招记住,原理以后慢慢懂。
🪄常用字符串方法——念咒语变身

字符串「自带」很多方法(函数),写法是 字符串.方法名(),像对它念一句咒语。

变大写 s.upper():"hello".upper() 得到 "HELLO";变小写 s.lower():"Hello".lower() 得到 "hello"。

替换 s.replace(旧, 新):"banana".replace("a", "o") 得到 "bonono"——把所有的 a 都换成 o。

自报家门三兄弟:s.isupper() 问「我全是大写吗?」、s.islower() 问「我全是小写吗?」、s.isdigit() 问「我全是数字吗?」——回答 True 或 False,密码强度检查就靠它们。

s.upper() / s.lower() 大小写s.replace(旧,新) 替换isupper/islower/isdigit 返回 True/False
💡 upper/lower 不会改原字符串,而是返回一个新字符串——想留住变化,要赋值:s = s.upper()。
04

示范代码 · 动手做

老师先带读代码、讲注释,再让学生亲手敲一遍——敲错正好学习调试。

Python示例 1 · 示例 1:拼接、重复、数长度
# 第11课:字符串基础操作
first = "小"
last = "刚"
print("拼接:" + first + last)      # 用+把两段拼起来
print("重复:" + "ha" * 3)          # 字符串乘3
print("长度:" + str(len("Python"))) # len数有几个字符
print("空格也算:" + str(len("a b")))
运 行 结 果
拼接:小刚
重复:hahaha
长度:6
空格也算:3
✍ 把 "ha" * 3 改成 "ha" * 5 运行。数一数 len("a b") 为什么是 3(字母+空格+字母)。

🤔 想一想:len("小刚") 会得到几?中文一个字符算 1 个长度哦,上机验证一下。

Python示例 2 · 示例 2:索引——按编号取字符
# 用索引取单个字符
s = "Python"
print("s[0] = " + s[0])     # 第一个字符:P
print("s[1] = " + s[1])     # 第二个字符:y
print("s[5] = " + s[5])     # 第六个字符:n
print("s[-1] = " + s[-1])   # 倒数第一个:n
print("s[-2] = " + s[-2])   # 倒数第二个:o
运 行 结 果
s[0] = P
s[1] = y
s[5] = n
s[-1] = n
s[-2] = o
✍ 把字符串改成你的英文名,数一数每个字母的编号,把 s[0]、s[-1] 对应的字母写下来。

🤔 想一想:s[6] 会取出什么?试试看会报什么错(超出长度啦)。

Python示例 3 · 示例 3:切片——剪一段 / 反转
# 用切片取字符串的一段
s2 = "Python"
print("s2[0:3] = " + s2[0:3])    # 取第0~2个:Pyt
print("s2[:3] = " + s2[:3])      # 省略开头=从0开始
print("s2[3:] = " + s2[3:])      # 从第3个到末尾
print("s2[::-1] = " + s2[::-1])  # 反转:nohtyP
运 行 结 果
s2[0:3] = Pyt
s2[:3] = Pyt
s2[3:] = hon
s2[::-1] = nohtyP
✍ 试试 s2[1:4] 取出哪几个字符?先口算(应该是 yth),再上机验证。

🤔 想一想:切片 s2[0:3] 为什么没有第 3 个字符 t?记住切片「顾头不顾尾」。

Python示例 4 · 示例 4:字符串方法——变大写、变小写、替换
# 常用字符串方法演示
s = "Hello Python"
print("原字符串:" + s)
print("转大写:" + s.upper())
print("转小写:" + s.lower())
print("把o换成0:" + s.replace("o", "0"))
print("全是数字吗:" + str("123".isdigit()))
print("全是大写吗:" + str("ABC".isupper()))
运 行 结 果
原字符串:Hello Python
转大写:HELLO PYTHON
转小写:hello python
把o换成0:Hell0 Pyth0n
全是数字吗:True
全是大写吗:True
✍ 把 replace("o", "0") 改成 replace("l", "L") 运行。isdigit 和 isupper 的返回值是什么类型?

🤔 想一想:s.replace("o","0") 之后,s 本身变了吗?打印 s 看看——它还是 "Hello Python",方法返回的是新字符串。

Python示例 5 · 主项目:随机密码生成器
# 第11课主项目:随机密码生成器
# 功能:生成随机密码,并检查密码强度
import random
import string

# 字符池:大小写字母 + 数字 + 特殊符号
all_chars = string.ascii_letters + string.digits + "!@#$%^&*"

length = int(input("请输入密码长度(建议8位以上):"))
password = ""
for i in range(length):              # 拼 length 次
    password = password + random.choice(all_chars)  # 每次随机抽一个字符接在后面
print("生成的密码是:" + password)

# ---- 检查强度:数一数有几种字符 ----
upper_count = 0    # 大写字母计数
lower_count = 0    # 小写字母计数
digit_count = 0    # 数字计数
for c in password:
    if c.isupper():
        upper_count = upper_count + 1
    elif c.islower():
        lower_count = lower_count + 1
    elif c.isdigit():
        digit_count = digit_count + 1

if len(password) >= 8 and upper_count > 0 and lower_count > 0 and digit_count > 0:
    print("密码强度:强")
elif len(password) >= 6:
    print("密码强度:中")
else:
    print("密码强度:弱,建议加长")
运 行 结 果
请输入密码长度(建议8位以上):10
生成的密码是:Kp7!dQ2@xL
密码强度:强
✍ 完整敲一遍并运行。生成 6 位、8 位、12 位密码各一次,观察强度判断对不对。

🤔 想一想:循环里 password = password + random.choice(all_chars) 在做什么?(从空字符串开始,每轮尾巴上加一个随机字符——和累加器有点像!)

05

易错提醒

把最容易翻车的写法先亮出来,见一次、错一次、就会了。

易错点 1

索引从 1 开始数

✗ 错误写法
s = "Python"
print(s[1])  # 以为取 P
✓ 正确写法
s = "Python"
print(s[0])  # 才是 P
为什么:字符串第一个字符的索引是 0 不是 1!s[1] 取到的是第 2 个字符 y。编程里数数从 0 开始。
易错点 2

切片结束位置理解错

✗ 错误写法
s[0:3]  # 以为取到第3个
✓ 正确写法
s[0:3]  # 取第0~2个,第3个不取
为什么:切片「顾头不顾尾」:s[0:3] 只取 P、y、t 三个字符。想取到第 3 个,结束位置要写 4。
易错点 3

数字直接和字符串拼接

✗ 错误写法
print("长度是" + len(s))  # 报错
✓ 正确写法
print("长度是" + str(len(s)))
为什么:+ 两边必须都是字符串。len(s) 返回的是数字,要先 str() 转成文字才能拼。这和 str(9) 的道理一样。
06

课堂练习(分层)

基础题人人过关,进阶题鼓励尝试,挑战题给学有余力的孩子。参考答案给老师做巡视对照。

A组 · 基础(人人必做)课堂完成,老师巡回指导
  1. 运行密码生成器,生成一个 10 位密码,抄在练习本上,并说出它属于强/中/弱哪一档。 (提示:10 位密码通常都是「强」。)
  2. 写代码:让用户输入一句话,输出它的长度、转大写、转小写三种结果。 (提示:len()、upper()、lower() 三件套。)
B组 · 进阶(鼓励尝试)课堂完成,老师巡回指导
  1. 写「取首尾」:输入一个词,输出它的第一个字符和最后一个字符。 (提示:s[0] 和 s[-1]。)
  2. 写「把 a 变 @」:输入一句话,把里面所有的字母 a 都替换成 @ 再输出。 (提示:s.replace("a", "@")。)
C组 · 挑战(学有余力)课堂完成,老师巡回指导
  1. 写「回文判断器」:输入一个词,判断正读反读是否一样(如 aba、上海自来水来自海上)。 (提示:if s == s[::-1]。)
  2. 写「邮箱检查」:输入一个邮箱地址,用 if "@" in s: 判断有没有 @,有就输出"格式正确"。 (提示:in 可以判断字符串里有没有某个字符。)
07

闯关小测

收尾前 10 分钟,用口答 / 举手抢答把今天的关键点过一遍。

闯关 1先举手回答,再对答案

字符串 "Python" 的第 1 个字符是 s[0] 还是 s[1]?

答案:s[0] = "P"。

💡 编程里数数从 0 开始。

闯关 2先举手回答,再对答案

s[-1] 取的是哪个字符?

答案:最后一个字符。

💡 负数索引从右往左数,-1 是倒数第一个。

闯关 3先举手回答,再对答案

s[0:3] 取出的是哪几个字符?

答案:第 0、1、2 个(3 个字符)。

💡 切片顾头不顾尾,第 3 个取不到。

闯关 4先举手回答,再对答案

"ha" * 3 等于什么?len("a b") 等于几?

答案:"hahaha";3(空格也算)。

💡 * 是重复,len 是数长度。

闯关 5先举手回答,再对答案

想把字符串 "abc" 变成 "ABC",用哪个方法?

答案:s.upper()。

💡 lower() 是变小写,isdigit() 是问「是不是数字」。

08

小结 · 作业与预告

用一句话带走今天的内容;作业分层布置,作品记得保存进成长档案。

🖍️本课小结(一句话 + 板书核心词)
一句话带走让字符串学会「变身」:拼接、重复、数长度、取字符、切一段、转大小写——再用随机数造一个自己的密码生成器!
字符串 = 一串珠子索引从 0 开始 / s[-1]切片 s[起:止] 顾头不顾尾s[::-1] 反转upper/lower/replaceisdigit/isupper 自报家门字符池拼密码
必做 · 人人过关
  1. 必做题:写「名字翻转器」——输入你的名字,用切片 s[::-1] 把它倒过来输出,看看倒着读是什么效果。
  2. 把密码生成器保存为「第11课_密码生成器.py」放进作品文件夹(老师检查)。
选做 · 鼓励挑战
  1. 选做题:写「关键词替换」——输入一句话,把其中的"讨厌"替换成"喜欢",再输出(注意:这句咒语要用 replace 念)。
  2. 选做题:写「首字母大写名片」——输入英文名,输出它的长度、首字母大写版(s[0].upper() + s[1:])。
思考 · 烧脑一下
  1. 思考题:字符串可以修改吗?试试 s = "hello",然后写 s[0] = "H",看看会发生什么(会报错!字符串不能改)。
  2. 想一想:为什么密码强度要同时检查大小写和数字?只用数字的密码为什么不安全?
👉 下节课预告:下一课《期末项目》:把一学期学的 print、变量、if、循环、random、字符串全部用起来,做出属于你的文字冒险游戏《神秘城堡》!