Python 基础 · 课堂讲义

共 9 章 · 129 个代码示例郎老师 · Python

表达式 · 类型 · 循环 · 字符串 · 凯撒加密

每一段代码上面都有「接下来我们要做什么」任务提示,下面配了「豆豆老师小课堂」:先讲一句话目的,再讲实现思路、逐行注释和输出为什么是这样。学完一个知识点,马上有「豆豆点一点」小练习和每章末尾的小测验——点点选项,选哪个都有讲解!

共 131 节小课堂 · 9 个答疑站 · 9 套小测验 + 知识点练习

提示:① 先读代码上方的「接下来」提示,想想“这一步要做什么”;② 点一下每段代码下方的「豆豆老师小课堂」卡片展开讲解;③ 遇到「豆豆点一点」/「豆豆小测验」,随便点个选项,看看讲解学得更牢;④ 每学到一个新概念,就会有一块「新积木」在你面前亮起来,隔一段还有「积木收藏盒」帮你盘点。

豆豆老师

🧭 豆豆老师的 Python 概念地图

学编程就像搭积木:程序就是由一些「积木」组成的——语句、表达式、运算符……这些积木我们一个一个学:学到哪个,哪块积木就会出现在你面前,地图越拼越完整!

程序 = 一串「语句」statement(先记住这个大框架就够了)
👇 往下学:每出现一个新概念,就有一块新积木亮起来;隔一段还有「积木收藏盒」帮你盘点。学到最后,整张地图就拼完啦!
01

表达式与语句

expression

include operator and operand

  • 2 + 3
  • 2 < 3
  • 2 < 3 and 5 < 4
  • width * height
  • terminal expression
    • name
    • 3
    • 'a'

each expression will be evaluated

statement

input-process-output

  • input function/statement
  • output function/statement
  • assignment statement
🧱 新积木 1/10值 value3、'a' 这种具体的“东西”,电脑一看就懂,直接等于它自己
🧱 新积木 2/10表达式 expression会算出“值”的算式:2 + 3 会算出 5
接下来把数字 2 存进变量 a——认识“变量”:给数据贴一张名字标签,以后叫 a 就能找到它。
In [1]
a = 2
name = 'arianna'
🧱 新积木 3/10变量 variable给数据贴一张名字标签,以后叫它就能找到
接下来让电脑问用户长方形的宽和高,把答案存起来,下一步就要算面积了。
In [2]
# ask user input width and height of a rectangle
# output area of rectangle
接下来用 float 这个“翻译机”,把文字 '2.3' 翻译成小数 2.3——看看翻译得对不对。
In [3]
float('2.3')
Out
2.3
接下来先猜一猜:文字 '2.2' 翻译成整数会怎样?小数部分是被砍掉还是四舍五入?
In [4]
int('2.2')
ValueError: invalid literal for int() with base 10: '2.2'
---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)Cell In[4], line 1
----> 1 int('2.2')
ValueError: invalid literal for int() with base 10: '2.2'
接下来文字 '2' 翻译成整数 2——int 只收“整整齐齐”的整数文字,记住它的脾气。
In [5]
int('2')
Out
2
接下来数字加法:123 + 4。两个数字放一起,电脑按数学规则算。
In [6]
123 + 4
Out
127
接下来文字拼接:'123' + '4'。都是文字,中间的 + 就变成“粘在一起”,可不是加法哦。
In [7]
'123' + '4' 
Out
'1234'
🧱 新积木 4/10运算符 + 操作数 operator + operand运算的两边都是表达式:+ 号两边站的,就是操作数
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. 下面代码会输出什么? print('123' + '4')

2. 下面代码会输出什么? print(123 + 4)

接下来数字 2 加文字 '2'——两种类型混搭,猜猜 Python 会怎么反应?
In [8]
2 + '2'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
---------------------------------------------------------------------------TypeError                                 Traceback (most recent call last)Cell In[8], line 1
----> 1 2 + '2'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
接下来这次反过来:文字 '2' 加数字 2。看看报错信息,记住这个坑。
In [9]
'2' + 2
TypeError: can only concatenate str (not "int") to str
---------------------------------------------------------------------------TypeError                                 Traceback (most recent call last)Cell In[9], line 1
----> 1 '2' + 2
TypeError: can only concatenate str (not "int") to str
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. 下面代码会输出什么? print('2' + 2)

2. 想让 '2' + 2 正常运行,应该先?

接下来用 input 问用户要一个数,存进变量 a——先跑跑看它返回的是什么。
In [11]
a = input("num: ")
b = input("num: ")

c = a + b
print(c)
num:  22
num:  33
2233
🧱 新积木 5/10输入语句 input statement让电脑停下来等你打字,把答案拿进来
接下来再问一次 input,这次重点看:拿到手的到底是数字还是文字?
In [12]
a = input("num: ")
b = input("num: ")

c = a + b
print(c)
num:  2.2
num:  3.3
2.23.3
接下来请 type 侦探出场:查一查 '2' 是什么类型?
In [13]
# input function return str type value
🧱 新积木 6/10函数调用 function callint() float() str() 是“翻译机”,传进一个值,返回一个新值
接下来再查:数字 2 是什么类型?和 '2' 比一比,差一个引号差多少。
In [14]
type('2')
Out
str
接下来双引号和单引号里的 2,类型一样吗?type 一下见分晓。
In [15]
type(2)
Out
int
🧰 积木收藏盒 · 学到这里,你已经点亮 4 块积木
值 value表达式 expression变量 variable运算符+操作数 operator + operand
新学的积木会自动掉进盒子,继续往下学吧!
接下来带提示的 input:括号里的 'num:' 是参数——input 函数要的“小纸条”。
In [16]
a = input("num: ")  # num: is argument of input function
b = input("num: ")

a = int(a) # f(f(g(x)))
b = int(b) # a, b argument

c = a + b
print(c)
num:  2
num:  3
5
接下来查查你的名字 arianna 是什么类型?文字都是同一个家族。
In [18]
type("2"), type('2')
Out
(str, str)
接下来再确认一次:不管双引号单引号,文字统统是 str 类型。
In [19]
type("arianna"), type("arianna")
Out
(str, str)
接下来组合拳:先 input 问用户,再用 int 把文字翻译成整数,一步到位。
In [20]
a = int(input("num: "))  # num: is argument of input function
b = int(input("num: "))

c = a + b
print(c)
num:  2
num:  3
5
接下来再看一遍这个组合——input 和 int 是怎么手拉手配合的。
In [21]
a = int(input("num: "))  # num: is argument of input function
b = int(input("num: "))

