Kodewick
第 2 课,共 31 课目录

变量和类型

第 2 课,共 31 课 · 第 1 部分 · 基础 · 约 15 分钟

程序得记住一些东西:还剩几盏灯、轮到谁了、玩家输入了什么。变量就是给一个值起的名字,后面可以用这个名字找到它。

创建变量

写一个名字、一个 =,再写一个值。从这以后,这个名字就代表这个值。

main.py
1name = "Wick"2lamps = 33print(name, "今晚要点", lamps, "盏灯")
输出
Wick 今晚要点 3 盏灯

这里的 = 不是「等于」,而是存起来:先算出右边的值,再给它贴上左边的名字。名字不加引号,因为它不是文字,而是一个标签。

改变量的值

给同一个名字再赋一次值,旧的值就被换掉了。右边甚至可以用这个变量现在的值。

main.py
1oil = 102print(oil)3oil = 74print(oil)5oil = oil - 26print(oil)
输出
10
7
5

oil = oil - 2 要从右往左读:拿出现在的 oil(7),减 2,把结果(5)再存回 oil。

先猜一猜

这段代码显示什么?

1a = 52b = a3a = 94print(b)

起名的规矩

名字可以用字母、数字和下划线 _。有几条规矩,还有一个习惯:

规矩可以不行
不能有空格lamp_countlamp count
不能以数字开头house22house
只能用字母、数字和 _total_costtotal-cost
不能是关键字class_nameclass、if、True

名字分大小写:lamps、Lamps、LAMPS 是三个不同的名字。Python 的习惯是用小写英文单词,中间用下划线连起来,比如 lamps_left。起名要让人一看就知道里面存的是什么。

main.py
1lamp_count = 42print(lamp_count)3print(Lamp_count)
输出
4
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(Lamp_count)
NameError: name 'Lamp_count' is not defined. Did you mean: 'lamp_count'?

发生了什么: Python 不认识「Lamp_count」这个名字。可能是拼错了,或者用它之前还没给它赋值。

用了一个还不存在的名字,或者大小写不对,就会得到 NameError。Python 还会猜你想写的是哪个名字。

值的类型

每个值都有类型,说明它是哪一种东西、能拿它做什么。下面这五种最常见:

类型存什么例子
int整数3、-12、2026
float带小数点的数3.5、0.1、-2.0
str文字(字符串)"Wick"、"42"、""
bool是或否True、False
None「这里还没有东西」None

内置函数 type() 能告诉你一个值是什么类型:

main.py
1print(type(42))2print(type(3.5))3print(type("42"))4print(type(True))5print(type(None))
输出
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
<class 'NoneType'>

注意 "42" 是 str,不是 int:加了引号,它就只是两个字符。True、False、None 首字母大写,不加引号。None 的类型叫 NoneType,None 是它唯一的值。

变量没有固定的类型,最后存进去的是什么,它就是什么:

main.py
1thing = 422print(thing, type(thing))3thing = "四十二"4print(thing, type(thing))
输出
42 <class 'int'>
四十二 <class 'str'>

类型转换

类型混在一起时,Python 不会去猜你的意思。文字和数字不能相加:

main.py
1stock = "30"2print(stock + 1)
输出
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    print(stock + 1)
TypeError: can only concatenate str (not "int") to str

发生了什么: 字和数不能直接用 + 接在一起。先用 str() 把数变成字。

要先转换。每种类型的名字都可以当函数用,变出一个这种类型的值:

写法得到例子
int(x)整数int("12") 是 12;int(3.9) 是 3
float(x)小数float("2.5") 是 2.5
str(x)文字str(7) 是 "7"
main.py
1print(int("30") + 1)2print(float("2.5"))3print(str(7) + " 盏灯")4print(int(3.9))5print(int("abc"))
输出
31
2.5
7 盏灯
3
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    print(int("abc"))
ValueError: invalid literal for int() with base 10: 'abc'

发生了什么: 这串字不是一个整数,int() 没法把它变成数。

int(3.9) 是直接去掉小数部分,不是四舍五入。int("abc") 报 ValueError:类型没错(是字符串),可里面根本没有数字。

小技巧: TypeError 是值的种类对不上;ValueError 是种类对了,但值本身不对。

f-string

用逗号把文字和数字拼在一起也行,但 f-string 往往更清楚。在开头的引号前加一个 f,然后在 { } 里写变量或算式:

main.py
1name = "Wick"2lamps = 33print(f"{name} 今晚要点 {lamps} 盏灯")4print(f"再加一盏:{lamps + 1}")5print("忘了 f:{name}")
输出
Wick 今晚要点 3 盏灯
再加一盏:4
忘了 f:{name}

Python 会把每个 { } 填好,自动变成文字,不用再写 str()。忘了写 f,花括号就原样显示出来。

交换两个变量

有时两个变量要互换值。最直接的写法却不对:

先猜一猜

这段代码显示什么?

1a = "红"2b = "蓝"3a = b4b = a5print(a, b)

Python 有一个一行就能换的好办法。先把右边全算出来,再一起交给左边的两个名字:

main.py
1a = "红"2b = "蓝"3a, b = b, a4print(a, b)
输出
蓝 红

练一练

写好代码,点检查。提示随便看,实在想不出来再看答案。

练习 1

进货

店里有 stock 盏灯,存的是文字。加上新到的 delivered,显示下面这一行。

要显示
库存:12
exercise1.py
1stock = "8"2delivered = 43print(f"库存:{stock}")
输出
点「运行」或按 Ctrl+Enter
练习 2

用变量拼一句话

用 f-string 和 name、age 显示下面这句话。

要显示
小林今年 36 岁。
exercise2.py
1name = "小林"2age = 363print(name, age)
输出
点「运行」或按 Ctrl+Enter
练习 3

换个位置

加一行,让最后一行把两种饮料反过来显示。

要显示
咖啡 茶
exercise3.py
1first = "茶"2second = "咖啡"3# 在这里加一行4print(first, second)
输出
点「运行」或按 Ctrl+Enter

这一课学会了

  • 名字 = 值 把值存在名字下面;再赋一次值就换掉了。
  • 名字用字母、数字和 _,不能以数字开头,分大小写。
  • 基本类型有 int、float、str、bool、None;type() 能查是哪一种。
  • int()、float()、str() 用来转换;文字和数字不转换就混着算,会报 TypeError。
  • f"{name} 有 {lamps}" 这样的 f-string 能把值放进文字里。
  • a, b = b, a 交换两个变量。