🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

2回答

1378閲覧

pythonで自動で「今日はなんの筋トレか」報告したい

0Lq1nXJRzlyaIXA

総合スコア2

Python

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

0グッド

1クリップ

投稿2021/01/17 15:02

pythonで「今日はどこの筋トレをするのか」教えてくれるシステムを作っています。何曜日にどこの筋トレをするのかは決まっています。曜日を入力して「今日は◯◯の筋トレです」と教えてくれるシステムは作りました。
しかし、いちいち曜日の入力は面倒なので、自動的に曜日を判断し、どこの筋トレか教えてくれるシステムを作りたいです。
現在作ったシステムコードは下です
input_week = input('曜日を入力してください:')
if input_week =='月':
print('今日は背中・前腕・二頭(21レップ法)です')
elif input_week =='火':
print('今日は胸・腹です')
elif input_week =='水':
print('今日は肩・僧帽です')
elif input_week =='木':
print('今日は腕・腹・ヒラメです')
elif input_week =='金':
print('今日は胸・前腕です')
elif input_week =='土':
print('今日は肩・僧帽・腹です')
else:
print('今日は脚です')
このコードを少しでも活かせればいいなと思っています。
初心者なので出来るだけ細かく教えていただけると幸いです。
よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Surpris

2021/01/17 15:09

`datetime` と `locale` を使えば解決できそうです。 『Python datetime 曜日』あたりで検索してみてください。 提示されているコードをちょっと修正するだけでご要望のプログラムが仕上がると思います。
0Lq1nXJRzlyaIXA

2021/01/18 20:21

ありがとうございます。やってみます。
0Lq1nXJRzlyaIXA

2021/01/18 20:48

自動化はどうやってやるのですか。
guest

回答2

0

ベストアンサー

スクリプトを実行した日の曜日を自動的に判定することが課題であるとして、以下のような方法はいかがでしょうか。

output_menus_of_training.py

1# -*- coding: utf-8 -*- 2""" 3output_menus_of_training.py 4 5output menus of training according to today's day of the week. 6 7Usage 8----- 9python output_menus_of_training.py 10 11Reference 12---------------- 13using `datetime` in Japanese timezone 14 https://note.nkmk.me/python-datetime-day-locale-function/ 15""" 16 17import datetime 18import locale 19 20_ = locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8') 21 22 23def main(): 24 trainings = { 25 0: u'今日(月曜日)は背中・前腕・二頭(21レップ法)です', 26 1: u'今日(火曜日)は胸・腹です', 27 2: u'今日(水曜日)は肩・僧帽です', 28 3: u'今日(木曜日)は腕・腹・ヒラメです', 29 4: u'今日(金曜日)は胸・前腕です', 30 5: u'今日(土曜日)は肩・僧帽・腹です', 31 6: u'今日(日曜日)は脚です', 32 } 33 print(trainings[datetime.datetime.today().weekday()]) 34 35 36if __name__ == "__main__": 37 main() 38

上記コードを output_menus_of_training.py という名前で保存したとして、実行コマンドと期待される動作は次のようになります:

cmd

1# コマンド 2python output_menus_of_training.py 3# 出力例 4今日(火曜日)は胸・腹です

<以下、コードの軽い説明>
まず datetimelocale が上記コードでどのように使われているかについて。
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8') はコードが実行されるプロセスにおけるロケールを日本に設定します。
datetime.datetime.today() はスクリプトを実行した日時に相当する情報を持つ datetime オブジェクトを返します。
datetime オブジェクトのメソッド weekday() は月曜日(0)~日曜日(6)に相当する数字を返します。
従って datetime.datetime.today().weekday() はスクリプトが実行された日の曜日を0(月)~6(日)で返します。

次にトレーニングの内容を返す部分の修正について。
if 文を用いて場合分けすると、書いたときは分かりやすいのですが、場合分けの数が多くなるとそれだけコードが長くなり可読性が下がります。
また、個人的にはミスも生じやすいと考えています。
そこで辞書型 dict を用いて曜日(0~6)とトレーニングの内容の対応付けを見やすくします。この方法だと後から内容を追加しても、if 文を追加するよりはだいぶ可読性が良くなるでしょう。
今回は曜日をキーに、トレーニングの内容を値にもつ辞書型オブジェクト trainings を定義します。

以上から、 trainings[datetime.datetime.today().weekday()] はスクリプトが実行された日の曜日に対応するトレーニングの内容を文字列として返すことになります。
これを print 文でコマンドプロンプトに出力しています。