c = a + b
print(c)
num:  2.3
ValueError: invalid literal for int() with base 10: '2.3'
---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)Cell In[21], line 1
----> 1 a = int(input("num: "))  # num: is argument of input function
      2 b = int(input("num: "))
      4 c = a + b
ValueError: invalid literal for int() with base 10: '2.3'
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. a = int(input()) 用户输入 5,a 的类型是?

2. 不写 int(),直接 a = input(),用户输入 5,a 的类型是?

接下来先用 print 亮出一句提示,让用户知道要输入什么,下一步才问。
In [22]
print("please input a number: ")
a = int(input("num: "))  # num: is argument of input function
b = int(input("num: "))

c = a + b
print(c)
please input a number: 
num:  2.3
ValueError: invalid literal for int() with base 10: '2.3'
---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)Cell In[22], line 2
      1 print("please input a number: ")
----> 2 a = int(input("num: "))  # num: is argument of input function
      3 b = int(input("num: "))
      5 c = a + b
ValueError: invalid literal for int() with base 10: '2.3'
🧱 新积木 7/10输出语句 print statement把“值”显示到屏幕上
接下来换个写法:print 提示和 input 读取分开做,看看顺序的重要性。
In [23]
print("please input a number: ")
a = float(input("num: "))  # num: is argument of input function
b = float(input("num: "))

c = a + b
print(c)
please input a number: 
num:  2.3
num:  2.333
4.633
🧰 积木收藏盒 · 学到这里,你已经点亮 7 块积木
值 value表达式 expression变量 variable运算符+操作数 operator + operand输入语句 input函数调用 function call输出语句 print
新学的积木会自动掉进盒子,继续往下学吧!
豆豆老师

豆豆答疑站

课堂上同学们常问的问题,先自己想,再看答案。

💬 '2' + 3 为什么报错?

加号两边“性格不合”:左边 '2' 是文字(str),右边 3 是数字(int)。Python 说:文字只能跟文字拼接。想让它们相加,得先 int('2') 把文字翻译成数字。

📌 来自课堂:学生混淆了文字拼接和数字相加

💬 value 到底是什么?

value(值 /ˈvæljuː/)就是“一个具体的数或文字”,比如 3、'a'、2.5。表达式算完会得到一个 value,变量存的也是 value。

📌 基础概念

💬 expression、operator、operand 怎么记?

expression 表达式 /ɪkˈspreʃn/:一段会算出答案的代码;operator 运算符 /ˈɒpəreɪtə/:干活的符号(+ - *);operand 操作数 /ˈɒpərænd/:被运算的数。2 + 3 里,+ 是 operator,2 和 3 是 operand。

📌 课堂术语

豆豆老师

豆豆小测验

点一点选项,不管选哪个都会有讲解。选错了不丢人,看懂解释就赚到了!

1. 表达式 2 + 3 的结果是什么?

2. 2 + 3 里,哪个是运算符(operator)?

3. 值(value)可能是以下哪种?

02

算术与字符串运算

接下来数字乘法:2 × 4。数字之间的 * 就是数学里的乘号。
In [24]
2 * 4
Out
8
接下来文字 × 4:'2' 会复制 4 遍变成 '2222'——先猜再看输出。
In [25]
'2' * 4
Out
'2222'
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. 下面代码会输出什么? print('2' * 4)

2. 下面代码会输出什么? print('ab' * 3)

接下来任务:让用户输入宽和高,算出长方形面积。先自己打草稿,再往下看。
In [29]
# ask user input a number with prompt width:
# input function return the str (string) value user input
# use float function convert the string user input to float number type
# for arithmetic operation and then
# assign the retrun value of float to variable width

# because input and float both return value or tell us a result
# just like expression will be evaluated to specific value
# so also called function call expression

width = float(input("width: "))  # num: is argument of input function
height = float(input("height: "))

area = width * height
print(area)

# basic concept
width:  2
height:  3
6.0
接下来BMI 大任务的开场白——先看看我们接下来要解决什么问题。
In [30]
# bmi 
# ask user input weigth and height
# bmi is body mass index
# weight divide (power of height)
# weight in kg
# height in m
接下来把体重输入翻译成小数,存进变量 w,准备算 BMI。
In [33]
w = float(input())
h = float(input())

bmi = w / (h ** 2)

print('bmi is: ' + bmi)
 2
 3
TypeError: can only concatenate str (not "float") to str
---------------------------------------------------------------------------TypeError                                 Traceback (most recent call last)Cell In[33], line 6
      2 h = float(input())
      4 bmi = w / (h ** 2)
----> 6 print('bmi is: ' + bmi)
TypeError: can only concatenate str (not "float") to str
接下来再写一遍——这次故意输入一个非数字,看看程序怎么应对。
In [35]
w = float(input())
h = float(input())

bmi = w / (h ** 2)

print('bmi is: ' + str(bmi))
 64
 169
bmi is: 0.0022408178985329646
接下来第三遍:试试输入超大体重,程序会不会自己拦住它?
In [37]
w = float(input())
h = float(input("height(m)"))

bmi = w / (h ** 2)

print('bmi is: ' + str(bmi))
 64
height(m) 1.69
bmi is: 22.40817898532965
接下来发现问题了:身高输了错的值,程序直接往下跑——它需要一个“守卫”。
In [38]
# if user input invalid height
# prompot user you input invalid or error value
# just once
🧱 新积木 8/10条件语句 if statement电脑按条件选一条路走,比如“身高不合法就提示错误”
接下来同样是非法输入——想一想:程序该怎么拦住这种捣乱?
In [39]
# if user input invalid value
# ask user input value until user input valid value 
接下来给体重加上 while 守卫:不合法就重新问,直到输入正确为止。
In [40]
w = float(input())
h = float(input("height(m)"))

bmi = w / (h ** 2)

print('bmi is: ' + str(bmi))
 2
height(m) 3
bmi is: 0.2222222222222222
🧰 积木收藏盒 · 学到这里,你已经点亮 8 块积木
值 value表达式 expression变量 variable运算符+操作数 operator + operand输入语句 input函数调用 function call输出语句 print条件语句 if
新学的积木会自动掉进盒子,继续往下学吧!
豆豆老师

豆豆答疑站

课堂上同学们常问的问题,先自己想,再看答案。

💬 '2' * 4 为什么是 2222 而不是 8?

