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

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

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

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

Q&A

解決済

4回答

1006閲覧

計算で使わなくて条件分岐で使う変数について

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2018/05/09 03:14

pythonに限った話ではないんですけど、計算で使わなくて、条件分岐の条件として使う変数の中身って、文字列の方がわかりやすくて良かったりしますか?個人的な偏見なんですけど、文字列型って重そうなイメージがあるから、必要がなかったら使わないようにしていたんですけどどうなんですかね?

python

1image_mode="標準" 2 3#何らかのイベントが起きたら(ボタンが押されたとか) 4if event==True: 5 image_mode="グレースケール" 6 7if image_mode=="グレースケール" 8 #何らかの処理 9

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

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

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

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

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

guest

回答4

0

ことパフォーマンスに関してなら、「こうだと思う」とか「他の言語ではこうだ」なんていう話はただの害悪です。
「推測するな、計測せよ」という(誰が言ったか分からない)格言や、「計測すべし。計測するまでは速度のための調整をしてはならない」という哲学の通りです。

# (1) int a1 = 1 b1 = 2 # (2)1文字目で違うことがわかる長さが等しい文字列 a2 = 'あいうえお' b2 = 'かきくけこ' # (3) 30文字目で違うと分かる長さが等しい文字列 a3 = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほ' b3 = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへぼ' # (4) 31文字目で違うと分かるけど長さが違う文字列 a4 = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほ' b4 = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほま' # (5)Enum from enum import Enum Mode = Enum('Mode', ['normal', 'gray']) a5 = Mode.normal b5 = Mode.gray

これらを定義して、ipythonで以下のように%timeitマジックコマンドで調べましょう。
強く実装依存なのでこの通りにはならない可能性が高いですが、macOS CPython3.6.1 で

In [2]: %timeit a1==b1 45.1 ns ± 0.844 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) In [3]: %timeit a2==b2 53.7 ns ± 0.678 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) In [4]: %timeit a3==b3 56.5 ns ± 1.23 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) In [5]: %timeit a4==b4 43.7 ns ± 0.288 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each) In [6]: %timeit a5==b5 52.1 ns ± 0.171 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

と、なって「長さが違う文字列」が比較が一番速いのです。

それも1億回実行して1秒違う程度です。あなたのプログラムはそれを気にするほどのことなのですか?
だったらそもそもPythonで書くべきではないと思いませんか?

これは「あとから分かりやすい」「バグを混入させにくい」ことを優先するべき事柄です。

投稿2018/05/09 04:23

quickquip

総合スコア11038

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

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

退会済みユーザー

退会済みユーザー

2018/05/09 04:32

回答ありがとうございます。確かに言われてみれば、python使うんだったら速さを気にする必要はないかもしれませんね。これからは状況に応じてプログラムに必要な要素を考えてみることにしてみます。
quickquip

2018/05/09 04:34

ちなみに「明らかに中身が違うリテラル同士を is 演算子で比較する」のが速いですね(一番かどうかは保証しかねますが) 。それでも、1億回実行して1秒違う程度でしかないどうでもいい話ですが。
guest

0

**『複数の値を取りうるフラグ』**ってことですかね。
それでしたら列挙型というおあつらえ向きなものがあります。

Python

1from enum import Enum 2 3Mode = Enum('Mode', ['normal', 'gray']) 4image_mode = Mode.normal 5 6event = True 7if event: 8 image_mode = Mode.gray 9 10if image_mode is Mode.gray: 11 print('hoge')

修正: 比較をisに変更。列挙型メンバーは同一性を比較できます
Wandbox

文字列よりは用途が明確でわかりやすいかと。

投稿2018/05/09 03:26

編集2018/05/09 04:38
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/05/09 03:31

回答ありがとうございます。確かに列挙型は見やすいですね。参考にさせていただきます。
guest

0

いっそ紳士協定に任せる。

python

1# constとして扱ってね 2NORMAL = "標準" 3GRAY = "グレースケール" 4 5image_mode=NORMAL 6 7#何らかのイベントが起きたら(ボタンが押されたとか) 8if event==True: 9 image_mode=GRAY 10 11if image_mode is GRAY: # is比較できるよやったね 12 #何らかの処理

pythonって実は日本語変数名も使えるから、こう書いたって良いはず(PEP8あたりで非推奨になってるはずだけど)。

python

1# constとして扱ってね 2標準 = "標準" 3グレースケール = "グレースケール" 4 5image_mode=標準 6 7#何らかのイベントが起きたら(ボタンが押されたとか) 8if event==True: 9 image_mode=グレースケール 10 11if image_mode is グレースケール: # is比較できるよやったね 12 #何らかの処理

投稿2018/05/09 08:22

hayataka2049

総合スコア30933

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

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

0

ベストアンサー

個人的な偏見なんですけど、文字列型って重そうなイメージがあるから、必要がなかったら使わないようにしていたんですけど

まさにそのとおりです。とりわけ、C言語などでは「文字列自体を単純に変数に入れられない」「文字列比較だけでも関数が必要になる」などの事情があって、全く実用性がありません。

ただ、言語によっては、「条件分岐の値として、単なる数値や文字列を使わななくてもいい」仕組みを用意しています。

  • C言語…プリプロセッサマクロ
  • Ruby…Symbol

投稿2018/05/09 03:22

maisumakun

総合スコア145184

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

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

退会済みユーザー

退会済みユーザー

2018/05/09 03:29

回答ありがとうございます。やはり文字列は重いのでできるだけ避けるようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問