質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

Q&A

解決済

1回答

1493閲覧

for文内にて強制的に落ちる現象について

Adds

総合スコア1

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python

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

0グッド

0クリップ

投稿2021/05/11 02:03

編集2021/05/11 02:07

前提・実現したいこと

一週間前の日付から本日の日付までを連続して値を取得したいのですが
class定義内にあるfor文がエラーも吐かれずに落ちてしまいます。
Pythonは始めたばかりのため、至らぬ点もあるかと思いますが、
ご教授いただければと思います。

該当のソースコード

from datetime import timedelta from datetime import datetime today = datetime.now() weekago = today - timedelta(days=6) # 今日の日付から年を取得 now_year = today.strftime("%Y") # 今日の日付から月を取得 now_month = today.strftime("%m") # 今日の日付から日を取得 now_day =today.strftime("%d") now = "{}-{}-{}".format(now_year, now_month, now_day) # 今日の日付から年を取得 weekago_year = weekago.strftime("%Y") # 今日の日付から月を取得 weekago_month = weekago.strftime("%m") # 今日の日付から日を取得 weekago_day = weekago.strftime("%d") weekago = "{}-{}-{}".format(weekago_year, weekago_month, weekago_day) start = datetime.strptime(now, '%Y-%m-%d').date() end = datetime.strptime(weekago, '%Y-%m-%d').date() def daterange(start, end): for n in range((end - start).days): #ここで落ちる yield start + timedelta(n) for i in daterange(start, end): print (i)

補足情報(FW/ツールのバージョンなど)

エラー時、エラーメッセージは出ませんでした。
TypeError:や行数指定のエラーメッセージ

Python 3.9.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

落ちるというか、ループが一周もしていないだけです。正常な動作です。

Python

for n in range((end - start).days):

これは次の誤りでしょうね。

Python

1for n in range((end - start).days, 0):

追記

datarangeを汎用的にするなら、startとendのどちらが古いか判定する必要があります。

Python

1def daterange(start, end): 2 if end < start: 3 start, end = end, start 4 5 for n in range((end - start).days): 6 yield start + timedelta(n)

境界値については調整が必要です。仕様に合わせて修正して下さい。

投稿2021/05/11 02:07

編集2021/05/11 02:13
LouiS0616

総合スコア35660

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

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

LouiS0616

2021/05/11 02:09

agoなので一週間前であってますね。ちょっと修正します。
LouiS0616

2021/05/11 02:10

修正しました。
Adds

2021/05/11 02:40 編集

ありがとうございます!正常に動作しました。 weekagoとnowをstart,endの関数に入れる際、逆のほうが分かりやすかったですね... 分かりやすいソースコード作りを心がけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問