因为 '2' 是文字不是数字。文字 × 数字 = “把这个文字复制几遍”,所以 '2' × 4 = '2222'。这就像复印机:复印 4 次,出来的还是那行字,只是多了几份。

📌 来自课堂:复印机比喻

💬 2 * 4 和 '2' * 4 到底差在哪?

差在类型。数字 × 数字 = 数学乘法(8);文字 × 数字 = 复制拼接('2222')。类型决定运算符的“性格”,这就是为什么 Python 那么看重类型。

📌 课堂重点

豆豆老师

豆豆小测验

点一点选项,不管选哪个都会有讲解。选错了不丢人,看懂解释就赚到了!

1. '2' * 4 的输出是?

2. 2 + '2' 会怎样?

3. 123 + 4 和 '123' + '4' 的结果分别是?

03

BMI 与条件判断

接下来if 条件入门:num 等于 2 时做什么?条件判断让程序会“选择”。
In [ ]
num = 2

if num % 2 == 0:
    print('even')
else:
    print('odd')
接下来给 BMI 加第一道判断——体重在不在合理范围?
In [42]
weight = float(input())
height = float(input("height(m)"))

if height >= 2.5:
    print('the height is invalid')
else:
    bmi = weight / (height * height)
    print('bmi is: ' + str(bmi))
 60
height(m) 1.69
bmi is: 21.007667798746546
接下来再补一层判断:这次拦身高,不合法就重来。
In [43]
weight = float(input())
height = float(input("height(m)"))

if height >= 2.5:
    print('the height is invalid')
else:
    bmi = weight / (height * height)
    print('bmi is: ' + str(bmi))
 2
height(m) 22
the height is invalid
接下来判断加守卫:输入合法才继续,程序开始“有原则”了。
In [44]
weight = float(input())
height = float(input("height(m)"))

while weight > 2.5:
    height = float(input("please input a valid height(m) < 2.5: "))

print(height)
 60
height(m) 22
please input a valid height(m) < 2.5:  33
please input a valid height(m) < 2.5:  22
please input a valid height(m) < 2.5:  -2
KeyboardInterrupt: Interrupted by user
---------------------------------------------------------------------------KeyboardInterrupt                         Traceback (most recent call last)Cell In[44], line 5
      2 height = float(input("height(m)"))
      4 while weight > 2.5:
----> 5     height = float(input("please input a valid height(m) < 2.5: "))
      7 print(height)
File /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/ipykernel/kernelbase.py:1282, in Kernel.raw_input(self, prompt)
   1280     msg = "raw_input was called, but this frontend does not support input requests."
   1281     raise StdinNotImplementedError(msg)
-> 1282 return self._input_request(
   1283     str(prompt),
   1284     self._parent_ident["shell"],
   1285     self.get_parent("shell"),
   1286     password=False,
   1287 )
File /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/ipykernel/kernelbase.py:1325, in Kernel._input_request(self, prompt, ident, parent, password)
   1322 except KeyboardInterrupt:
   1323     # re-raise KeyboardInterrupt, to truncate traceback
   1324     msg = "Interrupted by user"
-> 1325     raise KeyboardInterrupt(msg) from None
   1326 except Exception:
   1327     self.log.warning("Invalid Message:", exc_info=True)
KeyboardInterrupt: Interrupted by user
接下来继续打磨 BMI:把错误输入统统挡在门外。
In [46]
weight = float(input())
height = float(input("height(m)"))

while height > 2.5:
    height = float(input("please input a valid height(m) < 2.5: "))

print(height)
 64
height(m) 22
please input a valid height(m) < 2.5:  33
please input a valid height(m) < 2.5:  -2
-2.0
接下来换个角度写:哪个条件先查、哪个后查,顺序有讲究。
In [47]
weight = float(input())
height = float(input("height(m)"))

# loop repeat, condition loop
while height > 2.5 or height <= 0: # guard
    height = float(input("please input a valid height(m) < 2.5: "))

print(height)
 60
height(m) 22
please input a valid height(m) < 2.5:  -2
please input a valid height(m) < 2.5:  1.69
1.69
接下来BMI 守卫升级:体重范围改成 0 到 500,试试边界值。
In [49]
weight = float(input())
height = float(input("height(m)"))

while weight <= 0 or weight > 500:
    weight = float(input("valid weight: "))

# loop repeat, condition loop
while height > 2.5 or height <= 0: # guard
    height = float(input("please input a valid height(m) < 2.5: "))

print(height)

bmi = weight / (height * height)
print('bmi is: ' + str(bmi))
 -2
KeyboardInterrupt: Interrupted by user
---------------------------------------------------------------------------KeyboardInterrupt                         Traceback (most recent call last)Cell In[49], line 2
      1 weight = float(input())
----> 2 height = float(input("height(m)"))
      4 while weight <= 0 or weight > 500:
      5     weight = float(input("valid weight: "))
File /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/ipykernel/kernelbase.py:1282, in Kernel.raw_input(self, prompt)
   1280     msg = "raw_input was called, but this frontend does not support input requests."
   1281     raise StdinNotImplementedError(msg)
-> 1282 return self._input_request(
   1283     str(prompt),
   1284     self._parent_ident["shell"],
   1285     self.get_parent("shell"),
   1286     password=False,
   1287 )
File /Library/Frameworks/Python.framework/Versions/3.13/lib/python3.13/site-packages/ipykernel/kernelbase.py:1325, in Kernel._input_request(self, prompt, ident, parent, password)
   1322 except KeyboardInterrupt:
   1323     # re-raise KeyboardInterrupt, to truncate traceback
   1324     msg = "Interrupted by user"
-> 1325     raise KeyboardInterrupt(msg) from None
   1326 except Exception:
   1327     self.log.warning("Invalid Message:", exc_info=True)
KeyboardInterrupt: Interrupted by user
接下来最后一版守卫:看看程序遇到各种怪输入还稳不稳。
In [51]
weight = float(input())
while weight <= 0 or weight > 500:
    weight = float(input("valid weight: "))

height = float(input("height(m)"))

# loop repeat, condition loop
while height > 2.5 or height <= 0: # guard
    height = float(input("please input a valid height(m) < 2.5: "))

bmi = weight / (height * height)
print('bmi is: ' + str(bmi))
 -2
valid weight:  1000
valid weight:  2000
valid weight:  200
height(m) -2
please input a valid height(m) < 2.5:  1111
please input a valid height(m) < 2.5:  1.69
1.69
bmi is: 70.02555932915514
接下来身高也要守卫:0 到 2.5 之间才算合法,超出就重新问。
In [53]
height = float(input("height(m)"))

