banner
Magneto

Magnetoの小屋

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

Python学習日記 – 座標移動

前言#

学校が始まって 1 ヶ月が経ち、学業に忙しくて多くのことを考える時間がありませんでした。本を読むことはよくありますが、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 から任意の値を抽出して出力しますが、最初の値を出力するわけではありません。

出力内容

例:
現在の速度は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:")

出力内容

例:
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}")

出力内容

例:
Number is 1
4.0

この処理方法を、X 座標と Y 座標の入力値に対してそれぞれ 2 組書きました:

# 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("これは一段の文字です")

出力内容

例:
これは一段の文字です

もし特定の値を参照したい場合は、後ろに f を付けてフォーマットを設定する必要があります。書き方は次のようになります:

message = 文字
print(f"これは一段の{message}")

出力内容

例:
これは一段の文字です
もちろん、これは最も基本的な部分であり、これ以上は言う必要はありません。これはある書の第二章で説明されている問題です。

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() を使用して変換した後に計算を行う必要があります。

ここでの数値は任意に書くことができ、最小値が負でないことを保証しました。実際のテストでは、負であっても問題ないことがわかりました。バグは発生しませんでした……

ここで最も技術的なのは 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(新しい量)の値はy_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の値はy_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の値はy_positionの値+3
# その他の内容を定義、その他の内容の速度を非常に速いと仮定し、計器表示の上限に達する
else:                               # その他の場合
    # アルゴリズム                  # 
    x_increment = x_position + 4    # x_incrementの値はx_positionの値+4
    y_increment = y_position + 6    # y_incrementの値はy_positionの値+6

このように、ここでの else は速度が veryfast であると私が認定しましたが、論理的には slowmediumfast 以外のすべての値がこのロジックを実行します。つまり、現在の速度が veryslow であっても、そのアルゴリズムは X+4、Y+6 になります。しかし、辞書の制限により、合計で 4 つのケースしか存在しないため、この問題は発生しません。

移動後の座標の出力#

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_1key に対して、positionvalue に対して、それぞれの値を読み取り、spead_1position に割り当てます。

最後に print で出力します。

for はループであり、もし値が完全に出力されていなければ、完全に出力されるまで繰り返し出力されます。

終わり#

これで終わりでしょうか?これは私が近一年で書いた最も技術的な記事かもしれません……

この記事は Mix Space によって xLog に同期更新されました。
元のリンクは https://fmcf.cc/posts/technology/Python_Notes_2


読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。