###### tags: `Python勉強会` # Python勉強会 第9回 資料 :::info **<第9回Web会議日程>** 2022年09月27日(火) 19:00から ::: ## 課題 #### 天気予報Appを実行する「<span style="color:blue">WeatherForecast.py</span>」がある。 #### このAppで表示する情報に以下を追加してください。 #### #### ・風の強さ #### ・波の高さ #### ・最高気温、最低気温 #### ・6時間毎の降水確率 ------ ## ①GetWeatherForecast関数に各要素の取得処理を追加 ### 取得したい要素の配置イメージ ![](https://i.imgur.com/mMAmwTS.png) :::warning **<変数「weatherinfo」>** キー「forecasts」内の予報日毎の配列からインデックスで要素を抜き出し、 予報日の情報群として予め定義しておいた変数 ```javascript= weatherinfo = response_dict["forecasts"][index] ``` 変数「weatherinfo」から更にキーを指定し、要素を抜き出して、必要な情報を取得する ```javascript= wind = weatherinfo["detail"]["wind"] ``` <br> 上記の2行をまとめて、以下のように記述しても同じ結果となる ```javascript= wind = response_dict["forecasts"][index]["detail"]["wind"] ``` ::: ### ・風の強さ "風の強さ"取得処理を追加して変数に代入 "風の強さ"は  キー「forecasts」に対応する値の配列の  キー「detail」に対応する辞書の  キー「wind」に対応する値 から取得できる ```javascript= wind = weatherinfo["detail"]["wind"] ``` ### ・波の高さ "波の高さ"取得処理を追加して変数に代入 "波の高さ"は  キー「forecasts」に対応する値の配列の  キー「detail」に対応する辞書の  キー「wave」に対応する値 から取得できる ```javascript= wind = weatherinfo["detail"]["wave"] ``` ### ・最高気温、最低気温 "最高気温"、"最低気温"取得処理を追加して変数に代入 "最高気温"は  キー「forecasts」に対応する値の配列の  キー「temperature」に対応する辞書の  キー「max」に対応する辞書の  キー「celsius」に対応する値 から取得できる ```javascript= max_temp = weatherinfo["temperature"]["max"]["celsius"] ``` "最低気温"は  上記のキー「max」をキー「min」に変更すれば取得できる ```javascript= min_temp = weatherinfo["temperature"]["max"]["celsius"] ``` ### ・6時間毎の降水確率 6時間毎の降水確率をそれぞれに取得処理を追加して変数に代入 "0 時から 6 時までの降水確率"は  キー「forecasts」に対応する値の配列の  キー「chanceOfRain」に対応する辞書の  キー「T00_06」に対応する値 から取得できる ```javascript= T00_06 = weatherinfo['chanceOfRain']['T00_06'] ``` 6時間毎の降水確率は、 キー「T00_06」をそれぞれ対応するキーに変更すれば取得できる ```javascript= T06_12 = weatherinfo['chanceOfRain']['T06_12'] T12_18 = weatherinfo['chanceOfRain']['T12_18'] T18_24 = weatherinfo['chanceOfRain']['T18_24'] ``` ## ②Labelのテキスト書き換え label2のtextを更新する処理に、 ①で取得した変数とタイトルを追記する ```javascript= label2["text"] = ("【{}の天気】\n 日付:{}\n 予報:{}\n 風の強さ:{}\n 波の高さ:{}\n 最低気温:{}\n 最高気温:{}\n 降水確率:\n 00時~06時:{}\n 06時~12時:{}\n 12時~18時:{}\n 18時~24時:{}".format(dateLabel, date, telop, wind, wave, min_temp, max_temp,T00_06,T06_12,T12_18,T18_24)) ``` ## JSONを見やすく表示する方法について :::warning **<pprint>** ・Pythonのオブジェクトを見やすく表示するためのモジュール ・デフォルトでは、辞書型のキーが自動でソートされるため、「sort_dicts=False」を指定する ```javascript= pprint.pprint(response_dict["forecasts"][2],sort_dicts=False) ``` ▼結果 ```javascript= {'date': '2022-10-05', 'dateLabel': '明後日', 'telop': '曇一時雨', 'detail': {'weather': None, 'wind': None, 'wave': None}, 'temperature': {'min': {'celsius': '16', 'fahrenheit': '60.8'}, 'max': {'celsius': '27', 'fahrenheit': '80.6'}}, 'chanceOfRain': {'T00_06': '60%', 'T06_12': '60%', 'T12_18': '60%', 'T18_24': '60%'}, 'image': {'title': '曇一時雨', 'url': 'https://www.jma.go.jp/bosai/forecast/img/202.svg', 'width': 80, 'height': 60}} ``` **<json.dumps>** ・PythonオブジェクトをJSONデータに変換するための関数 ・変換時にindentパラメータを設定すると、print()で表示した時に見やすくなる ・日本語が含まれる場合は、「ensure_ascii = False」を引数に指定する ```javascript= print(json.dumps(response_dict["forecasts"][2],indent=2,ensure_ascii=False)) ``` ▼結果 ```javascript= { "date": "2022-10-05", "dateLabel": "明後日", "telop": "曇一時雨", "detail": { "weather": null, "wind": null, "wave": null }, "temperature": { "min": { "celsius": "16", "fahrenheit": "60.8" }, "max": { "celsius": "27", "fahrenheit": "80.6" } }, "chanceOfRain": { "T00_06": "60%", "T06_12": "60%", "T12_18": "60%", "T18_24": "60%", "image": { "title": "曇一時雨", "url": "https://www.jma.go.jp/bosai/forecast/img/202.svg", "width": 80, "height": 60 } } ``` ::: ## Noneについて :::warning **<Noneのハンドリングについて>** ・PythonにおけるNoneは「何もない」「空」を表す ・他の言語でのnullと同じ  ⇒最低気温を取得した際にJSON上は **「null」** だが、Pythonのオブジェクトに変換する **「None」** になった <br> **<判定方法>** ・オブジェクト is None で判定可能 ▼最低気温でNone判定を行う場合 「min_temp」が**None**の場合、「min_temp_2」に”取得不可”を代入 **None**でない場合、「min_temp_2」に「min_temp」を代入 ```javascript= if min_temp is None : min_temp_2 = "取得不可" else: min_temp_2 = min_temp ``` 三項演算子という書き方で、1行で表現することも可能 ```javascript= min_temp_2 = min_temp if min_temp is not None else "取得不可" ``` ::: ## 長い文字列を見やすくコーディングする方法について :::warning **<変数に入れて連結>** ```javascript= msg = "abc" msg += "def" msg += "ghi" ``` ▼結果 ```javascript= 'abcdefghi' ``` **<ヒアドキュメント(三連引用符)の利用>** 三連引用符で囲うことでヒアドキュメントとして定義される ```javascript= msg = ''' abc def ''' ``` ▼結果 ```javascript= '\nabc\ndef\n' ``` 改行を含めたくない場合、行末に「\」を追加する ```javascript= msg = '''\ abc\ def\ ''' ``` ▼結果 ```javascript= 'abcdef' ``` **<文字列を連続して並べる>** Pythonでは文字列を連続して並べると自動的に連結する ```javascript= msg = "py" "thon" ``` ▼結果 ```javascript= 'python' ``` ソースコード上で改行が必要な場合は括弧で括ることで対応可能 ```javascript= msg = ( "abc" "def") ``` ▼結果 ```javascript= 'abcdef' ``` :::