komoto / エンジニアブログ

プログラミングについてアウトプットします。

連想配列を条件分岐で使う

私がプログラミングを学び始めた当初、連想配列の使い所が分かりませんでした。

現在もまだあまりわかっていませんが、連想配列の使い所の参考になれば嬉しいです。

連想配列とは

連想配列とは、キーとそのキーに対応した値を格納した配列のことです。

言語によっては「辞書」とも呼ばれます。

通常の配列では、値を取り出す時はインデックスを使いますが、連想配列ではキーと呼ばれるものを使います。

詳しくは以下のサイトを参考にしてください。

techacademy.jp

例えば、次のような宣言をしたとします。(以下、Pythonで書きます。)

dict = {"リンゴ" : 100, "キャベツ" : 150}

配列と違い宣言には、{ }を使います。(通常の配列は[ ]を使う言語が多いと感じます)

そして、キーから値を取り出すには次のようにします。

apple_price = dict["リンゴ"] #apple_priceには100が格納されます
kyabetsu_price = dict["キャベツ"] #kyabetsu_priceには150が格納されます

では、本題に移ります。

制御構文(if, Switchなど)での条件分岐

連想配列を条件分岐で使う利点はコードがシンプルで読みやすくなること(可読性向上)と、条件を追加しやすくなること(拡張性、保守性向上)です。

例えば、食物を買おうとする客が1000円出した際に、そのお釣りを求め表示したいとしましょう。

そうするとifで書くと一例として次のようになると思います。

food = input() #input()は標準入力の関数 ここでは「リンゴ」や「キャベツ」など商品名を入力するとする
oturi = 1000
if food == "リンゴ":
    oturi = oturi - 100
elif food == "キャベツ"
    oturi = oturi - 150
print(oturi)

これを連想配列で書くと

name2price = { #食品名と値段の対応表
    "リンゴ" : 100, 
    "キャベツ" : 150
    } 

food = input() #input()は標準入力の関数 ここでは「リンゴ」や「キャベツ」など商品名を入力するとする
oturi = 1000
oturi = oturi - name2price[food]
print(oturi)

となります。 2つくらいであればまだifやswitchで書けるのですが、数が多くなってくると大変なことになります。

ここから2つ増やすだけでも

#ifの場合
food = input() #input()は標準入力の関数 ここでは「リンゴ」や「キャベツ」など商品名を入力する想定
oturi = 1000
if food == "リンゴ":
    oturi = oturi - 100
elif food == "キャベツ":
    oturi = oturi - 150
elif food == "きゅうり":
    oturi = oturi - 50
elif food == "もやし":
    oturi = oturi - 10
print(oturi)

#------------------------------------------

#連想配列の場合
name2price = { #食品名と値段の対応表
    "リンゴ" : 100, 
    "キャベツ" : 150,
    "きゅうり" : 50,
    "もやし" : 10,
    } 

food = input() #input()は標準入力の関数 ここでは「リンゴ」や「キャベツ」など商品名を入力するとする
oturi = 1000
oturi = oturi - name2price[food]
print(oturi)

となり、連想配列を使うことでコードが美しくなることがわかると思います。

以上、何かの参考になれば幸いです。

コーディングに慣れてくるまでは、とにかく動くコードを書くことが大切です。
しかし、ある程度慣れてきたら他に効率よくコーディングする方法がないか考えることがさらに大切になります。
私も常に考えてはいるのですが、まだまだなかなかうまくいかないですが...
でも焦らず頑張っていこうと思います。

ちなみに余談ですが

oturi = oturi - ○○の箇所はすべてoturi -= ○○

という風にも書けます。

draw.ioがVScodeで使えるようになった

draw.ioとは

draw.ioはフローチャートをはじめクラス図やアクティビティ図などのUMLなど、さまざまな図が書ける無料のWebアプリツールのことです。

無料とはいえ、実用性が高いので設計やコーディングなどで簡単な図を書きたいという時には、かなり使えるツールです。

私事ですが、asta community が使えなくなって以降、私もdraw.ioを使うようになりました。

以下が、draw.ioのサイトです。

Flowchart Maker & Online Diagram Software

英語が苦手な方は、右下の地球儀マークから言語変更できるので試しに使ってみてください。

VScodeとは

Microsoftが提供するコードエディタです。

デフォルトでは必要最低限の機能しか備わっていませんが、非常に軽量で動作が軽快です。

カスタマイズの拡張性が非常に高いため、自分のお気に入りの開発環境に仕立てることもできます(それなりに勉強は必要ですが・・・)。

現在主流になっているエディターの一つではないでしょうか。

VScodeでdraw.ioを使う

いつも通り、拡張機能を検索する箇所でdraw.io Integrationと入れて検索。

そして、インストールすれば使えるようになるみたいです。

その後、ファイルを作成しそのファイルの拡張子を.drawioまたは.dioにすれば使えます。 

 VScodeでdraw.ioを導入する方法を分かりやすく説明されている記事へのリンクを貼っておきますね。参考にしてみてください。

qiita.com

【django】models.DateTimeFieldに現在の時刻(timezone.now)を格納するときデータベース内の値が現在時刻にならない問題

models.DateTimeFieldに現在の時刻(timezone.now)を格納するときデータベース内の値が現在時刻にならない問題の解決に1時間くらい費やしました。
なので、その解決法?について残しておきます。

models.DateTimeFieldに現在の時刻を入れたい場合は下の記事を参考にしてみてください。

sleepless-se.net

結論

データベース内の値は、現在時刻になっている必要はないみたいですね。(UTCになっているから)
そして、表示するときにTIME_ZONEで設定した地域の時刻に自動的に変換されるようです。

では、いつ変換されるのか

  • テンプレートファイル(htmlファイルなど)に渡して表示するとき
  • views.pyでtimezone.localtime(timezone.now())したとき

時刻を表示したいだけならば特に何もしなくても自動的に表示されるので楽ちんです。

ただ、「ブログとかで書いた記事を指定した時刻に投稿したい」とか時間指定で何かするものであるなら、views.pyであらかじめtimezone.localtime(timezone.now())で変換して、その変換した値をデータベースに格納する必要があります。(そうしないと9時間遅れて投稿されます)