###悩んでいること
自作の関数について引数が多いと使い勝手が悪いため、引数を少なくしたいです。
change_point(dir, distance, width, height, x, y)の引数を省略して
change_point(dir, distance)と減らしたい場合、理想的な方法を教えて頂けませんでしょうか?
追記
クロージャを使えばグローバル変数を減らせるという記述を見つけたのですが、今回の目的と関係あるでしょうか?
クロージャってどんなときに使うの?
###試したこと
自作の関数(以下にコード記載)について、
change_point(dir, distance, width, height, x, y)の引数の内(width, height, x, y)をグローバル変数にして、
change_point(dir, distance)と二つの引数だけに変更しました。おかげでテストする際も、
assert cahnge_point("RIGHT", 4, 8, 6, 2 ,1)==2 となって読み難かったものが、
assert cahnge_point("RIGHT", 4)==2 と読みやすくなりました。(グローバル変数は別途指定)
しかし、その後下記コードを別のテストファイルにimportしてテストをしようとすると、名前の衝突?のような問題があり、上手くテストが動きませんでした。このようなトラブルがあるので、手元のPythonの入門書にはグローバル変数は安易に使うなと説明されていました。
グローバル変数の使い方に気を付けていれば問題ないのかもしれませんが、引数を減らすもっと良い方法はないでしょうか?
あるいは冗長になってしまっても、関数中で使う変数については、引数として明示的に受け取るべきなのでしょうか?
###実際のコード
1番目の入力として、width, height, x座標, y座標、
2番目の入力として、移動方向(UP,DOWN,RIGHT,LEFT)と移動量(-10~10)が与えられた際に、
移動後の座標を計算するコードを書きました。
change_point() 関数は2番目の入力を与えられた際に、移動後の座標を計算する関数です。
移動後の座標を計算するためには、移動方向(UP,DOWN,RIGHT,LEFT)と移動量(-10~10)に加え、
width, height, x座標, y座標が必要なので、それらを全て引数とすると、
change_point(dir, distance, width, height, x, y) と引数が非常に長くなってしまいます。
そこで(width, height, x, y)をグローバル変数にして、change_point(dir, distance) は引数を二つに省略しました。
###該当のソースコード
loop_point関数のコードは省略していますが、widthやheightを超えた移動について、0から数えなおす関数です。
def change_point(Dir,Distance): # ポイントを変更する関数 global height, width, x, y if Dir =="UP": y = y + Distance y = loop_point(y, height) # loop_point()はwidth,heightを超えたx,yを規定値に修正 return y if Dir =="DOWN": y = y - Distance y = loop_point(y, height) return y if Dir =="RIGHT": x = x + Distance x = loop_point(x, width) return x if Dir =="LEFT": x = x - Distance x = loop_point(x, width) return x def main(): global width, height, x, y width, height, x, y = [int(x) for x in input().split()] Dir, Distance = input().split() Distance = int(Distance) change_point(Dir, Distance) print(x, y) if __name__ == '__main__': main()

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/04 15:29