前言#
開學一個月以來,忙於學業,並沒有時間去思考很多東西,看書倒是經常的事,只不過不是很常看 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
,但是邏輯上來說,是除開 slow
、medium
、fast
以外的所有值,都会執行如此的邏輯,也就是說假設當前速度為 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
對於 key
,position
對應 value
,將 key
和 value
讀取出來,分別賦給 spead_1
、position
。
在最後使用 print
輸出出來。
for
則為循環,假如值沒有被完全輸出出來,那麼它會不斷輸出,直到完全輸出一遍。
結束#
那麼,到這就結束了?這可能是我近一年寫的最有技術的文章……
此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://fmcf.cc/posts/technology/Python_Notes_2