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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

5回答

676閲覧

うるう年を20個表示させる方法

amagrammer

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2017/09/06 09:23

編集2017/09/07 00:51

「YEAR」の部分にある数字を入れると、その翌年以降の閏年を20個表示するプログラムを作りたいです。
条件をif文で示すことはできているかと思うのですが、20個表示させてそこで止める方法、そしていろんな数字を入れてあっているか確認する方法がうまくいきません。

def leapyear(YEAR): n = 0 while True: if YEAR % 400 == 0: n = n + 1 if YEAR % 4 == 0 and YEAR % 100 == 0: pass elif YEAR % 4 == 0: n = n + 1 print(YEAR = YEAR + 1) if n == 20: break print (leapyear(2020))

結果は下記のように出ておりました。
Traceback (most recent call last):
line 13, in <module>
print (leapyear(2020))
line 10, in leapyear
print(YEAR = YEAR + 1)
TypeError: 'YEAR' is an invalid keyword argument for this function

Process finished with exit code 1

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

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

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

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

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

kei344

2017/09/06 10:00

質問文のコードはコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。
amagrammer

2017/09/06 14:30

コードの入れ方も知らずに質問してしまい、大変失礼いたしました。
guest

回答5

0

ベストアンサー

全体的におかしいですね。
while で回すなら、n を条件にすると良いです。

また、year を 1 づつ足そうとしていますが、4 で割れるまで足したら、あとは 4 づつ足すと効率的です。
それと、上記を使えば、うるう年の条件は
year % 100 != 0 or year % 400 == 0
で満たされます。

宿題、がんばってw

追記
幾つか回答がついていて、ちょうどよいので追記します。
まず、私の回答のサンプルコードですが、以下となります。

python

1def leapyear(year): 2 print('start:',year) 3 n = 1 4 while year % 4 != 0 : 5 year += 1 6 while n <= 20 : 7 if year % 100 != 0 or year % 400 == 0: 8 print(n,year) 9 n += 1 10 year += 4 11leapyear(1990)

最初のwhileで4で割り切れるまでyearを増やし、2番目のwhileで20個表示します。
Python は始めて2ヶ月なので、ちょっと書き方が Python っぽくないかもしれませんw

で、追記の本題ですが、うるう年ってコンピュータで扱える条件が独立して 2 つあるんです。

1,4で割り切れればうるう年、だけど100で割り切れるときは飛ばす。ただし400で割り切れれば、うるう年!
2,2月29日がある。

私のアプローチは 1 で、YouheiSakurai さんのが 2 ですね。
これは、作り出される結果に対しての考え方の違いでもあります。

1,法則に従って、うるう年を作り出す
2,順次、年を検証して、条件合致したものを抽出する

こうしてみると、結構違っている事が分かり、面白いと思います。

ちなみに、LouiS0616 さんの回答は「関数には 1 つのことしかやらせない!」、YouheiSakurai さんの隠れコンセプトは「yield 使ってみたかった^^」だと思われます。

プログラムって入力と出力を紐付けるものですが、人によって色々書けるので、メッセージを読み取ると興味を持って読み取ることができ、学習がすすむと思います。

がんばってくださいね^^

投稿2017/09/06 10:38

編集2017/09/17 12:12
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

amagrammer

2017/09/06 14:41

4ずつたしていくというのは美しいですね。その方が、条件を一つ減らせますし、画期的ですね。今回は4で割れるまで足したらという条件発動がうまく使えず、一つずつ足していくというスタイルを選びました。美しいコードがかける日まで、宿題頑張ります。ありがとうございました。
退会済みユーザー

退会済みユーザー

2017/09/07 00:45

サンプルコード、記述してみました。 もうちょっとプログラムに興味を持ってもらいたかったので、今回の皆さんの回答に関しても少し追記しました。 プログラム、楽しんでください^^
amagrammer

2017/09/07 01:03

ご丁寧にありがとうございます。昨日プログラムが動作した時のアハ体験もすごかったですが、解き終わった後も同じ課題でもいろんなことが学べますね。いまは考えに困って鼻血が出そうな時間がつらいですが、楽しめる領域にいけるように勉強します。ある程度結果が予測できるものは「作り出す」でいけるということですね。システムの不可もなるべく作り出す方法のほうが負荷が少ないということだと理解します。そこら辺も含めて研究してみます。
guest

