###### tags: `Python勉強会`
# Python勉強会 第9回 資料
:::info
**<第9回Web会議日程>**
2022年09月27日(火) 19:00から
:::
## 課題
#### 天気予報Appを実行する「<span style="color:blue">WeatherForecast.py</span>」がある。
#### このAppで表示する情報に以下を追加してください。
####
#### ・風の強さ
#### ・波の高さ
#### ・最高気温、最低気温
#### ・6時間毎の降水確率
------
## ①GetWeatherForecast関数に各要素の取得処理を追加
### 取得したい要素の配置イメージ

:::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'
```
:::