while height <= 0 or height > 2.5:
    if height > 30: # how to construct condition
        ans = input("do you mean centimeter?[yes/no] ")
        if ans == 'yes':
            height = height / 100 # convert cm to m
            break
        else:
            height = float(input("please input a valid height(m) < 2.5: "))
    else:
        height = float(input("please input a valid height(m) < 2.5: "))

print(height)
height(m) 170
do you mean centimeter?[yes/no]  yes
1.7
接下来身高守卫再确认:输入 1.7 放行,输入 3 或 -5 会怎样?
In [54]
height = float(input("height(m)"))

while height <= 0 or height > 2.5:
    if height > 30: # how to construct condition
        ans = input("do you mean centimeter?[yes/no] ")
        if ans == 'yes':
            height = height / 100 # convert cm to m
            break
        else:
            height = float(input("please input a valid height(m) < 2.5: "))
    else:
        height = float(input("please input a valid height(m) < 2.5: "))

print(height)
height(m) 170
do you mean centimeter?[yes/no]  no
please input a valid height(m) < 2.5:  20
please input a valid height(m) < 2.5:  1.69
1.69
豆豆老师

豆豆答疑站

课堂上同学们常问的问题,先自己想,再看答案。

💬 height = height / 100 有必要吗?

有!用户可能把身高输成厘米(170),可程序要的是米(1.7)。这一句就是“单位换算翻译机”:把 170 厘米 ÷ 100 变成 1.7 米,再存回 height。学生问过这个问题,郎老师现场演示了不换算会算出什么离谱的 BMI。

📌 来自课堂:学生真实提问

💬 input 返回的到底是什么类型?

永远是文字(str)!哪怕你输入的是 60,拿到手也是 '60'。所以要用 int(input()) 或 float(input()) 把它“翻译”成数字,才能做算术。

📌 课堂反复强调

💬 while 当守卫是怎么工作的?

while 条件成立就一直循环。当“体重不在 0~500”时一直重新问,直到输入合法才放行——这就是“守卫”(guard),像保安一样把坏数据挡在门外。

📌 课堂概念

豆豆老师

豆豆小测验

点一点选项,不管选哪个都会有讲解。选错了不丢人,看懂解释就赚到了!

1. input() 返回的值是什么类型?

2. 身高 170 输进来,想变成 1.7 米,应写?

3. while 当守卫的意思是?

04

while 循环与乘法表

接下来while 循环第一课:i 从 0 开始,数到几会停?
In [55]
i = 0

while i < 5:
    print(i)
    i += 1 
0
1
2
3
4
🧱 新积木 9/10循环语句 while loop把一段话一遍遍重复,别忘了加计数器 i += 1
接下来再试一个 while:让 i 自己加 1,看看循环转了几圈。
In [57]
i = 0
total = 0
while i < 5:
    print(i)
    total += i
    i += 1 

print(total)
0
1
2
3
4
10
接下来九九乘法表第一行:先找规律——哪一部分在重复?找到它,循环就写出来了。
In [58]
# 2x1=2 2x2=4

i = 1
while i < 5:
    print(str(i) + "*5=" + str(i*5))
    i += 1
1*5=5
2*5=10
3*5=15
4*5=20
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. 下面代码会输出什么? i = 0 while i < 3: print(i) i += 1

2. 把上面的 i += 1 删掉,会怎样?

接下来最熟悉的 hello——但今天看的是它打完后怎么换行。
In [59]
print("hello")
print("world")
print('very')
hello
world
very
接下来print 的 end 参数:原来“换行”是它默认干的事。
In [61]
print("hel\nlo", end="\n")
print("world")
print('very')
hel
lo
world
very
接下来把 end 改成 %:输出末尾就变成 % 了——end 可以换成任何东西。
In [63]
print("hel\nlo", end="%")
print("world", end="%")
print('very')
hel
lo%world%very
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. print('a', end='') print('b') 会输出?

2. print('a', end='%') print('b') 会输出?

接下来乘法表一行行搭起来:先看看 2 × 1 到 2 × 9 怎么用循环写。
In [64]
# 2x1=2 2x2=4

i = 1
while i < 5:
    print(str(i) + "*5=" + str(i*5), end=" ")
    i += 1
1*5=5 2*5=10 3*5=15 4*5=20 
接下来再往上搭:这一行是 3 的乘法表,哪里变了?
In [66]
# 2x1=2 2x2=4
num = 5
i = 1
while i < num + 1:
    print(str(i) + "*5=" + str(i*5), end=" ")
    i += 1
print()
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
接下来继续:4 的乘法表。规律已经出现,重复的代码越来越短。
In [67]
# 2x1=2 2x2=4
num = 5
i = 1
while i < num + 1:
    print(str(i) + "*5=" + str(i*5), end=" ")
    i += 1
print()

num = 6
i = 1
while i < num + 1:
    print(str(i) + "*5=" + str(i*5), end=" ")
    i += 1
print()
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 
接下来最后一块:5 的乘法表。你有没有发现——变的是数字,不变的是结构?
In [68]
# 2x1=2 2x2=4
num = 5
i = 1
while i < num + 1:
    print(str(i) + "*5=" + str(i*5), end=" ")
    i += 1
print()

num = 6
i = 1
while i < num + 1:
    print(str(i) + "*5=" + str(i*5), end=" ")
    i += 1
print()


num = 7
i = 1
while i < num + 1:
    print(str(i) + "*5=" + str(i*5), end=" ")
    i += 1
print()
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 6*5=30 7*5=35 
接下来收尾对比:print 的默认换行行为,再确认一次。
In [70]
print("hello")
print()
print("world")
hello

world
🧰 积木收藏盒 · 学到这里,你已经点亮 9 块积木
值 value表达式 expression变量 variable运算符+操作数 operator + operand输入语句 input函数调用 function call输出语句 print条件语句 if循环语句 while
新学的积木会自动掉进盒子,继续往下学吧!
豆豆老师

豆豆答疑站

课堂上同学们常问的问题,先自己想,再看答案。

💬 写 while 忘了 i += 1 会怎样?

会无限循环!i 永远不变,条件永远成立,程序永远跑不完。课堂上就发生过:学生写完循环忘了“让计数器前进”,程序卡死。记住:while 循环体里必须有让条件“走向结束”的那一步。

📌 来自课堂:学生真实事故

💬 为什么计数器要从 0 开始?