0

面白そうなので課題をやってみた。

python

1from datetime import date 2 3def iter_leap_years(YEAR): 4 while True: 5 try: 6 date(YEAR, 2, 29) 7 yield YEAR 8 except ValueError: 9 pass 10 YEAR += 1 11 12for i, year in enumerate(iter_leap_years(2020)): 13 print(year) 14 if i == 19: 15 break 16

投稿2017/09/06 12:37

YouheiSakurai

総合スコア6142

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

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

amagrammer

2017/09/06 14:50

インポートしてやるとこういうスタイルでできるのですね。これが理解できるようになるまでもうしばらく時間がかかりそうですが、勉強してから振り返ってみたいと思います。ありがとうございました。
guest

0

インデントが崩れているためコードは読めませんが、次の点は文法上アウトです。

Python

1print(YEAR = YEAR + 1)

代入を出力することはできません。

また、次の点は確実に想定通りに動作しないでしょう。

Python

1print (leapyear(2020))

返り値のない関数を出力しようとしています。


ああ、宿題の提出が近いんだな、と思いました。
最低限の文法はしっかり勉強しましょう。また、正しい質問が出来るようにしましょう。

  • コードブロックを用いていない
  • エラーの内容が書かれていない
  • 仕様が曖昧、実行例がない

動作するプログラムが完成したようなので追記。こんな風に書くかなぁ。
is_leap_yearのネストを浅くするために、比較回数を犠牲にしています。

Python

1def is_multiple(div, base): 2 return div % base == 0 3 4def is_leap_year(year): 5 if is_multiple(year, 400): 6 return True 7 if is_multiple(year, 100): 8 return False 9 if is_multiple(year, 4): 10 return True 11 return False 12 13def main(): 14 year = int(input('>> ')) 15 while year % 4 != 0: 16 year += 1 17 18 num_of_leap_year = 0 19 while num_of_leap_year < 20: 20 if is_leap_year(year): 21 print(year) 22 num_of_leap_year += 1 23 year += 4 24 25if __name__ == '__main__': 26 main()

テストはろくにしてないので、変な部分があるかもしれません。

投稿2017/09/06 09:35

編集2017/09/06 15:35
LouiS0616

総合スコア35660

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

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

amagrammer

2017/09/06 14:39

文法上でダメな部分を指摘していただけるだけでも初学者としては大変ありがたいです。質問の作法も丁寧に教えていただいてありがとうございました。まさに、その通りで、宿題に追われて無我夢中でした。ありがとうございました。
amagrammer

2017/09/07 01:08

関数をわけて記述いただいているうえに、普通は略すところを単語で説明風にして記述されているので、読解しやすいです。Pseudocodeに近い感覚で読むことができました。ありがとうございます。ネストループを深くしすぎると頭も混乱してくるので、ある程度長くなったら切り分けもできるように考えてみます。
guest

0

python

1def leapyear(year): 2 for i in range(4): 3 if year%4!=0: 4 year+=1 5 else: 6 break 7 rslt=list() 8 while len(rslt)<20: 9 if year%4==0 and not (year%100==0 and year%400!=0): 10 rslt.append(year) 11 year+=4 12 return rslt 13 14def print_leapyear(): 15 year=int(input("start year??>>")) 16 for i in leapyear(year): 17 print(i) 18 19print_leapyear()

投稿2017/09/06 23:53

y__sama

総合スコア83

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

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

0

みなさま、迅速なご助言ありがとうございました。
試行錯誤してみて、+1する場所を前方に持ってきて、print の指示に計算式が入ることを避けました。
コードブロックを用いてということでしたので、以下、使ってみます。
コードの書き方だけでなく、質問のしかたなど、流儀もきっちり学んでいきたいと思います。
この度はお騒がせしまして失礼いたしました。

year1 = int(input(">> "))+1 YEAR=year1-1 n = 0 while True: if year1 % 400 == 0: print(year1) n = n + 1 if year1 % 4 == 0 and year1 % 100 == 0: pass elif year1 % 4 == 0: print(year1) n = n + 1 if n == 20: break year1 = year1 + 1

投稿2017/09/06 14:41

amagrammer

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問