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

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

ただいまの
回答率

90.83%

  • Python

    6375questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 174

syoshinsha

score 17

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

image_mode="標準"

#何らかのイベントが起きたら(ボタンが押されたとか)
if event==True:
    image_mode="グレースケール"

if image_mode=="グレースケール"
    #何らかの処理
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+5

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

# (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 13:32

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

    キャンセル

  • 2018/05/09 13:34

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

    キャンセル

+4

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

from enum import Enum

Mode = Enum('Mode', ['normal', 'gray'])
image_mode = Mode.normal

event = True
if event:
    image_mode = Mode.gray

if image_mode is Mode.gray:
    print('hoge')

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 12:31

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

    キャンセル

+1

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

# constとして扱ってね
NORMAL = "標準"
GRAY = "グレースケール"

image_mode=NORMAL

#何らかのイベントが起きたら(ボタンが押されたとか)
if event==True:
    image_mode=GRAY

if image_mode is GRAY:  # is比較できるよやったね 
    #何らかの処理

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

# constとして扱ってね
標準 = "標準"
グレースケール = "グレースケール"

image_mode=標準

#何らかのイベントが起きたら(ボタンが押されたとか)
if event==True:
    image_mode=グレースケール

if image_mode is グレースケール:  # is比較できるよやったね 
    #何らかの処理

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/09 12:29

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

    キャンセル

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

  • ただいまの回答率 90.83%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    6375questions

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