变量和类型
程序得记住一些东西:还剩几盏灯、轮到谁了、玩家输入了什么。变量就是给一个值起的名字,后面可以用这个名字找到它。
创建变量
写一个名字、一个 =,再写一个值。从这以后,这个名字就代表这个值。
1name = "Wick"2lamps = 33print(name, "今晚要点", lamps, "盏灯")
Wick 今晚要点 3 盏灯
这里的 = 不是「等于」,而是存起来:先算出右边的值,再给它贴上左边的名字。名字不加引号,因为它不是文字,而是一个标签。
改变量的值
给同一个名字再赋一次值,旧的值就被换掉了。右边甚至可以用这个变量现在的值。
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)
b = a 让 b 也指向 a 现在的值,也就是 5。接着 a = 9 让 a 指向一个新值;b 指的还是 5。
起名的规矩
名字可以用字母、数字和下划线 _。有几条规矩,还有一个习惯:
| 规矩 | 可以 | 不行 |
|---|---|---|
| 不能有空格 | lamp_count | lamp count |
| 不能以数字开头 | house2 | 2house |
只能用字母、数字和 _ | total_cost | total-cost |
| 不能是关键字 | class_name | class、if、True |
名字分大小写:lamps、Lamps、LAMPS 是三个不同的名字。Python 的习惯是用小写英文单词,中间用下划线连起来,比如 lamps_left。起名要让人一看就知道里面存的是什么。
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() 能告诉你一个值是什么类型:
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 是它唯一的值。
变量没有固定的类型,最后存进去的是什么,它就是什么:
1thing = 422print(thing, type(thing))3thing = "四十二"4print(thing, type(thing))
42 <class 'int'> 四十二 <class 'str'>
类型转换
类型混在一起时,Python 不会去猜你的意思。文字和数字不能相加:
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" |
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,然后在 { } 里写变量或算式:
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)
a = b 让 a 指向蓝,红就再没有名字指着了。接着 b = a 让 b 也指向这个蓝。
Python 有一个一行就能换的好办法。先把右边全算出来,再一起交给左边的两个名字:
1a = "红"2b = "蓝"3a, b = b, a4print(a, b)
蓝 红
练一练
写好代码,点检查。提示随便看,实在想不出来再看答案。
进货
✓店里有 stock 盏灯,存的是文字。加上新到的 delivered,显示下面这一行。
库存:12
1stock = "8"2delivered = 43print(f"库存:{stock}")
用变量拼一句话
✓用 f-string 和 name、age 显示下面这句话。
小林今年 36 岁。
1name = "小林"2age = 363print(name, age)
换个位置
✓加一行,让最后一行把两种饮料反过来显示。
咖啡 茶
1first = "茶"2second = "咖啡"3# 在这里加一行4print(first, second)
这一课学会了
名字 = 值把值存在名字下面;再赋一次值就换掉了。- 名字用字母、数字和
_,不能以数字开头,分大小写。 - 基本类型有
int、float、str、bool、None;type()能查是哪一种。 int()、float()、str()用来转换;文字和数字不转换就混着算,会报TypeError。f"{name} 有 {lamps}"这样的 f-string 能把值放进文字里。a, b = b, a交换两个变量。