这是计算机的习惯(也和你学的字符串索引一致)。0 代表“还没开始”,循环第 1 次 i=0、第 2 次 i=1……数到 n-1 就结束。用 0 开始,很多公式(比如 5-i)会更好写。

📌 课堂重点

💬 end 参数是干什么的?

print 默认打完一行就换行(end='\n')。把 end 改成别的(比如 '' 或 '%'),它就不换行了,下一个 print 接着往后写——打印图案就靠它。

📌 课堂重点

豆豆老师

豆豆小测验

点一点选项,不管选哪个都会有讲解。选错了不丢人,看懂解释就赚到了!

1. 下面哪段会无限循环?

2. print('a', end='') 再 print('b'),输出是?

3. 九九乘法表的“重复部分”是?

05

嵌套循环与星号图案

*****
*****
*****
*****
*****

*
**
***
****

*****
接下来打印星号前先认识 lines:它记录“现在是第几行”。
In [72]
lines = 1

while lines <= 5:
    stars = 1
    row = ""
    while stars <= lines:
        row += "*"
        stars += 1
    print(row)
    lines += 1
*
**
***
****
*****
🧱 新积木 10/10复合语句(嵌套) nested statement语句里还能再装语句,一层套一层
接下来再看一眼 lines 怎么变——它是循环的“计数器”。
In [74]
lines = 1

while lines <= 5:
    stars = 1
    
    while stars <= lines:
        print("*", end="")
        stars += 1
    print()
    lines += 1
*
**
***
****
*****
接下来新任务:倒三角——第 1 行 5 颗、第 2 行 4 颗。先填表格找公式。
In [ ]
*****
****
***
**
*
接下来偷看答案前,先想清楚“5 - lines + 1”里的 +1 为什么不能省。
In [76]
lines = 1

while lines <= 5:
    stars = 1
    row = ""
    while stars <= 5 - lines + 1:
        row += "*"
        stars += 1
    print(row)
    lines += 1
*****
****
***
**
*
接下来这是目标图:看看我们要打印的三角形长什么样。
In [ ]
*
***
*
***
*****
*
***
*****
*******
接下来再看一遍目标图——数一数每一行的星号个数。
In [ ]
    *
   **
  ***
 ****
*****
接下来记住这个形状:它是接下来所有图案练习的“地基”。
In [ ]
*
***
*
***
*****
*
***
*****
*******
接下来代码第一版:i 从 1 开始,一行行把三角形打出来。
In [77]
i = 1

while i <= 5:
    
    i += 1
接下来找重复:这四段三角形,什么不变?什么在变?(提示:只换了一个数)
In [90]
lines = 1

while lines <= 2:
    stars = 1
    row = ""
    while stars <= lines * 2 - 1:
        row += "*"
        stars += 1
    print(row)
    lines += 1

lines = 1


while lines <= 3:
    stars = 1
    row = ""
    while stars <= lines * 2 - 1:
        row += "*"
        stars += 1
    print(row)
    lines += 1
lines = 1


while lines <= 4:
    stars = 1
    row = ""
    while stars <= lines * 2 - 1:
        row += "*"
        stars += 1
    print(row)
    lines += 1


lines = 1


while lines <= 5:
    stars = 1
    row = ""
    while stars <= lines * 2 - 1:
        row += "*"
        stars += 1
    print(row)
    lines += 1
*
***
*
***
*****
*
***
*****
*******
*
***
*****
*******
*********
接下来答案揭晓前最后一想:如果有个东西能替我们依次变成 2、3、4、5,是不是只需一段代码?
In [94]
layer = 2

while layer <= 5:
    lines = 1
    while lines <= layer:
        stars = 1
        row = ""
        while stars <= lines * 2 - 1:
            row += "*"
            stars += 1
        print(row)
        lines += 1
        
    layer += 1
*
***
*
***
*****
*
***
*****
*******
*
***
*****
*******
*********
接下来圣诞树来了:layer 是层数——先看它和三角形的区别。
In [103]
layer = 2

while layer <= 5:
    lines = 0
    while lines < layer:
        stars = 0
        row = ""
        while stars < lines * 2 + 1:
            row += "*"
            stars += 1
        print(row)
        lines += 1
        
    layer += 1
*
***
*
***
*****
*
***
*****
*******
*
***
*****
*******
*********
接下来圣诞树的目标图:数一数每层每行的星号,找 2n-1 的规律。
In [ ]
   * 
  ***
   *
  ***
 *****
   *
  ***
 *****
*******
   *
   *
   *
   *
接下来圣诞树完整代码:外层管层、中层管行、内层管星——三个循环叠罗汉。
In [104]
layer = 2

while layer <= 5:
    lines = 0
    while lines < layer:
        stars = 0
        row = ""
        while stars < lines * 2 + 1:
            row += "*"
            stars += 1
        print(row)
        lines += 1
        
    layer += 1
*
***
*
***
*****
*
***
*****
*******
*
***
*****
*******
*********
🧰 积木收藏盒 · 学到这里,你已经点亮 10 块积木
值 value表达式 expression变量 variable运算符+操作数 operator + operand输入语句 input函数调用 function call输出语句 print条件语句 if循环语句 while复合语句 nested
🎉 10 块积木全部拼完,整张概念地图完成啦!
豆豆老师

豆豆答疑站

课堂上同学们常问的问题,先自己想,再看答案。

💬 外层管行、内层管星,怎么理解?

外层循环转一圈 = 打印一行;内层循环转一圈 = 打印这一行里的一个星。外层慢(1 秒一行),内层快(1 秒好几个星)。先看外层,再想内层。

📌 课堂口诀

💬 为什么第 n 行就是 n 颗星?

这是你自己找出来的规律!行号 1→1 颗、2→2 颗……所以“星数 = 行号”。规律找对了,代码就是把这个规律翻译成循环。

📌 找规律方法

💬 倒三角的公式 5 - lines + 1 为什么有 +1?

第 1 行要 5 颗:5 - 1 = 4,少了 1 颗,所以要 +1 补回来。把行号代进去验算:第 1 行 5-1+1=5 ✓,第 5 行 5-5+1=1 ✓。

📌 课堂验算

豆豆老师

豆豆小测验

点一点选项,不管选哪个都会有讲解。选错了不丢人,看懂解释就赚到了!

1. 外层循环控制什么?

2. 第 n 行 n 颗星的三角形,第 4 行有几颗?

3. 倒三角第 3 行(总共 5 行)有几颗星?

06

综合练习:出租车计费

接下来综合大任务:出租车计费。先拆问题:起步费 + 超出费 + 等时费,再写代码。
In [106]
dist = int(input())
wait = int(input())

