前言#
学校が始まって 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
であると私が認定しましたが、論理的には slow
、medium
、fast
以外のすべての値がこのロジックを実行します。つまり、現在の速度が 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_1
は key
に対して、position
は value
に対して、それぞれの値を読み取り、spead_1
と position
に割り当てます。
最後に print
で出力します。
for
はループであり、もし値が完全に出力されていなければ、完全に出力されるまで繰り返し出力されます。
終わり#
これで終わりでしょうか?これは私が近一年で書いた最も技術的な記事かもしれません……
この記事は Mix Space によって xLog に同期更新されました。
元のリンクは https://fmcf.cc/posts/technology/Python_Notes_2