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

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

新規登録して質問してみよう
ただいま回答率
85.50%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

Q&A

解決済

3回答

1596閲覧

Python オブジェクト指向 コードの短縮

_Victorique__

総合スコア1392

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Python

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

0グッド

0クリップ

投稿2017/06/15 09:40

編集2017/06/15 09:45

###前提・実現したいこと
Pythonのコードについて、短縮の仕方がまずいかどうか教えて欲しいです。
また、他に良い短縮の仕方があれば教えて欲しいです。

###該当のソースコード

python

1"""before""" 2def countNum(numlist): 3 counter = 0 4 for num in numlist: 5 if 条件: 6 counter += 1 7 return counter 8 9"""after""" 10def isMach(num): 11 return 1 if 条件 else return 0 12 13def countNum(numlist): 14 return sum([isMach(num) for num in numlist])

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

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

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

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

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

guest

回答3

0

sumではなくlist.count()Trueの数を数えるようにすればリストのメソッドを使うので読みやすくなると思います。ただし以下のコードはmaplambdaを使っているのでオブジェクト指向ではありません。

numlist = range(10) ismatch = lambda n: n%2==0 c = list(map(ismatch, numlist)).count(True) print(c)

投稿2017/06/15 14:26

YouheiSakurai

総合スコア6142

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

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

YouheiSakurai

2017/06/15 14:38

より読みやすいバージョン。 C = [*map(ismatch, numlist)].count(True)
YouheiSakurai

2017/06/15 14:45

もう一つ。 ismatch = lambda n: n%2==0 and 1 or 0 c = sum(map(ismatch, numlist))
YouheiSakurai

2017/06/15 14:54

filterとlenが良いバージョン。 ismatch = lambda n: n%2==0 c = len([*filter(ismatch, numlist)])
_Victorique__

2017/06/16 07:44

参考にさせていただきます!
guest

0

ベストアンサー

Python

1sum((1 for n in numlist if 条件))

で良いのではないでしょうか

投稿2017/06/15 10:40

magichan

総合スコア15898

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

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

_Victorique__

2017/06/15 10:51

内側のカッコはなくても大丈夫ですよね? あと、この書き方だと可読性の点から問題があると思いますか?
magichan

2017/06/15 15:25 編集

確かにカッコはいりませんね。 可読性に関してですが、個人的には全く問題ないと思います。 シンプルに記述できるものを長々を記述する方が可読性が落ちるのではないかと個人的には思っております。 特にトリッキーなコードでもありませんし、この程度であれば普通に読めるだろうと。 もし問題あると感じるならば、コメントを書いておけばよいのではないでしょうか。
guest

0

条件部分を分離してisMatchという関数に分けるということはわかるのですが、せっかく分離してもcountNumがisMatchを無条件に参照しているのでは分離したうまみがない気がします。どうせならcountNumへisMatch以外の関数も渡せるように定義したほうがよいのではないでしょうか?

python

1def countIf(predicate, list): 2 return sum(predicate(element) for element in list) 3 4def isEvent(n): 5 return n % 2 == 0 6 7 8countIf(isEven, [1, 2, 3]) 9==> 1 10 11countIf(lambda s: s == "a", ["a", "b", "a"]) 12==> 2 13

本件の例はsumを使えば充分単純にかけると思いますが、関数の機能を分離するということのみに着目してコメントしてみました。

投稿2017/06/15 11:17

編集2017/06/15 11:22
KSwordOfHaste

総合スコア18392

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

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

_Victorique__

2017/06/15 14:06

うーん よく考えるとこれってmap関数で出来ちゃいますね・・・
KSwordOfHaste

2017/06/15 16:10

YouheiSakuraiさんの回答拝見して気づきましたが、自分の回答は「オブジェクト指向かどうか、コードが短くなるかどうか」を気にせずに回答しています。 コードがごく短い「処理の変形」だったので「オブジェクトに対する機能」とか「短縮」ではなくて「機能の分割」のみ着目してました。 「タイトルにマッチしているかどうか」の観点で回答すべきでしたね
_Victorique__

2017/06/16 07:43

参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問