if dist <= 2:
    fee = 6.0
elif dist <= 10:
    fee = 6.0 + (dist - 2) * 1.8
else:
    fee = 6.0 + 8 * 1.8 + (dist - 10) * 1.8 * 1.5

fee = fee + wait // 3

fee = int(fee * 10 + 0.5) / 10.0

if fee == int(fee):
    print(int(fee))
else:
    print(fee)
 1 3
7
豆豆老师

豆豆答疑站

课堂上同学们常问的问题,先自己想,再看答案。

💬 int(c) == c 是啥意思?

c 是费用,可能是 9.5 或 9.0。int(c) 把小数部分砍掉。如果 int(c) == c,说明费用本来就是整数(比如 9.0 → 9),可以省掉小数。这是学生想出来的巧妙判断!

📌 来自课堂:学生的巧妙思路

💬 int(input()) 能一步做完吗?

能。input() 拿到文字,int() 立刻翻译成数字——两步并一步。等价于:a = input(); a = int(a)。

📌 课堂简化写法

💬 分段计费为什么要 if / elif?

因为费用要“看情况”:2 公里内一个价,超出 2 公里另一个价,超过 10 公里还要加价。if/elif 就是让程序按情况选一条路算。

📌 综合练习

豆豆老师

豆豆小测验

点一点选项,不管选哪个都会有讲解。选错了不丢人,看懂解释就赚到了!

1. int(9.0) == 9.0 的结果是?

2. a = int(input()) 等价于下面哪组?

3. 超过 10 公里的加价,该用哪个?

07

字符串索引与遍历

接下来让电脑问你一句话,再原样还给你——input 和 print 的第一支双人舞。
In [107]
a = input("> ")
>  2
接下来把老师的名字 langxm 存进变量 name——字符串变量诞生。
In [2]
name = "langxm"

# str is a sequence of characters
# index start from zero
接下来name[0]:取出第一个字符。记住:编号从 0 开始,不是 1!
In [3]
print(name[0])
l
接下来name[1]:第二个字符是谁?数一数 langxm 的第 2 个字母。
In [5]
print(name[1])
print(name[2])
print(name[3])
print(name[4])
print(name[5])
a
n
g
x
m
接下来name[6]:第 7 个字符?先数清楚名字到底有几个字母。
In [6]
print(name[6])
IndexError: string index out of range
---------------------------------------------------------------------------IndexError                                Traceback (most recent call last)Cell In[6], line 1
----> 1 print(name[6])
IndexError: string index out of range
接下来单引号也能存字符串——再练一次中括号取字符。
In [7]
name = 'langxm'
print(len(name))
6
接下来一句话也能一个字一个字取:msg[0] 是什么?
In [8]
msg = "very good"
print(len(msg))
9
接下来越界了会怎样?先猜,再看 Python 的报错长什么样。
In [9]
name = "langxm"
print(name[0])
print(name[1])
print(name[2])
print(name[3])
print(name[4])
print(name[5])
l
a
n
g
x
m
接下来再往深处取一次:超出长度的编号,会得到什么?
In [11]
name = "langxm"

i = 0

while i < len(name):
    print(name[i])
    i += 1
l
a
n
g
x
m
接下来'*' × 10:用乘法快速画一条星号线——字符串乘法的妙用。
In [12]
"*" * 10
Out
'**********'
接下来'abc ' × 4:一段文字复制 4 遍,看到规律了吗?
In [13]
"abc " * 4
Out
'abc abc abc abc '
接下来字符串加法:把名字和其他文字拼成一句完整的话。
In [14]
name = "langxm"

i = 0

rst = ""

while i < len(name):
    print(name[i])
    i += 1

print(rst)
# llaannggxxmm
l
a
n
g
x
m
接下来'a' + 'a' 等于什么?先猜——文字加文字是拼接,不是数学。
In [15]
"a" + "a"
Out
'aa'
接下来拼接升级:用变量拼句子,顺便看看空格怎么加。
In [17]
name = "langxm"

i = 0

rst = ""

while i < len(name):
    rst = rst + name[i] + name[i]
    i += 1

print(rst)
# llaannggxxmm
llaannggxxmm
接下来把名字复制成两遍:字符串 × 2 的小魔法。
In [18]
name = "langxm"

i = 0

rst = ""

while i < len(name):
    rst = rst + name[i] + name[i] + name[i]
    i += 1

print(rst)
# llaannggxxmm
lllaaannngggxxxmmm
接下来复制三遍呢?乘法的数字想写几就写几。
In [20]
name = "langxm"

i = 0

rst = ""

while i < len(name):
    rst = rst + name[i] * 4
    i += 1

print(rst)
# llaannggxxmm
llllaaaannnnggggxxxxmmmm
接下来拼接练习收尾:加法拼接 vs 乘法复制,你分得清吗?
In [ ]
name = "langxm"

i = 0

rst = ""

while i < len(name):
    # rst = rst + name[i] * 4
    
    i += 1

print(rst)
# mxgnal
接下来while 遍历你的名字:i 是索引,从 0 数到最后一个字符。
In [21]
name = "arianna"

print(name[-1])
print(name[-2])
print(name[-3])
print(name[-4])
print(name[-5])
print(name[-6])
a
n
n
a
i
r
接下来遍历名字——小心!循环体里别忘了 i += 1,否则会死循环。
In [22]
i = 0 
while i < len(name):
    print(name[i])
    i += 1
a
r
i
a
n
n
a
接下来更简单的遍历:for 循环直接“把每个字符拿过来”,不用管索引。
In [23]
for ch in name:
    print(ch)
a
r
i
a
n
n
a
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. 下面代码会输出什么? for ch in 'ab': print(ch)

2. for ch in 'ab': 循环会执行几次?

接下来for 循环再试:这次把每个字符原样打印出来。
In [24]
name = "arianna"

for i in range(len(name)):
    print(i)
0
1
2
3
4
5
6
接下来两个遍历对比:while 和 for,谁更省心?
In [25]
name = "arianna"

for i in range(len(name)):
    print(name[i])a
a
r
i
a
n
n
a
接下来用 range(len(name)) 拿到索引,再按索引取字符——两种工具都能用。
In [27]
name = "arianna"

for i in range(0, len(name)):
    print(i, name[i])
0 a
1 r
2 i
3 a
4 n
5 n
6 a
接下来倒着遍历:从最后一个字符往前取,想想怎么改循环。
In [28]
name = "arianna"

