前言
开学一个月以来,忙于学业,并没有时间去思考很多东西,看书倒是经常的事,只不过不是很常看 Python 的书,更多的是看文学书,我在放假前一天考试完后,翻阅了我的 Python 书,学到了些对我来说算是新东西,便对开学前的工程进行了改善和升级,写了一个坐标移动的程序。
输出预览
其中带 #的部分是我的解释,正式运行是没有的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
Tell me your X position:
10 # 我输入的值
Tell me your Y position:
0 # 我输入的值
Original X position is 10.0
Original Y position is 0.0.
Original position is (10.0,0.0).
New X position is 12.0
New Y position is -1.0
New position is ((12.0, -1.0))
Introduction rules
There are four cases in total
Spead: slow
Add 1 X position and reduce 2 Y position
Spead: medium
Add 2 X position and reduce 1 Y position
Spead: fast
Add 3 X position and add 3 Y position
Spead: veryfast
Add 4 X position and add 6 Y position
|
全部代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
############################
### Date 2021 October 1 ###
### Author Magneto ###
### Name 坐标移动 <——>
### Random True ###
### Language Python ###
############################
# 引入 random 模块
import random
# 定义 spead 内容 并进行随机处理
spead_0 = ['slow', 'medium', 'fast', 'veryfast']
spead_random = random.choice(spead_0)
# 用户输入X坐标
print("\nTell me your X position:")
your_x_position = input()
# 用户输入Y坐标
print("Tell me your Y position:")
your_y_position = input()
# 转化X坐标
x_position = float(your_x_position)
# 转化Y坐标(+1为初始位置)
y_position = float(your_y_position)
# 输出初始坐标值
print(f"\nOriginal X position is {x_position}"
f"\nOriginal Y position is {y_position}."
f"\nOriginal position is ({x_position},{y_position}).")
# if-elif-else语句
# 定义slow
if spead_random == 'slow':
# 算法
x_increment = x_position + 1
y_increment = y_position - 2
# 定义medium
elif spead_random == 'medium':
# 算法
x_increment = x_position + 2
y_increment = y_position - 1
# 定义fast
elif spead_random == 'fast':
# 算法
x_increment = x_position + 3
y_increment = y_position + 3
# 定义其它内容,假定其它内容速度为极快,达到仪表显示上限
else:
# 算法
x_increment = x_position + 4
y_increment = y_position + 6
# 输出移动后坐标
print(f"New X position is {x_increment}"
f"\nNew Y position is {y_increment}"
f"\nNew position is ({x_increment,y_increment})")
# 内容介绍定义
alien = {
'slow': 'Add 1 X position and reduce 2 Y position',
'medium': 'Add 2 X position and reduce 1 Y position',
'fast': 'Add 3 X position and add 3 Y position',
'veryfast': 'Add 4 X position and add 6 Y position'
}
print("\nIntroduction rules")
# 字符替换和介绍类型总数
if len(alien) == 4:
# 字符替换
The_number = 'four'
# 介绍类型总数
print(f"There are {The_number} cases in total")
# 其他类型
else:
# 输出空值
print("NULL")
# for语句输出
for spead_1, position in alien.items():
print(f"Spead: {spead_1}")
print(f"{position}")
|
代码分析
分析说明
代码分析将会具体讲述第几行的代码有什么用,其中行数包含了注释所占用的行数。
random 模块
第 9 行中的 import random 代码,将 random 模块引入这个程序,而 random 的作用就在于将字典中的内容进行随机处理,这在 第12行 中就可以显示出来,我在 第11行 书写了字典内容,然后使用 random 进行了随机处理,如果这时候将它输出出来:
1
2
3
4
5
6
7
|
# 引入 random 模块
import random
# 定义 spead 内容 并进行随机处理
spead_0 = ['slow', 'medium', 'fast', 'veryfast']
spead_random = random.choice(spead_0)
# 输出数值
print(f"当前速度是{spead_random}")
|
将会从 spead_0
中抽取任意一个值并进行输出,而不是输出第一个值。
输出内容
在对代码改进前,程序对 random 进行了大量使用 (详见《Python 学习日记 – 法外狂徒的故事》)
改进后,将随机值,更改为了人为输入,更随机 (bushi
但是速度仍然进行了随机处理,因为这有便于计算,而不是进行输入。
人为输入
使用 input 对数值进行输入:
1
2
3
4
5
6
|
# 用户输入X坐标
print("\nTell me your X position:")
your_x_position = input()
# 用户输入Y坐标
print("Tell me your Y position:")
your_y_position = input()
|
其中 your_坐标类型_position
,这将对应下一组转化逻辑。值得注意的是,我并没有使用如下类似的代码:
1
|
a = input("Tell me your X positison:")
|
输出内容
1
2
|
eg:
Tell me your X position:0 # 0是我输入的值
|
这是因为使用这样的代码运行后将会变得不美观。优秀的程序,通常是逻辑和美观兼备的。
解决运算问题
在使用 input 进行输入时,原本的方法所输出的值,无法进行正常运算,它会报错
错误代码示范
1
2
3
|
a = input("Number is ")
b = a + 3
print(f"Now your number is {b}")
|
报错内容
1
2
|
b = a + 3
TypeError: can only concatenate str (not "int") to str
|
怎么办呢?我直接进行了 CV (bushi。我去翻阅了我朋友所写的小玩意,发现可以使用 float() 对输入值进行处理,让它变得可运算。也就成了这样
1
2
3
4
|
a = input("Number is ")
b= float(a)
c = b + 3
print(f"Now your number is {c}")
|
输出内容
1
2
3
|
eg:
Number is 1
4.0
|
这样的处理方式我写了两组,分别针对 X 坐标和 Y 坐标输入的值进行处理:
1
2
3
4
|
# 转化X坐标
x_position = float(your_x_position)
# 转化Y坐标(+1为初始位置)
y_position = float(your_y_position)
|
此刻,输入的值就从 your_坐标类型_position 的浮动值,转为了 坐标类型_position 定值,便可进行后续运算。
输出初始坐标
原本的代码中写到
1
2
3
|
print(f"\nOriginal X position is {x_position}"
f"\nOriginal Y position is {y_position}."
f"\nOriginal position is ({x_position},{y_position}).")
|
其中 {坐标类型_position}
就是我们输入的值。在此步中由于我们没有运用计算,因此 {坐标类型_position}
可以替换为 your_坐标类型_position
替换后可以正常显示,但是为了减少字节 (闲的没事,更推荐用 {坐标类型_position}
的方式引用值。
在 print()
中,我们不必书写 \n
对文字进行换行,可以直接 回车 以换行。当然 \n
的写法也能生效。
哦,对了,在 print()
中,如果只输出文字,我们可以使用 print()
以输出:
输出内容
倘若你想引用某个值,那么就必须在后面加上一个 f 即 format(设置格式),书写出来就是
1
2
|
message = 文字
print(f"这是一段{message}")
|
输出内容
1
2
3
|
eg:
这是一段文字
当然,这是最基础的部分,我也不必再多说,这是某书第二章就讲过的问题。
|
if-elif-else 语句
先看原本的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# if-elif-else语句
# 定义slow
if spead_random == 'slow':
# 算法
x_increment = x_position + 1
y_increment = y_position - 2
# 定义medium
elif spead_random == 'medium':
# 算法
x_increment = x_position + 2
y_increment = y_position - 1
# 定义fast
elif spead_random == 'fast':
# 算法
x_increment = x_position + 3
y_increment = y_position + 3
# 定义其它内容,假定其它内容速度为极快,达到仪表显示上限
else:
# 算法
x_increment = x_position + 4
y_increment = y_position + 6
|
这里牵扯了计算,因而必须引用我上面所写的 float()
进行转换后再进行计算。
这里的数值可以 任意书写,我保证了它最小数不为负,后实际测试中发现,为不为负都无所谓,不会出现 Bug……
这里最有技术的是 if-elif-else
语句,也不能算是技术,应该说是个逻辑。
我可以翻译一下这整段代码的意思,便不再需要过多阐述。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# if-elif-else语句 #
# 定义slow #
if spead_random == 'slow': # 如果spead_random的值是slow,那么
# 算法 #
x_increment = x_position + 1 # x_increment(新建量)的值是x_position的值+1
y_increment = y_position - 2 # y_increment(新建量)的值是x_position的值-2
# 定义medium #
elif spead_random == 'medium': # 如果不是上几种而是spead_random的值是medium,那么
# 算法 #
x_increment = x_position + 2 # x_increment的值是x_position的值+2
y_increment = y_position - 1 # y_increment的值是x_position的值-1
# 定义fast #
elif spead_random == 'fast': # 如果不是上几种而是spead_random的值是fast,那么
# 算法 #
x_increment = x_position + 3 # x_increment的值是x_position的值+3
y_increment = y_position + 3 # y_increment的值是x_position的值+3
# 定义其它内容,假定其它内容速度为极快,达到仪表显示上限
else: # 其它情况
# 算法 #
x_increment = x_position + 4 # x_increment的值是x_position的值+4
y_increment = y_position + 6 # y_increment的值是x_position的值+6
|
就是这样,这里的 else
被我认定为速度为 veryfast
,但是逻辑上来说,是除开 slow
、medium
、fast
以外的所有值,都会执行如此的逻辑,也就是说假设当前速度为 veryslow
它的算法依旧是 X+4,Y+6,但由于字典限制,总共只存在四种情况,就不会出现这种问题了。
输出移动后坐标
1
2
3
|
print(f"New X position is {x_increment}"
f"\nNew Y position is {y_increment}"
f"\nNew position is ({x_increment,y_increment})")
|
这时引用的坐标值,便是进过 if-elif-else
处理后计算得到的,便不必再多说了。
内容介绍
先看代码吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# 内容介绍定义
alien = {
'slow': 'Add 1 X position and reduce 2 Y position',
'medium': 'Add 2 X position and reduce 1 Y position',
'fast': 'Add 3 X position and add 3 Y position',
'veryfast': 'Add 4 X position and add 6 Y position'
}
print("\nIntroduction rules")
# 字符替换和介绍类型总数
if len(alien) == 4:
# 字符替换
The_number = 'four'
# 介绍类型总数
print(f"There are {The_number} cases in total")
# 其他类型
else:
# 输出空值
print("NULL")
# for语句输出
for spead_1, position in alien.items():
print(f"Spead: {spead_1}")
print(f"{position}"
|
这里容纳了很多东西。
首先 alien = {……}
部分,是一个字典,其中第一列是速度,第二列是介绍。第一列值我们称为 key
,第二列的值称为 value
。
每个 key
值对应一个 value
值 ,且横向对应。
之后的 print()
是最简单的 print
语句,不必多说。
从 if
开始又是一个逻辑
1
2
3
4
5
6
7
8
9
10
|
# 字符替换和介绍类型总数
if len(alien) == 4:
# 字符替换
The_number = 'four'
# 介绍类型总数
print(f"There are {The_number} cases in total")
# 其他类型
else:
# 输出空值
print("NULL")
|
如果 alien 字典中的类型总数为 4,那么会生成一个新值,即 The_number = 'four'
,并且输出一段话 There are four cases in total
。
如果不是,那么则直接输出一个单词 NULL
这或许不大好理解,但这就是它的逻辑。
最终将 alien
字典中的值输出出来
1
2
3
4
|
# for语句输出
for spead_1, position in alien.items():
print(f"Spead: {spead_1}")
print(f"{position}")
|
spead_1
对于 key
,position
对应 value
,将 key
和 value
读取出来,分别赋给 spead_1
、position
。
在最后使用 print
输出出来。
for
则为循环,假如值没有被完全输出出来,那么它会不断输出,直到完全输出一遍。
结束
那么,到这就结束了?这可能是我近一年写的最有技术的文章……