質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

528閲覧

Python3でランダムリスト生成インプット版を作成してみました、評価や添削をお願いします。

HIROKIdesuga

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/03/17 20:32

編集2020/03/18 02:34

前提・実現したいこと

作成したソースコードの構文ミスの指摘や、もっと汎用性のある書き方に添削していただきたいです。

該当のソースコード

Python3

1from random import randint 2 3def get_user_input(): 4 while True: 5 n = -1 6 x = input("要素数が0以上50以下のリストを作れます(要素は0~100の間でランダムに生成します)\n要素を何個にしますか:") 7 if x.isdigit(): 8 n = int(x) 9 if 0 <= n <= 50: 10 return n 11 print("0以上50以下の整数を入力してください!\n\n") 12 13 14def random_list(): 15 user_input = get_user_input() 16 x = [] 17 for i in range(user_input): 18 x.append(randint(0, 100)) 19 return x 20 21def list(a): 22 return a 23 24def random_list_max(a): 25 if not a: 26 return "なし" 27 max_value = a[0] 28 for item in a: 29 if item > max_value: 30 max_value = item 31 return max_value 32 33def list_len(a): 34 l = len(a) 35 return l 36 37def random_list_min(a): 38 if not a: 39 return "なし" 40 min_value = a[0] 41 for item in a: 42 if item < min_value: 43 min_value = item 44 return min_value 45 46def add(a): 47 sum = 0 48 for item in a: 49 sum += item 50 return sum 51 52def play(): 53 l = random_list() 54 print(list(l)) 55 print("要素は{}個".format(list_len(l))) 56 print("合計は{}".format(add(l))) 57 print("最大値は{}".format(random_list_max(l))) 58 print("最小値は{}".format(random_list_min(l))) 59 60def game(): 61 while True: 62 play() 63 get_user_request = input("もう一度生成しますか?y/n:") 64 while get_user_request not in "yn": 65 get_user_request = input("\n\nもう一度生成しますか?\nyかnを入力してください:") 66 continue 67 if get_user_request == "y": 68 print("\n" * 10) 69 else: 70 break 71 print("またのご利用をお待ちしております!") 72 73if __name__ == "__main__": 74 game()

試したこと

手段を関数別に分けて、調節しやすいようにしました。

補足情報(FW/ツールのバージョンなど)

バージョン:Python3.7.7
エディタ:PyCharm CE

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/17 22:09

何らかの基準(例えば仕様やコーディング規約)がなければ、レビューはできません。 何を求めた質問でしょうか?
hoshi-takanori

2020/03/17 23:59

「コードレビュー」タグをつけたらいいと思います。
HIROKIdesuga

2020/03/18 02:45

te2jiさん、hoshi-takanoriさん指摘ありがとうございます。 この場合のコーディング規約というのは、一般的にpep8のことで大丈夫でしょうか? それ以外で特にこれを基準とする、というようなコーディング規約は今回の場合特にないです。
guest

回答1

0

ベストアンサー

ざっくりいきます。

python

1def get_user_input(): 2 while True: 3 n = -1 4 x = input("要素数が0以上50以下のリストを作れます(要素は0~100の間でランダムに生成します)\n要素を何個にしますか:") 5 if x.isdigit(): 6 n = int(x) 7 if 0 <= n <= 50: 8 return n 9 print("0以上50以下の整数を入力してください!\n\n")

このままだと汎用性がないので、入力を求めるメッセージや、値の範囲を引数で渡せるようにしたらいいと思います。

python

1def random_list(): 2 user_input = get_user_input() 3 x = [] 4 for i in range(user_input): 5 x.append(randint(0, 100)) 6 return x

これも、乱数の個数や範囲を引数にして、get_user_input の呼び出しは play に移動した方が汎用性が上がります。

python

1def list(a): 2 return a

この関数は何のためのものですか?

python

1def random_list_max(a): 2 if not a: 3 return "なし" 4 max_value = a[0] 5 for item in a: 6 if item > max_value: 7 max_value = item 8 return max_value

random_list_max の対象は必ずしも random list である必要はないので、次の list_len のように、単に list_max という名前がいいと思います。

python

1def list_len(a): 2 l = len(a) 3 return l 4 5def random_list_min(a): 6 if not a: 7 return "なし" 8 min_value = a[0] 9 for item in a: 10 if item < min_value: 11 min_value = item 12 return min_value

関数の並び順ですが、random_list_max と random_list_min は似たような関数なので、近くに置いた方がいいと思います。(間に list_len が挟まると違和感があります。)
また、random_list_max と random_list_min を統一できないか考えてみましょう。(方法はいろいろあります。)

python

1def add(a): 2 sum = 0 3 for item in a: 4 sum += item 5 return sum

関数名は list_sum がいいかな。
list_len, random_list_max, random_list_min と並べた時に統一感のある名前にしましょう。

python

1def play(): 2 l = random_list() 3 print(list(l)) 4 print("要素は{}個".format(list_len(l))) 5 print("合計は{}".format(add(l))) 6 print("最大値は{}".format(random_list_max(l))) 7 print("最小値は{}".format(random_list_min(l))) 8 9def game(): 10 while True: 11 play() 12 get_user_request = input("もう一度生成しますか?y/n:") 13 while get_user_request not in "yn": 14 get_user_request = input("\n\nもう一度生成しますか?\nyかnを入力してください:") 15 continue 16 if get_user_request == "y": 17 print("\n" * 10) 18 else: 19 break 20 print("またのご利用をお待ちしております!")

get_user_request は関数名に見えます。変数名は user_input とか user_request の方がいいし、そこまで重要な変数じゃないのでもっと単純な名前でもいい気がします。

投稿2020/03/18 00:15

hoshi-takanori

総合スコア7899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HIROKIdesuga

2020/03/18 04:08

hoshi-takanoriさん、添削していただきありがとうございます。 変数名の名前の付け方と引数の使い方、必要性について理解が増えました。 それと質問なんですが、get_user_inputの呼び出しがrandom_list()ではなくplay()の時の方が汎用性が増すのはなぜでしょうか?
hoshi-takanori

2020/03/18 04:19

random_list の配列の要素数を get_user_input を呼び出すのではなく引数で受け取ることで、要素数が決まっている乱数の配列を作るためにも使えるようになって、汎用的になるからです。
HIROKIdesuga

2020/03/18 04:33

コメントありがとうございます。 理解しました、random_list()をget_user_input()以外の関数と組み合わせる考えをしていませんでした。 ご教授ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問