for i in range(0, len(name), 2):
    print(i, name[i])
0 a
2 i
4 n
6 a
接下来步长 -1:range 从后往前数,字符串就反过来了。
In [29]
name = "arianna"

for i in range(1, len(name), 2):
    print(i, name[i])
1 r
3 a
5 n
接下来倒序完整版:name[::-1] 一步搞定,或者用循环慢慢来。
In [32]
name = "arianna"

for i in range(len(name)-1, 0, -2):
    print(i, name[i])
6 a
4 n
2 i
接下来遍历综合练习:把名字拆成一个个字母排排站。
In [33]
name = "arianna"

for i in range(len(name)-1, 0, -1):
    print(i, name[i])
6 a
5 n
4 n
3 a
2 i
1 r
接下来字符串小练习收尾:'abc' 里的索引和长度,再数一遍。
In [34]
"abc"
"bcd"
Out
'bcd'
豆豆老师

豆豆答疑站

课堂上同学们常问的问题,先自己想,再看答案。

💬 索引为什么从 0 开始?

计算机数数从 0 开始(就像 while 循环的计数器)。name[0] 是第一个字符,name[6] 是第 7 个。这和你的计数器习惯一致,别弄混。

📌 课堂重点

💬 空格算字符吗?

算!len('a b') 是 3,不是 2。空格是合法字符,索引也要给它留位置。课堂上专门讲过这一点。

📌 来自课堂

💬 访问 name[99] 会怎样?

会报错:IndexError: string index out of range(索引超出范围)。字符串多长,索引最大就是 长度-1。

📌 课堂真实报错

豆豆老师

豆豆小测验

点一点选项,不管选哪个都会有讲解。选错了不丢人,看懂解释就赚到了!

1. name = 'langxm',name[0] 是?

2. len('a b') 等于?

3. 访问 name[99](name 只有 6 个字符)会?

08

凯撒加密

接下来凯撒加密开场:把明文 arianna 变成密文——先认识“加密”这个词。
In [36]
name = "arianna" # plain text

secret = "" # encrpyt secret

for ch in name:
    print(ch)
a
r
i
a
n
n
a
接下来认识 ord:字符 → 编号。字母在电脑里其实都是一个数字。
In [37]
# letter -> ascii code

ord('a')
Out
97
接下来认识 chr:编号 → 字符。ord 和 chr 是一对互逆的“翻译机”。
In [41]
# ascii code -> letter

chr(97) # character
Out
'a'
接下来查一查:a 的编号是多少?记住这个数字,后面有大用。
In [42]
asc_a = ord('a')

asc_b = asc_a + 1

chr(asc_b)
Out
'b'
接下来再看一眼 97——这就是小写字母 a 的“身份证号”。
In [43]
asc_a = ord('a')

asc_b = asc_a + 3

chr(asc_b)
Out
'd'
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. ord('b') 的结果是?

2. ord('a') + 3 然后 chr() 变回,得到?

接下来终极任务:把 arianna 每个字母往后挪 3 格。先想清楚四步:取字母→变编号→挪→变回。
In [44]
name = "arianna" # plain text

secret = "" # encrpyt secret

for ch in name:
    asc = ord(ch)
    encrypt = chr(asc + 3)
    secret += encrypt

print(secret)
duldqqd
接下来难题登场:xyz 往后挪会“跑出字母表”,怎么让它绕回开头?
In [45]
name = "xyz" # plain text

secret = "" # encrpyt secret

for ch in name:
    asc = ord(ch)
    encrypt = chr(asc + 3)
    secret += encrypt

print(secret)
{|}
接下来先确认边界:97 + 25 正好是 z 的编号。
In [46]
chr(97 + 25)
Out
'z'
接下来取模运算:超过 122 就绕回开头——% 是“除法剩多少”的魔法符号。
In [49]
(97 + 25 + 3) % (97 + 25)
Out
3
接下来绕圈公式拆开第一步:97 + (超过的部分) 是什么?
In [50]
97 + (97 + 25 + 3) % (97 + 25)
Out
100
接下来把绕圈后的编号变回字符:chr 登场收尾。
In [51]
chr(97 + (97 + 25 + 3) % (97 + 25))
Out
'd'
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. (97 + 25 + 3) % (97 + 25) 等于?

2. chr(97 + 3) 得到?

接下来再算一遍边界:97 + 25 = 122,这就是字母表的上限。
In [52]
97 + 25
Out
122
接下来通用加密:step 想移几位就移几位。先画一画绕圈的思路,再看代码。
In [54]
step = 5

z = 122
ch = 'a'

rst_asc = ord(ch) + step

if rst_asc >= z:
    rst_asc = ord('a') + rst_asc % z


print(rst_asc, chr(rst_asc))
    
    
102 f
接下来step = 5:把变量名起成 step(步长),代码立刻“会说话”了。
In [62]
step = 5

z = 122
ch = 'x'

rst_asc = ord(ch) + step

if rst_asc >= z:
    rst_asc = ord('a') + rst_asc % z - 1


print(rst_asc, chr(rst_asc))
    
    
# abcd....xyz
99 c
接下来先算数字:x 的编号加 5 等于多少?
In [58]
ord('x') + 5
Out
125
接下来对 122 取模:看看超出部分怎么绕圈。
In [59]
(ord('x') + 5) % 122
Out
3
接下来最后的修正:为什么是 97 + 3 - 1?数一数 yzabc 就明白了。
In [61]
chr(97 + 3 - 1)
Out
'c'
豆豆老师

豆豆答疑站

课堂上同学们常问的问题,先自己想,再看答案。

💬 ord 和 chr 老是记反,怎么办?

用英文记:ord = order(顺序/编号),字符 → 编号;chr = character(字符),编号 → 字符。课堂上学生说“没理解”“需要反应一会儿”,就用“给每个同学编号”的例子讲通了。

📌 来自课堂:学生真实困惑

💬 加密时超过 z 怎么办?

绕圈!超过 122 就对 122 取模再减 1,加上 97 回到 a。课堂上 x+5 变成 d 就是绕圈的结果。刚开始觉得绕没关系,先会用,再慢慢想数学。

📌 来自课堂:真实难点

💬 凯撒加密为什么叫“对称加密”?

因为加密和解密用同一把“钥匙”(同一个偏移量)。像保险箱,会锁的人也会开。真正的安全加密用两把钥匙(公钥加密),像快递箱:谁都能往里投,只有你有钥匙取。

📌 课堂类比:保险箱/快递箱

豆豆老师

豆豆小测验

