Featured image of post Python学习日记 – 坐标移动

Python学习日记 – 坐标移动

前言

开学一个月以来,忙于学业,并没有时间去思考很多东西,看书倒是经常的事,只不过不是很常看 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 中抽取任意一个值并进行输出,而不是输出第一个值。

输出内容

1
2
eg:
当前速度是medium

在对代码改进前,程序对 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() 以输出:

1
print("这是一段文字")

输出内容

1
2
eg:
这是一段文字

倘若你想引用某个值,那么就必须在后面加上一个 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 ,但是逻辑上来说,是除开 slowmediumfast 以外的所有值,都会执行如此的逻辑,也就是说假设当前速度为 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 对于 keyposition 对应 value,将 keyvalue 读取出来,分别赋给 spead_1position

在最后使用 print 输出出来。

for 则为循环,假如值没有被完全输出出来,那么它会不断输出,直到完全输出一遍。

结束

那么,到这就结束了?这可能是我近一年写的最有技术的文章……

本博客已运行 days , h , m , s
常记溪亭日暮,沉醉不知归路~