前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python学习日记 – 坐标移动

Python学习日记 – 坐标移动

作者头像
Magneto
发布2022-09-14 16:23:43
3110
发布2022-09-14 16:23:43
举报
文章被收录于专栏:春花秋月

前言

开学一个月以来,忙于学业,并没有时间去思考很多东西,看书倒是经常的事,只不过不是很常看Python的书,更多的是看文学书,我在放假前一天考试完后,翻阅了我的Python书,学到了些对我来说算是新东西,便对开学前的工程进行了改善和升级,写了一个坐标移动的程序。

输出预览

其中带#的部分是我的解释,正式运行是没有的

代码语言:javascript
复制
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

全部代码

代码语言:javascript
复制
############################
### 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 进行了随机处理,如果这时候将它输出出来:

代码语言:javascript
复制
# 引入 random 模块
import random
# 定义 spead 内容 并进行随机处理
spead_0 = ['slow', 'medium', 'fast', 'veryfast']
spead_random = random.choice(spead_0)
# 输出数值
print(f"当前速度是{spead_random}")

将会从 spead_0 中抽取任意一个值并进行输出,而不是输出第一个值。

输出内容

代码语言:javascript
复制
eg:
当前速度是medium

在对代码改进前,程序对 random 进行了大量使用 (详见《Python学习日记 – 法外狂徒的故事 – 幸吾有志 (symbk.cn)》)

改进后,将随机值,更改为了人为输入,更随机(bushi

但是速度仍然进行了随机处理,因为这有便于计算,而不是进行输入。

人为输入

使用 input 对数值进行输入:

代码语言:javascript
复制
# 用户输入X坐标
print("\nTell me your X position:")
your_x_position = input()
# 用户输入Y坐标
print("Tell me your Y position:")
your_y_position = input()

其中 your_坐标类型_position ,这将对应下一组转化逻辑。值得注意的是,我并没有使用如下类似的代码:

代码语言:javascript
复制
a = input("Tell me your X positison:")

输出内容

代码语言:javascript
复制
eg:
Tell me your X position:0    # 0是我输入的值

这是因为使用这样的代码运行后将会变得不美观。优秀的程序,通常是逻辑和美观兼备的。

解决运算问题

在使用 input 进行输入时,原本的方法所输出的值,无法进行正常运算,它会报错

错误代码示范

代码语言:javascript
复制
a = input("Number is ")
b = a + 3
print(f"Now your number is {b}")

报错内容

代码语言:javascript
复制
b = a + 3
TypeError: can only concatenate str (not "int") to str

怎么办呢?我直接进行了CV(bushi。我去翻阅了我朋友所写的小玩意,发现可以使用 float() 对输入值进行处理,让它变得可运算。也就成了这样

代码语言:javascript
复制
a = input("Number is ")
b= float(a)
c = b + 3
print(f"Now your number is {c}")

输出内容

代码语言:javascript
复制
eg:
Number is 1
4.0

这样的处理方式我写了两组,分别针对X坐标和Y坐标输入的值进行处理:

代码语言:javascript
复制
# 转化X坐标
x_position = float(your_x_position)
# 转化Y坐标(+1为初始位置)
y_position = float(your_y_position)

此刻,输入的值就从 your_坐标类型_position 的浮动值,转为了 坐标类型_position 定值,便可进行后续运算。

输出初始坐标

原本的代码中写到

代码语言:javascript
复制
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() 以输出:

代码语言:javascript
复制
print("这是一段文字")

输出内容

代码语言:javascript
复制
eg:
这是一段文字

倘若你想引用某个值,那么就必须在后面加上一个 f 即 format(设置格式),书写出来就是

代码语言:javascript
复制
message = 文字
print(f"这是一段{message}")

输出内容

代码语言:javascript
复制
eg:
这是一段文字

当然,这是最基础的部分,我也不必再多说,这是某书第二章就讲过的问题。

if-elif-else语句

先看原本的代码

代码语言:javascript
复制
# 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 语句,也不能算是技术,应该说是个逻辑。

我可以翻译一下这整段代码的意思,便不再需要过多阐述。

代码语言:javascript
复制
# 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,但由于字典限制,总共只存在四种情况,就不会出现这种问题了。

输出移动后坐标
代码语言:javascript
复制
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 处理后计算得到的,便不必再多说了。

内容介绍

先看代码吧

代码语言:javascript
复制
# 内容介绍定义
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 开始又是一个逻辑

代码语言:javascript
复制
# 字符替换和介绍类型总数
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 字典中的值输出出来

代码语言:javascript
复制
# 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则为循环,假如值没有被完全输出出来,那么它会不断输出,直到完全输出一遍。

结束

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 输出预览
  • 全部代码
  • 代码分析
    • 分析说明
      • random模块
        • 人为输入
          • 解决运算问题
            • 输出初始坐标
              • 输出移动后坐标
                • 内容介绍
                • 结束
                相关产品与服务
                腾讯云代码分析
                腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,助力维护团队卓越代码文化。
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档