点一点选项,不管选哪个都会有讲解。选错了不丢人,看懂解释就赚到了!

1. ord('a') 的结果是?

2. chr(100) 的结果是?

3. 凯撒加密 'x' 往后挪 5 格(绕圈)得到?

09

字符串方法

接下来字符串方法第一课:isupper 问“你是不是大写字母?”
In [64]
'c'.isupper()
Out
False
接下来大写 A 呢?isupper 的回答是 True 还是 False?
In [65]
'A'.isupper()
Out
True
接下来遍历句子,把大写字母一个个挑出来——判断 + 循环的组合拳。
In [70]
msg = "Very, 1 Good People 1234"

for ch in msg:
    if ch.isupper():
        print(ch)
V
G
P
接下来换一下:这次把小写字母挑出来,用 islower。
In [71]
msg = "Very, 1 Good People 1234"

for ch in msg:
    if ch.islower():
        print(ch)
e
r
y
o
o
d
e
o
p
l
e
接下来isascii:只认英文字符。中文和 emoji 不算,试试看。
In [79]
msg = "Very, 789 Good People 1234 你好 😄"

for ch in msg:
    if ch.isascii():
        print(ch)
V
e
r
y
,
 
7
8
9
 
G
o
o
d
 
P
e
o
p
l
e
 
1
2
3
4
 
 
接下来用 dir 侦探看看:字符串到底还藏了多少方法?
In [80]
dir(str)
Out
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__getnewargs__',
 '__getstate__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rmod__',
 '__rmul__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'capitalize',
 'casefold',
 'center',
 'count',
 'encode',
 'endswith',
 'expandtabs',
 'find',
 'format',
 'format_map',
 'index',
 'isalnum',
 'isalpha',
 'isascii',
 'isdecimal',
 'isdigit',
 'isidentifier',
 'islower',
 'isnumeric',
 'isprintable',
 'isspace',
 'istitle',
 'isupper',
 'join',
 'ljust',
 'lower',
 'lstrip',
 'maketrans',
 'partition',
 'removeprefix',
 'removesuffix',
 'replace',
 'rfind',
 'rindex',
 'rjust',
 'rpartition',
 'rsplit',
 'rstrip',
 'split',
 'splitlines',
 'startswith',
 'strip',
 'swapcase',
 'title',
 'translate',
 'upper',
 'zfill']
接下来换行符可以打印吗?isprintable 会告诉你是 True 还是 False。
In [82]
'\n'.isprintable()
Out
False
接下来abc 能不能当变量名?isidentifier 是“变量名体检机”。
In [83]
'abc'.isidentifier()
Out
True
接下来1abc 能不能当变量名?数字开头的名字不合格!
In [84]
'1abc'.isidentifier()
Out
False
接下来count 数一数:这句话里 a 出现了几次?
In [88]
'abc hello abc '.count('a')
Out
2
接下来数数你的名字:arianna 里 a 有几个?
In [89]
'arianna'.count('a')
Out
3
接下来find 找位置:a 第一次出现在第几个索引?
In [90]
'arianna'.find('a')
Out
0
接下来index 和 find 一样吗?跑跑看,注意区别。
In [91]
'arianna'.index('a')
Out
0
接下来找 'an':返回第一次出现的位置。
In [94]
'ariannaan'.index('an')
Out
3
接下来找不到会怎样?index 直接报错——它很较真。
In [95]
'abc'.index('xyz')
ValueError: substring not found
---------------------------------------------------------------------------ValueError                                Traceback (most recent call last)Cell In[95], line 1
----> 1 'abc'.index('xyz')
ValueError: substring not found
接下来find 找不到返回 -1——它比较温柔,但 -1 有个坑(字符串支持负索引)。
In [96]
'abc'.find('xyz')
Out
-1
接下来终极写法:用 if 判断 find 的结果是不是 -1,程序就有了“找没找到”的判断力。
In [97]
if 'abc'.find('xyz') == -1:
    print('not exist')
not exist
豆豆老师

豆豆点一点

刚学的知识点,马上练练手——点点选项看输出对不对!

1. 下面代码会输出什么? print('abc'.find('xyz'))

2. 下面代码会输出什么? if 'abc'.find('xyz') == -1: print('没找到')

In [ ]
豆豆老师

豆豆答疑站

课堂上同学们常问的问题,先自己想,再看答案。

💬 find 和 index 有什么区别?

都找第一次出现的位置。区别:找不到时 index 报错,find 返回 -1。课堂上还发现一个坑:字符串支持负索引,所以 -1 有歧义,要写 if x.find('abc') == -1 来判断。

📌 来自课堂:真实难点

💬 isidentifier 是干什么的?

体检一个名字能不能当变量名。'abc' → True;'1abc' → False(数字开头不行)。变量名规则:只能字母、数字、下划线,不能数字开头。

📌 课堂重点

💬 count 和 find 的差别?

count 数“出现几次”,find 找“第一次在哪”。一个数次数,一个找位置。

📌 课堂概念

豆豆老师

豆豆小测验

点一点选项,不管选哪个都会有讲解。选错了不丢人,看懂解释就赚到了!

1. 'abc'.find('xyz') 返回?

2. '1abc'.isidentifier() 返回?

3. 'arianna'.count('a') 返回?

豆豆老师

豆豆老师的知识地图

学到这里,你已经把 Python 的“地基”一块块垒起来了。回头看看这条路——

  1. ① 表达式与语句代码是一段段“会算出答案”的表达式;运算符 + 操作数 组成它。
  2. ② 变量贴了名字的盒子:a = 2。命名只能用字母/数字/下划线,不能以数字开头。
  3. ③ 类型与转换文字(str)和数字(int/float)是不同世界;int()/float() 是“翻译机”,返回值可以存进变量。
  4. ④ 条件判断if / elif / else:让电脑按条件选一条路走(BMI、出租车计费)。
  5. ⑤ 循环while 把“重复做的事”交给电脑:乘法表、星号图案——先找规律,再写循环。
  6. ⑥ 嵌套循环外层管行、内层管星:重复的代码用循环压缩,这就是“增量开发”。
  7. ⑦ 字符串索引、遍历、len()、upper()……文字也是可以逐字操作的“字符队列”。
  8. ⑧ 算法思维凯撒加密:把问题拆成 编号→挪动→绕圈→变回,像计算机一样一步步算。

从“2 + 3”到写出自己的加密程序,你已经学会像计算机一样思考了。下一步,试着用学到的循环和判断,自己编一个小程序吧——你已经可以做到了!