banner
Magneto

Magnetoの小屋

Magneto在區塊鏈上の小屋,讓我們的文章在互聯網上永遠熠熠生輝!!

Python學習日記 – 坐標移動

前言#

開學一個月以來,忙於學業,並沒有時間去思考很多東西,看書倒是經常的事,只不過不是很常看 Python 的書,更多的是看文學書,我在放假前一天考試完後,翻閱了我的 Python 書,學到了些對我來說算是新東西,便對開學前的工程進行了改善和升級,寫了一個坐標移動的程序。

輸出預覽#

其中帶 #的部分是我的解釋,正式運行是沒有的

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

全部代碼#

############################
### 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 進行了隨機處理,如果這時候將它輸出出來:

# 引入 random 模塊
import random
# 定義 spead 內容 並進行隨機處理
spead_0 = ['slow', 'medium', 'fast', 'veryfast']
spead_random = random.choice(spead_0)
# 輸出數值
print(f"當前速度是{spead_random}")

將會從 spead_0 中抽取任意一個值並進行輸出,而不是輸出第一個值。

輸出內容

eg:
當前速度是medium

在對代碼改進前,程序對 random 進行了大量使用 (詳見《Python 學習日記 – 法外狂徒的故事》)
改進後,將隨機值,更改為了人為輸入,更隨機 (bushi

但是速度仍然進行了隨機處理,因為這有便於計算,而不是進行輸入。

人為輸入#

使用 input 對數值進行輸入:

# 用戶輸入X坐標
print("\nTell me your X position:")
your_x_position = input()
# 用戶輸入Y坐標
print("Tell me your Y position:")
your_y_position = input()

其中 your_坐標類型_position ,這將對應下一組轉化邏輯。值得注意的是,我並沒有使用如下類似的代碼:

a = input("Tell me your X positison:")

輸出內容

eg:
Tell me your X position:0    # 0是我輸入的值

這是因為使用這樣的代碼運行後將會變得不美觀。優秀的程序,通常是邏輯和美觀兼備的。

解決運算問題#

在使用 input 進行輸入時,原本的方法所輸出的值,無法進行正常運算,它會報錯

錯誤代碼示範

a = input("Number is ")
b = a + 3
print(f"Now your number is {b}")

報錯內容

b = a + 3
TypeError: can only concatenate str (not "int") to str

怎麼辦呢?我直接進行了 CV (bushi。我去翻閱了我朋友所寫的小玩意,發現可以使用 float () 對輸入值進行處理,讓它變得可運算。也就成了這樣

a = input("Number is ")
b= float(a)
c = b + 3
print(f"Now your number is {c}")

輸出內容

eg:
Number is 1
4.0

這樣的處理方式我寫了兩組,分別針對 X 坐標和 Y 坐標輸入的值進行處理:

# 轉化X坐標
x_position = float(your_x_position)
# 轉化Y坐標(+1為初始位置)
y_position = float(your_y_position)

此刻,輸入的值就從 your_坐標類型_position 的浮動值,轉為了 坐標類型_position 定值,便可進行後續運算。

輸出初始坐標#

原本的代碼中寫到

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() 以輸出:

print("這是一段文字")

輸出內容

eg:
這是一段文字

倘若你想引用某個值,那麼就必須在後面加上一個 f 即 format(設置格式),書寫出來就是

message = 文字
print(f"這是一段{message}")

輸出內容

eg:
這是一段文字
當然,這是最基礎的部分,我也不必再多說,這是某書第二章就講過的問題。

if-elif-else 語句#

先看原本的代碼

# 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 語句,也不能算是技術,應該說是個邏輯。

我可以翻譯一下這整段代碼的意思,便不再需要過多闡述。

# 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,但由於字典限制,總共只存在四種情況,就不會出現這種問題了。

輸出移動後坐標#

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 處理後計算得到的,便不必再多說了。

內容介紹#

先看代碼吧

# 內容介紹定義
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 開始又是一個邏輯

# 字符替換和介紹類型總數
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 字典中的值輸出出來

# 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 則為循環,假如值沒有被完全輸出出來,那麼它會不斷輸出,直到完全輸出一遍。

結束#

那麼,到這就結束了?這可能是我近一年寫的最有技術的文章……

此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://fmcf.cc/posts/technology/Python_Notes_2


載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。