<コードの軽い説明 終わり>

上記コード内では辞書型を用いていますが、ご質問者様が作成なさった if 文での場合分けを代わりに用いていただいても問題ありません。
その場合は、例えば次のようになります:

# -*- coding: utf-8 -*- """ output_menus_of_training.py output menus of training according to today's day of the week. Usage ----- python output_menus_of_training.py Reference ---------------- using `datetime` in Japanese timezone https://note.nkmk.me/python-datetime-day-locale-function/ """ import datetime import locale _ = locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8') def main(): weekday = datetime.datetime.today().weekday() if weekday == 0: print(u'今日(月曜日)は背中・前腕・二頭(21レップ法)です') elif weekday == 1: print(u'今日(火曜日)は胸・腹です') elif weekday == 2: print(u'今日(水曜日)は肩・僧帽です') elif weekday == 3: print(u'今日(木曜日)は腕・腹・ヒラメです') elif weekday == 4: print(u'今日(金曜日)は胸・前腕です') elif weekday == 5: print(u'今日(土曜日)は肩・僧帽・腹です') else: print(u'今日(日曜日)は脚です') if __name__ == "__main__": main()

投稿2021/01/19 02:51

Surpris

総合スコア106

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0Lq1nXJRzlyaIXA

2021/01/19 09:37

ご丁寧にありがとうございます!!助かります!
0Lq1nXJRzlyaIXA

2021/01/19 20:28

このコードをアプリを開かなくても夜7時に通知が来るようにすることは現実的に可能なのでしょうか
Surpris

2021/01/20 13:58

「アプリを開かない」=「`python output_menus_of_training.py` というコマンドをいちいち打たない」と解釈するならば答えは イエス です。 「アプリを開かない」を本当に何のアプリも開かないと解釈するならば答えは ノー です。 以下、前者であるとしてコメントします。 私の拙い理解では、コマンドをいちいち実行せずに定期的に通知を送るようにするには、何かしら常駐起動しているソフトやスクリプト(以下、単に常駐アプリと呼ぶことにします)が必要となります。 常駐アプリの実装は例えば以下の項目によって異なります:  ・常駐アプリを実行する機器(Windows PC、ラズパイ、スマホ、etc.)もしくはクラウドサーバー  ・通知の手段(メール、LINE、ポップアップ、etc.) 常駐アプリが起動している機器は常に電源をONにするのが普通です(電源がOFFだと当然通知が来ないので)。 もしご質問者様の環境で常にアプリを起動させておける機器がない、もしくは手元の環境で起動しっぱなしにしたくないのであれば、クラウドサーバー(Heroku、Amazon Web Services、Microsoft Azure、Google Could)を利用するのが良いでしょう。 また、通知の手段によっては他のアプリとの連携が必要になる場合があります。 いずれにせよ、ご質問者様が想定されている動作を実装する方法は様々ですので、いろいろ検索してみるとご自身に合った方法が見つかると思います。 ※具体的にどのように実装すればよいか、という課題は今回のご質問の内容から外れますのでここでは扱いません。
0Lq1nXJRzlyaIXA

2021/01/20 20:24

ありがとうございます。私は後者を考えていましたが、不可能ならば前者の方法も試してみたいと思います。ご丁寧にありがとうございました。
Surpris

2021/01/21 00:19

もしかしたら私が寡聞にして知らないだけかもしれませんので、調べていただくか、もしくはより詳しい方に質問なさるのがよろしいかと思います。 あと、今回作成されたコードを使わなくてもよいのであれば、スマホのアラームやカレンダーを用いて同様の機能が実現できると思われます。 それらは基本的にバックグラウンドで起動しているため、設定するという手間はありますがアプリをいちいち起動するという手間は(おそらく)省けます。
0Lq1nXJRzlyaIXA

2021/01/22 08:23

ご親切に最後までありがとうございます!!検討します!!
guest

0

datetimeのdateオブジェクトやdatetimeオブジェクトを使うことで解決します。
date.weekday()で曜日を取得できます。
参考

投稿2021/01/17 18:26

dark-eater-kei

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0Lq1nXJRzlyaIXA

2021/01/18 20:22

ありがとうございます。やってみます。
0Lq1nXJRzlyaIXA

2021/01/18 20:47

曜日を取得しても自動化する方法が分からないのです。また、どのように組み合わせればいいのでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問