月: 2022年8月

  • elifを使った条件分岐がうまくいかない!![Python]

    elifを使った条件分岐がうまくいかない!![Python]

    if文で複数条件で複数の条件分岐を行いたいときに、elifでやってみたらエラーは出ていないんだけど、なんか結果がうまくいかないという時ってないでしょうか。
    もしかしたら、下の事象が当てはまっているかもしれません。
    参考までに、僕が間違えてしまっていたので、メモ書きします。

    問題となるプログラム

    if、elifに二条件を記載して、elifを含むプログラムを作成した状況で問題が起こります。

    def trable(a, b):
        if a >= 10 & b >= 10:
            print("patern A")
        elif a >= 10 & b < 10:
            print("patern B")
        elif a < 10 & b >= 10:
            print("patern C")
        else:
            print("patern D")
    
    trable(11, 11)
    trable(11, 9)
    trable(9, 11)
    trable(9, 9)

    上記のプログラムを実行したときに、上から順にA, B, C, Dのパターンに分類分けされてほしいようにも思えますが、実際には下の出力になります。

    patern A
    patern B
    patern C
    patern B

    順序を入れ替えてみてはどうでしょうか。

    def trable(a, b):
        if a >= 10 & b >= 10:
            print("patern A")
        elif a < 10 & b < 10:
            print("patern B")
        elif a >= 10 & b >= 10:
            print("patern C")
        else:
            print("patern D")
    
    trable(11, 11)
    trable(9, 11)
    trable(11, 9)
    trable(9, 9)

    とやって、patern B, Cのプログラムを入れ替えて、A, B, C, Dと出力してほしいというプログラムを作ると、実際には下記の出力になります。

    patern A
    patern D
    patern D
    patern D

    elif自体は複数条件を定義したいときに下記のように使用します。

    if 条件式A:
      条件式Aが真(True)となった場合の処理
    elif 条件式B:
      条件式Aが偽(False)で、条件式Bが真(True)となった場合の処理
    else:
      条件式Aが偽(False)で、条件式Bも偽(False)となった場合の処理

    しかし、if文、elif文の条件式が二条件になると、上記のような問題が起こると想定されます。
    よって、目的の出力にならないことが起こります。

    これの厄介なところはエラーが排出されないので、実際に結果を見てみないとうまくいっているかどうかがわからないという点です。

    改善策

    複数条件で複数の条件式で分けたいときには、elif文で複数条件を指定しないようにします。

    def resolve(a, b):
        if a>= 10:
            if b >= 10:
                print("patern A")
            else:
                print("patern B")
    
        else:
            if b >= 10:
                print("patern C")
            else:
                print("patern D")
    
    resolve(11, 11)
    resolve(11, 9)
    resolve(9, 11)
    resolve(9, 9)

    煩わしくなりましたが、こうすることで思っている想定通りの出力を行うことができます。

    プログラムではこのような思わぬ落とし穴があるので、書いたプログラムはしっかり確認することの教訓になりますね。

    追記(2022年8月)

    ()で括っていないことが問題であったみたいです。

    def trable(a, b):
        if (a >= 10) & (b >= 10):
            print("patern A")
        elif (a < 10) & (b < 10):
            print("patern B")
        elif (a >= 10) & (b >= 10):
            print("patern C")
        else:
            print("patern D")

    とすると、うまく条件分岐できました。
    もしくは、&をandと表記することでも解決することができます。

    def trable(a, b):
        if a >= 10 and b >= 10:
            print("patern A")
        elif a < 10 and b < 10:
            print("patern B")
        elif a >= 10 and b >= 10:
            print("patern C")
        else:
            print("patern D")

    &とandって同じように思えますが、&には論理積という側面があり、元々のプログラムだと

    a >= 10 & b < 10

    これは a >= (10 & b) < 10 の意味になるようで、
    a=9, b=9だと不等式が
    9>=8<10となり、Trueとなってしまうそうです。

    難しいですね・・・。

  • 移動でマイルが貯まる!!イライラ広告なしのお得アプリ

    移動でマイルが貯まる!!イライラ広告なしのお得アプリ

    移動でポイントやマイルが貯まるアプリというのが近年はやってきています。
    しかし、移動しても毎回アプリ開いて広告見ないと行けなかったり、やたら広告が多かったりと非常にイライラが溜まり、ポイントを貯めているのか、イライラを貯めているのかよくわからなくなります。

    最近雑誌で紹介されていた二つのアプリはすごい便利で、今までのめんどくさい広告はなく、楽しくマイルを貯めることができるものを発見してしまいました。

    公式サイト↓
    Miles
    ANA Pocket

    個人的に衝撃的だったので、ブログにまとめていきたいと思います。

    両アプリについて

    両方のアプリはほとんど同じシステムを使っていて、かつどちらも併用して使うことができるので、両方使うのがおすすめです。

    どちらも異動に応じてマイルが溜まり、マイルはポイントや商品に変えることができるというようになっています。
    どちらも現金に還元というオプションはないので、注意が必要です。

    移動手段に応じてマイルの獲得率が変化し、自動車よりも徒歩の方が距離に対する獲得率が高くなっています。

    移動手段の分類は自動で行ない、間違っている際には手動で変更申請することができます。

    移動履歴も見ることができるので、自分がこの日にどれぐらい移動したかというのを確認することができます。

    個人的には両アプリとも移動履歴の記録はかなり精度良く、ちょっとコンビニに家から出ましたという程度ですらきちんと認識し、マイルが溜まります!!

    唯一の問題点としては、スマホの充電の減りが以上に早いという点があります。
    そりゃずっと位置情報を使っているわけですから・・・・。
    こればっかりは仕方がないよね。

    Milesについて

    Miles Japan株式会社が作成しているアプリで、やはり元となるアプリであるだけに、とても作りがしっかりしています。
    実際の画面が下のようになっており、獲得マイルだけでなく、移動データなどあったり、移動履歴で詳細な移動がみれたりと健康や行動履歴をざっくり見るのにとても便利です。

    溜まったマイルは、JALのマイルに交換したり、キャンペーンに応募、コンビニのコーヒーに変えたりなど様々なものに交換できます。

    毎日行わなきゃいけない操作がないので、入れておいて気が向いたら確認するという感じで使うことができる点がANA Pocketとは違う点で、便利だなと思います。

    招待キャンペーンコード
    (下のコードからアプリを入れるとAmazonギフト100円分もらえます!!)

    https://miles.app/jp/NVPRMO

    招待コード:NVPRMO

    ANA Pocketについて

    ANAがMilesのシステムを使っているアプリのANA Pocketです。
    やはり大手の会社なだけに、初期画面が非常に見やすくなっています。

    こちらはポイントで貯まるようになっています。
    ANA Pocketではチャレンジというシステムがあり、チャレンジに応募し、その条件を満たすとプラスでポイントがもらえるというシステムになっています。

    そしてANA Pocketの最も良い点はANAのマイルに交換することができたり、ポイントを使ったガチャがあり、ポイントの使い方に困らないという点です。

    とりあえずANAのマイルに交換しておけばお得感があり、他に欲しいものがなければとりあえずそれでOKとできる点です。

    こちらもMilesと同様に移動履歴が見れたりなどするので、同様に行動履歴が見れたりします。

    Androidに対応していないのが一番のネックかな・・・
    今後に期待

    招待キャンペーンコード
    (下のコードからアプリを入れると5000ptもらえます!!)

    https://anapocket.page.link/WHQSjXJZqekVaqwr7