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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

Q&A

解決済

4回答

1092閲覧

0から99までの足し算

masa_ya

総合スコア2

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

0グッド

0クリップ

投稿2020/10/27 08:57

編集2020/10/27 09:19

0から99までの足し算をpop()を使用して行いたいのですが、模範解答が理解できません。わざわざrangeとlenを使っている意味を教えて頂きたいです。
本当の初心者なのでわかりやすく教えて頂きたいです。

模範解答はこれです

Python

1list_hundred = list(range(100)) 2sum_all = 0 3for i in range(len(list_hundred)): 4 sum_all += list_hundred.pop() 5print(sum_all)

自分の答えはこれです

Python

1list_hundred = list(range()) 2sum_all = 0 3for i in list_hundred: 4 sum_all += list_hundred.pop() 5print(sum_all)

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

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

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

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

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

Takumiboo

2020/10/27 09:00

「POP」タグは今回の質問と無関係なようなので外してください。
tiitoi

2020/10/27 09:59 編集

そもそも pop していく必要があるんですかね for i in list_hundred: sum_all += i でいい気がするのですけど
meg_

2020/10/27 11:13

質問者さんのコードは「TypeError: range expected 1 argument, got 0」が出ます。
guest

回答4

0

ベストアンサー

正しい回答方法などではなく
なぜ今回の様な結果になっているかについて例に挙げて解説させていただきます。

用意したリストを使用してfor文でループさせていますが
その用意したリストの中から1つずつ要素を削除してループさせている為に
ちょうど半分時点でループが終了してしまっています。
この様な動作を反復的、反復処理と言います。

手元に全100巻の漫画があったとします。
1巻読み進める都度、最後の1巻を燃やしたとしたら
49巻に到達した時点で次の巻がなくなってしまいますよね?

python

1手元にある漫画全巻 = list(range(100)) 2 3for 現在の巻 in 手元にある漫画全巻: 4 print('今読んだ巻 :', 現在の巻) 5 print('燃やした最後の巻 :', 手元にある漫画全巻.pop()) 6 print('残っている巻数一覧 :\n', 手元にある漫画全巻) 7 8 次の巻数 = 現在の巻 + 1 9 10 try: 11 次の巻 = 手元にある漫画全巻[次の巻数] 12 print('次は' + str(次の巻) + 'を読む予定です') 13 except IndexError: 14 print('もう次に読む' + str(次の巻数) + '巻が燃やされてしまっていているので処理は終了です') 15 16 print('='*50)

投稿2020/10/27 12:00

nto

総合スコア1438

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

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

0

Pythonの公式サイトに、その事が書かれています。

コレクションオブジェクトの値を反復処理をしているときに、そのコレクションオブジェクトを変更するコードは理解するのが面倒になり得ます。 そうするよりも、コレクションオブジェクトのコピーに対して反復処理をするか、新しいコレクションオブジェクトを作成する方が通常は理解しやすいです:

実際、「自分の答え」のコードでは正しい結果を出力しません。

投稿2020/10/27 09:03

maisumakun

総合スコア146018

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

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

ebal

2020/10/27 09:33

正直,これ模範解答もなぜiが必要なのか,なぜforなのかといったところで気持ち悪い気がします. 気持ちいい回答1 再帰 ```python3 list_hundred = list(range(100)) def recur_add(acc, l): if l: return recur_add(acc+l.pop(), l) else: return acc print(recur_add(0, list_hundred)) ``` 気持ちいい回答2 while ```python3 list_hundred = list(range(100)) while list_hundred: sum_all+= list_hundred.pop() print(sum_all) ```
toast-uz

2020/10/27 11:47

あー、でも、pop()の意味を掘り下げると、ebal様の回答2の方がよいかも。
ebal

2020/10/27 11:57

回答1は!!! なんて冗談はおいておいて,popで周回するのってなかなかないですよね. コピー作らないしwhile内でリストにappendできるしで回答2はそれなりにわかりやすくなったのではないかと思っています.
toast-uz

2020/10/27 12:10

回答1は、「もっと気持ち悪い回答1」と命名しておけば、Good!
ebal

2020/10/27 12:14

listにおけるpopの使い方としては(見た目上)無駄にループもしないし一番正しいのでは……?(気持ち悪さとコールスタックは無視)
toast-uz

2020/10/27 12:30

再起がは良いとしても、同じ引数の中でlが変化しているところは、改善したいですね return recur_add(acc+l.pop(), l)
ebal

2020/10/27 13:08

代入してから,というのも考えたのですが,再帰としては代入なんか使わないで一行で収まるほうが正義かなと考えてこうなりました.(よってとても気持ち悪い)
toast-uz

2020/10/27 14:03

popという変数を変更する操作が、再帰という関数型的な構造に入っているから、気持ち悪いのでしょうか・・。popから離れて、再帰を単に書くだけなら、気持ち良く書けます。 list_hundred = list(range(100)) def recur_add(l): if l: return l[0] + recur_add(l[1:]) else: return 0 print(recur_add(list_hundred))
maisumakun

2020/10/27 14:21

言語を問わず、「あるコレクションを基準に回しながら、そのコレクションの中身を書き換える」ような行為は、入念な注意が必要です(その構造を取る積極的な理由がないなら、避けるほうが賢明です)。Javaなどでは例外が起きる場合もあります。
ebal

2020/10/27 14:28

そのあたりはやっぱりLispやRubyの破壊的変更は`!`付きメソッドというのわかりやすいですよね. toast-uzさんのコードだと(Pythonでは意味ないけど)末尾再帰にならないのでアキュムレータはほしいと思ってしまいます.
toast-uz

2020/10/27 22:26

末尾再帰版です! list_hundred = list(range(100)) def recur_add(acc, l): if l: return recur_add(acc + l[0], l[1:]) else: return acc print(recur_add(0, list_hundred)) maisumakun様の言う通り、結局、この問題設定がよくないです、が結論ですね。そこを主張して「この講座テキスト?は使わない方が良い」と断言した回答を書いた人が、ベストアンサー決定! 笑
ebal

2020/10/29 00:37

popが消えてしまった…… この問題設定が謎で,「このテキスト(仮)は使わないほうが良い」という結論には強く同意します.
guest

0

※ 質問の意図を間違えた回答でしたので、削除しました。

投稿2020/10/27 11:05

編集2020/10/27 11:09
TakaiY

総合スコア13790

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

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

0

この質問を見て、私も質問者様の気持ちになり、その後になぜ結果が異なるのか、少し悩みました。

ということで、不具合の原因に直接対処する、気持ちの良いコードを作ってみました。

Python

1list_hundred = list(range(100)) 2sum_all = 0 3for i in list_hundred.copy(): # イテレーション用に新たなリストを作る 4 sum_all += list_hundred.pop() 5print(sum_all)

投稿2020/10/27 09:53

toast-uz

総合スコア3266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問