pythonに限った話ではないんですけど、計算で使わなくて、条件分岐の条件として使う変数の中身って、文字列の方がわかりやすくて良かったりしますか?個人的な偏見なんですけど、文字列型って重そうなイメージがあるから、必要がなかったら使わないようにしていたんですけどどうなんですかね?
python
1image_mode="標準" 2 3#何らかのイベントが起きたら(ボタンが押されたとか) 4if event==True: 5 image_mode="グレースケール" 6 7if image_mode=="グレースケール" 8 #何らかの処理 9
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア11038
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総合スコア35660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
個人的な偏見なんですけど、文字列型って重そうなイメージがあるから、必要がなかったら使わないようにしていたんですけど
まさにそのとおりです。とりわけ、C言語などでは「文字列自体を単純に変数に入れられない」「文字列比較だけでも関数が必要になる」などの事情があって、全く実用性がありません。
ただ、言語によっては、「条件分岐の値として、単なる数値や文字列を使わななくてもいい」仕組みを用意しています。
- C言語…プリプロセッサマクロ
- Ruby…Symbol
投稿2018/05/09 03:22
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/05/09 03:29
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/05/09 04:32
2018/05/09 04:34