KNIMEST’s diary

KNIME使いがPythonも使いたくて勉強中

【Python学習帳】025_if 文の入れ子とPEP8

初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

第5章の制御構造の勉強中で、if 文の基礎を学んでいます。

knimest.hatenablog.com

さて今回も「5.4 if 文による分岐」より

5.4.3 if 文の入れ子

を学びます。

 

サンプルコードで示される通り、複数条件での分岐処理をする際にはいくつか表現方法があります。

複数条件をandなど論理演算子で繋ぐ書き方は前回に学びました (p5-8.py)。

下記のように複数回のifを入れ子に使う書き方もあります (p5-9.py)。

上記ぐらいシンプルな例ならどんな書き方でも読めなくはないでしょうが、Pythonでの表現方法にはかなりの自由度があるので、将来の自分も含めて読みやすいコードを書くには一般的なルールを守った方が良いそうです。

atmarkit.itmedia.co.jp

以下は余談となりますが、上記のサイトから引用しつつ、可読性が高くて一貫性のあるPythonコードを書くための指針とされるPEP 8を学んでみます。

PEP8については命名規則に関して一度紹介済です。

knimest.hatenablog.com

Pythonは誰が書いても同じようなコードとなりやすいように作られた言語だが、そうはいってもコードの書き方そのものが言語仕様上でガチガチに定められているわけではない。例えば、if文を例に取れば、同じコードでも次のような書き方ができる。

https://atmarkit.itmedia.co.jp/ait/articles/1912/10/news045.html

PEP8では「複合文を1行にまとめない」という基本ルールがあるそうで、上記のようにシンプルな内容の時だけは一行にまとめてもよいとのこと。

ただし、節が複数あったり、本体が複数行で構成されたりするときには、使用しないことが強く推奨されている。以下にダメな例を示す。

https://atmarkit.itmedia.co.jp/ait/articles/1912/10/news045.html

なるほど、上記だとやや読みにくいかもと私も感じました。Bing Chatに相談したところ下記の回答でした。

Bing Chatだと情報の出所を詳細情報として正しいリンク先で示してくれるのがありがたいです。今回の引用元の記事も2番目にしっかり紹介されていました。

そして適切な改行とインデント、確かに読みやすいと思いました。

 

さて教材に戻って

演習 5-13 エラーを体験する(4).

if 文内で比較演算子 == の代わりに誤って代入演算 = を書いてしまうことはよ

くある間違いの一つです.

はい、私も既に何回か間違えました。

上述のp5-9.pyを例としてエラーをわざと発生させてみます。

結果として

この例では次の図のように「Invalid syntax (文法的に不適切)」というダイアログ が示され,該当箇所が赤く表示されます.

これでif文に関しての5.4節の学習を終えました。

次回は5.5節にてエラーへの対処を学びます。

knimest.hatenablog.com

【Python学習帳】024_if 文による分岐

初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

第5章の制御構造の勉強中で、前回はwhile 文による繰り返しを学びました。

knimest.hatenablog.com

さて今回は

5.4 if 文による分岐

を学びます。

While文でよく使われるif文での分岐処理は既に前の回で体験はしています。

今回はChatGPTではなくBingチャットも使ってみました。

語句検索のような入力でサンプルコードを提供してくれるのですね。

日本語でとお願いしてみました。

私が加えるコメントなどなく、なかなかわかりやすい例を出してもらえました。

 

さて、

条件の代表的なものは数値の比較です.比較するための演算子として次のものが用意されています.

http://hdl.handle.net/2433/265459

「等しい」を判定する演算子は等号2つ(==) です.間違いやすいので注意しまし ょう.

また,浮動小数点数(float)は多くの場合,近似値を扱いますので,「等しい」という比較は予期せぬ振る舞いをする可能性があります.これの使用を避け,不等号で判断するようにしてください.

文字列でも条件の設定は出来ますね。

「in」で左辺が右辺の文字列に含まれているかどうかを調べることができます.
例えば
 'a' in 'abc'
に対して
 True
が得られます.

実行結果まで出してくれるのかと感心したのですが、実際にはprintされるのはHello Worldが一回だけですね。Chatは間違えることもあるので自分で確認することって大事です。

また、実際のループ処理は

Xからoが一つも無くなる“rld”まで実行されて終了する様です。

 

文字列を変えて確認してみました。

どうでもいいような 例だけど。

 

さて、遊び過ぎたので次へ。

複数の条件を合成するために論理演算子 「and」,「or」,「not」が用意されていま す.

Python では演算子に優先順位が定義されており,
● 算術演算は比較演算よりも優先,
● 比較演算は論理演算よりも優先
されます.プログラムを読みやすくするためには () で明示的に優先順位を示した方がいいでしょう.例えば
    a == 1 and b != 0

より以下のほうが動作は同じですが,読みやすいでしょう

    (a == 1) and (b != 0)

上記の読みやすい表現というのは本当に大切なことだと思っています。

If文って上記の通り多種多様に条件設定できます。
さらに

if 文は条件が成立している場合のみ与えられたブロックを実行するもののほか,成立しない場合 (else) に実行するブロックを指定するもの,成立しない場合にさらに別の条件を検査するもの (elif, else if の意味) など,いくつかのパターンがあります

ということで複雑な条件分岐が可能な分、後で読み返して一体どんな分岐かさっぱり分からなくなることもありうるってことです。

あれ、意外にすっきりしてるかも。こういうのを数秒で書いてくれるのはありがたいですよね。敢えてさらに複雑な例を書いてくださいって頼んでみました。

複雑だ。

ただ最小値を求めるif文なら下記の通りでした。

あるいはifすら使わないで

自分が書くときにちゃんと簡潔で効率よいコードが書けるだろうかと悩ましく思いました。

ちょっと寄り道が過ぎました。
次回は「if 文の入れ子」など学びます。いくらでも複雑にできちゃうんですよね…

knimest.hatenablog.com

【Python学習帳】023_while文による繰り返し

初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

第5章の制御構造の勉強中で、内包表記に関して教材を離れて少し調べていました。ChatGPTはPython初心者には先生役として十分な相談相手だと知りました。

knimest.hatenablog.com

さて今回は

5.3 while 文による繰り返し

を学びます。

早速にニュートン法のサンプルコードでの演習でした。

平方根の計算を一定の精度を要求して計算するようにしましょう.r1 と r2 は真 の値を挟んでいますので,その差の絶対値 |r1 – r2| は計算の精度として捉えること ができます.

精度が10の-6乗 (1.0E-6) 以上の間は繰り返し処理するコード (p5-6.py) になっています。

無限ループ型 (p5-7.py) も出力は全く同じになります。

出力は同じですが、

p5-6.py との違いは以下の 2 点です.
● ループを開始する際に終了条件を判定していません.
● while 文の条件は継続を判定するためのものですが,break 文を発動する条件 は終了を判定するためのものであり,条件は逆になります.

条件が逆になるとは継続する条件に対して逆に終了する条件で制御するということかと思います。

実際に脱出のための条件が成り立たない場合は Python の実行を強制的に止めなければなりません.キー操作「Ctrl-C」で停止させてください.

とのことでした。

 

While文の学習と合わせて精度の定義の仕方として絶対精度と相対精度のコラム紹介もありましたので引用しておきます。

Version2021_10_08_01.pdf
http://hdl.handle.net/2433/265459

コンピュータを使った数値の計算では真の値に収束する数列などを使って近似計 算します.

計算をどこで打ち切るかは必要な計算の精度から決まります.

 

仮に絶対精度0.001を目標と定めたとして

「例えば平方根の計算を考えると 10000 の平方根は 100 ですの で,0.001 という絶対的な精度はかなり高いのに比べ 1/10000 の平方根は 1/100 = 0.01 ですので,0.001 の精度というのはかなり悪いことになります.

そこで,計算で得られる値に対して,一定の比率(例えば 0.001)の精度を要求する

と考えて、真の値との比率で相対的な精度を定義するのが相対精度とのこと。
すなわち

相対精度で計算を終了させることは,理科の計算で行う有効数字の考え方を数値の近似計算に適用したものと言えます.

 

精度のクライテリアを定める際、選定理由もよく考えないということのように思いました。実は前にあるシステムの要件定義において、必要かなという範囲まで計算値の桁数をしてしてしまったことを想い出しています。
そもそも精度って言葉が正しくわかっている自信がないんですよね...。

kikakurui.com

 

「この規格では,測定方法の精確さを表すために“真度”と“精度”の二つの用語を用いている。“真度”は,多数の測定結果の平均値と,真の値又は参照値との一致の程度を示すものである。“精度”は,測定結果の間の一致の程度を示すものである。」
深みにはまる前に今回はここまでで切り上げます。

 

次回はwhlie文と一緒によく使うif文を学びます。

knimest.hatenablog.com

【Python学習帳】022_内包表記と副作用

初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

第5章の制御構造の勉強中で、内包表記に関して教材を離れて少し調べていました。

knimest.hatenablog.com

良い点として内包表記の中で変数を使っても、いかなる副作用もなく処理できることが挙げられていました。
一方で、for文をつかったループ処理を行った際には、ループが終了した後にも存在する x と y という名前の変数を作る (または上書きする) ことに注意が必要なようです。

こちらを実際に体験してみることにしました。ChatGPTに「内包表記を使わないで書き換えて」もらいました。

上図だけではわかりにくいでしょうから何をしたかを書いてみます。
内包表記の前後ではx = 0のまま変化はないです。

 

a = [5, 1, 3, 4]          #リストaを定義

x = 0

a = [x for x in a if x%2 != 0]     #リストaの要素で奇数の要素のみを残す

 

print(a)     # [5, 1, 3]になった

print(x)     # 0のまま

 

で、上図のようにChatGPTにfor文を使って書き換えをしてもらいました。

そのコードを使ってループ処理後のxをprintすると、もともとは0だったのが、リストaの要素を抜き出すループ処理に変数xを使ってしまったので、もともとのリストaの最終要素だった4に変わっていますね。

今回のような簡単なコードならまだ気付けるとは思うんですが、何十行、何百行も前に使っていた変数名を気付かないでどこかで書き換えてしまってその後の処理がおかしくなるという副作用に果たして自分は気が付けるだろうかと怖くなりました。

さて、以下は全くの余談ですが、ChatGPT(以下C:)は初心者にとってのPythonの先生役になれますね。以下私(以下K:)とのやり取りを抜粋します。

 

K:
a = [5, 1, 3, 4] #リストaを定義
x = 0
a = [x for x in a if x%2 != 0] #リストaの要素で奇数の要素のみを残す
print(a)
を内包表記を使わないで書き換えてもらえませんか?

C:
はい、以下は内包表記を使わないで書き換えたコードです。

a = [5, 1, 3, 4]          #リストaを定義

new_a =

for x in a:

    if x % 2 != 0:

        new_a.append(x)

a = new_a

 

print(a)


このコードでは、空のリストnew_aを作成し、元のリストaの要素をループして処理します。要素が奇数の場合は、new_aに追加します。最後に、リストaをnew_aに置き換え、new_aを印刷します。

内包表記と同じような効果を持ちますが、より明示的で直感的な書き方です。

 

K:

おっしゃる通りとても明示的で直観的ですね。ありがとうございました。 では空のリストを作成しない方法はありますか?

 

C:

はい、以下はリストを作成せずに、元のリストを直接変更する方法です。

a = [5, 1, 3, 4]          #リストaを定義

i = 0

while i < len(a):

    if a[i] % 2 != 0:

        i += 1

    else:

        a.pop(i)

 

print(a)

このコードでは、whileループを使用してリストaを直接変更します。リストaの各要素について、要素が奇数であれば、インデックスを増やして次の要素に移動します。要素が偶数である場合は、リストから削除します。これにより、リストaの各要素がチェックされ、偶数の要素は削除されます。最後に、新しいリストaが印刷されます。

ただし、リストを直接変更する場合、副作用が発生する可能性があるため、注意が必要です。そのため、元のリストを変更しない方が好ましい場合があります。

 

K:

while文はまだ習っていないので、他の書き方があったら教えてください。

 

C;

そうでしたか、了解しました。while文を使用しないで、forループを使用して元のリストを直接変更する方法もあります。以下はその例です。

 

a = [5, 1, 3, 4]          #リストaを定義

to_remove =

for x in a:

    if x % 2 == 0:

        to_remove.append(x)

for x in to_remove:

    a.remove(x)

 

print(a)

 

このコードでは、まず、リストから削除する要素を一時的に保存するリストto_removeを作成します。to_removeリストには、偶数の要素だけが追加されます。次に、to_removeリストの各要素をループし、リストaから削除します。最後に、変更されたリストaを印刷します。

ただし、この方法でもリストを直接変更しているため、副作用が発生する可能性があるため、注意が必要です。リストを直接変更する代わりに、新しいリストを作成する方が望ましい場合があります。

 

K:

副作用にまで注意喚起していただきありがとうございました。 内包表記もwhileも空のlist作成もしない手法がもしあったら教えてください。 無ければその旨回答ください。


C:

もちろん、他にも方法があります。

例えば、filter関数を使う方法があります。以下はその例です。

 

a = [5, 1, 3, 4]          #リストaを定義

a = list(filter(lambda x: x % 2 != 0, a))

 

print(a)

このコードでは、filter関数を使用して、元のリストaから奇数の要素だけを抽出して、新しいリストとして再構築しています。lambda関数は、与えられた引数が偶数である場合にFalseを返し、奇数である場合にTrueを返します。filter関数は、与えられた条件がTrueである要素のみを含む新しいイテラブルオブジェクトを返します。

この方法でも、新しいリストを作成するため、リストの副作用が発生する心配はありません。

他にも方法があるかもしれませんが、今のところこれらの方法が思いつきます。


K:

lambda式も教えていただきありがとうございました。 まだほかにも思いつきますか?

 

C:

はい、まだいくつかの方法があります。例えば、以下のようにmap関数を使って、元のリストから偶数を除いた新しいリストを作成することができます。

a = [5, 1, 3, 4]          #リストaを定義

a = list(map(lambda x: x, filter(lambda x: x%2 != 0, a)))

 

print(a)

この方法では、まずfilter関数を使用して、元のリストaから奇数の要素だけを抽出します。そして、map関数を使って、抽出された奇数の要素を新しいリストとして再構築します。

また、以下のようにreduce関数を使って、元のリストから偶数を除いた新しいリストを作成することもできます。

from functools import reduce

 

a = [5, 1, 3, 4]          #リストaを定義

a = reduce(lambda x,y: x + [y] if y%2 != 0 else x, a, )

 

print(a)

この方法では、reduce関数を使用して、元のリストaから奇数の要素だけを抽出して新しいリストを再構築します。reduce関数は、イテラブルオブジェクトの要素を1つずつ取り出して、指定された関数を適用し、その結果を次の要素に適用していくことを繰り返します。

いずれの方法でも、新しいリストを作成するため、リストの副作用が発生する心配はありません。

 

K:

とても勉強になりました。初心者なのでlambda式は少し難しいと感じました。 出来ればfor文数行で書いてみていただけますか?

 

C:

a = [5, 1, 3, 4]

new_list =

for i in a:

    if i % 2 == 0:

        continue

    new_list.append(i)

print(new_list)

ここでは、continue文を使って偶数の場合は処理をスキップしています。そして、新しいリストnew_listに奇数の要素だけを追加しています。
この場合、forループとリスト操作を組み合わせることで、奇数要素を別のリストに格納し、元のリストをそのリストに置き換えるという方法をとっています。

 

K:

空のリストを用いない場合は内包表記かlambda式を必要とするという認識でよろしいでしょうか

 

C:

そうですね、リスト内包表記やlambda式は、リストを作成する際にコンパクトで簡潔なコードを書けるため、空のリストを使わなくてもよくなります。ただし、コードが簡潔であるがゆえに読みにくくなってしまう場合もありますので、適宜使い分けるとよいでしょう。

 

上記のやり取り、人間相手だったら私はここまでしつこく質問しかねますし、ChatGPTの解答が10秒以内ぐらいで返ってくるので手軽に次へ進めます。

ブレストや壁打ちの相手としてはいいのではないかというコメントを読んではいましたがこれは有用だと実感しました。まあ、世界中にテキストベースの情報があふれかえっているPython初心者のための情報を教えてもらったからだと思います。

 

ChatGPTが堂々と間違ったコードを教えてくれることもあって面白かったですが、私(K:)の質問が悪かったようで、その後のやり取りで目的を果たすことができました。使い手の方も成長しないとですね。

qiita.com

最後に復習です。

上記のChatGPTの生成したコード群で、副作用が生じないものはどれでしょうか?

次回はwhile文による制御を学びます。

knimest.hatenablog.com

【Python学習帳】021_内包表記

初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

第5章の制御構造の勉強中です。

knimest.hatenablog.com

今回は 内包表記 を学ぶのですが、教材では驚くほど簡潔な扱いでした。

5.2.9 for 文を使ったリストの内包表記

値が添え字の2乗のリスト

[0, 1, 4, 9, 16]

を作ることを考えます.上のように直接,明示的に書いても構いませんし

a = []

for i in range(5):

a.append(i*i)

と書いても構いません.このほか Python では for 文をリストの中に書く内包表記

と呼ばれる使い方があります.

a = [i*i for i in range(5)]

以上全文でした。

 

他の情報源を探ってみました。

tech.nkhn37.net

Pythonらしいシンプルで読みやすいコードの書き方を「Pythonic(パイソニック)」なコードと言いますが、内包表記も代表的なテクニックの一つかと思います。是非使い方を覚えてもらえるとよいかと思います。

内包表記は、内包表記を使用しない記載方法よりも内包表記を使用した方が処理速度が速いという特徴があります。そのため、積極的に内包表記を使用するように意識してもらうとよいでしょう。

 

ただし、注意点として条件が複雑な場合等には、必ずしも内包表記を採用するべきではありません。

 

チームでの開発をしている場合には、チームメンバーの他の人もソースを読むことになるため、読みやすく内容を理解しやすいように可読性を意識したコードを書くことが重要です。内包表記を使うことでコードが複雑になってしまう恐れがある場合には、内包表記を使用するべきかよく検討するようにしましょう。

上記は私にとってはなるほどと思う内容でしたので引用しています。しばしば他の方のコードの内包表記で何をしているのかわからなくて躓いたことがあり、今も苦手意識があります。

 

今回はリストについての内包表記の具体例が見たくて、下記の記事も読みました。

tech.nkhn37.net

https://tech.nkhn37.net/python-list-comprehension/

If文での条件設定も使えるので、1行でシンプルな記載ができますね。

Python チュートリアルも見てみました。

docs.python.org

https://docs.python.org/ja/3/tutorial/datastructures.html#list-comprehensions

どうでしょうか、簡潔で読みやすいと思いましたか?

もう一つ内包表記の良い点があるそうです。

それは内包表記の中で変数を使っても、いかなる副作用もなく処理できることです。
一方で、for文をつかったループ処理を行った際には、ループが終了した後にも存在する x と y という名前の変数を作る (または上書きする) ことに注意が必要なようです。

 

以下は参考までにプログラミングにおける副作用についてこちらの記事を紹介します。ウラキ少尉やランボーの例も秀逸。後半は初心者が読んでもわかる内容ではなかったですが。

python.ms

記事を読んで引用するばかりでなく使って慣れることが大事かなと思ったので、今後実際に使ってみたいと思います。

【Python学習帳】020_rangeなど使ったリスト操作

初学者を対象としている京都大学の無料Python教材の学習中です。

「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

前回から第5章の制御構造の勉強中です。

knimest.hatenablog.com

for 文と range() 関数を用いて繰り返しを自動化することを学びます.

正確には range は関数ではなく「クラス」として実装されているのですが,関数 のような使い方が主ですので,ここでは簡単のため range() 関数と呼びます. range() は一定間隔での数値の並びを生成してくれます.

今回は range を学ぶのですが、一度既に取り上げていました。

knimest.hatenablog.com

「関数」とメソッドは良く似ていますが,関数は特定のオブジェクトに紐づけられていないのに対し,メソッドは紐づけられたオブジェクトを主な操作の対象とします.
呼び出し方はほぼ同じです.

rangeの引数を1~3つ使うことで大きく分けて3通りの使い方があり、一番単純な下記の方法は既に体験済みです。

  • 終了値を与える.先に見たように

range(終了値)

といった使い方です.0 で始まり,終了値より手前の整数で終わります.

それ以外に、

  • 始値と終了値の2つを与える.

range(開始値, 終了値)

● 開始値と終了値とステップ幅の 3 つを与える.

range(開始値, 終了値, ステップ幅)

教材には演習もあり丁寧に学習できます。

さらに

5.2.7 for 文の入れ子

行と列のように2方向に広がる表の各要素の生成は for 文のブロック中にさらに

for 文を書くことで実現できます.

演習とは少しだけ内容を変えています。一部設定を変更して違いを見るのも勉強かと。

 

5.2.7 リストを操作する for 文

1) リストの長さと range 関数を組み合わせる方法

リストの要素を for 文で順に操作するには range(len(a)) で要素の番号を生成する

方法が一つ。要素の数と同じ回数だけ繰り返し処理されます。リストの要素をprintなどに利用したいときには、生成した番号を添え字にしてどの要素を扱うのか指定しています。

2) リストを for 文で直接使う方法

リストの何番目かを表示しなくても良くてリスト内の要素を順に表示するだけなら上記のようにできます。課題の5-11にもある通り、取り出した各要素が変数に代入されて繰り返し処理に利用できます。

 

注意点として、

この場合,d には要素の中身が与えられますので,d の値を変更してもリストの中身は変わりません.リストの要素を更新したいときには添え字でアクセスする方法を使います.

前に勉強した代入という操作に関しての補足かと思います。

knimest.hatenablog.com

上記のfor文ではリストaの各要素のidentityを変数dに入れているということでしょうか。d の値を変更しても新たな値のidentityが与えられるだけということかなと思います。この辺まだ分かった気になれないですけど、すごく大切そう。

3) enumerate 関数を使う方法

添え字と要素の値を共に使いたい場合は enumerate 関数を使います.

リストをenumerate関数で扱う例は下記にいくつか挙げられていました。

note.nkmk.me

Forの後に”i, d”と二つの変数が書かれて戸惑いましたが、enumerate関数はインデックス番号, 要素の順に各要素がタプルで返ってくるのですね。

atmarkit.itmedia.co.jp

タプルの( )が省略されていたのだと、下記の通り書き換えてみて何となく納得しました。

下記の記事まではまた後日でいいかな。2つ以上の配列をまとめて処理することは確かにしばしばありそう。

camp.trainocate.co.jp

少々理解がおぼつかなくなってきたので今回はここまでに。

 

次回は内包表記へ。正直ちょっと苦手意識があったりします。

knimest.hatenablog.com

【Python学習帳】019_制御構造

初学者を対象としている京都大学の無料Python教材の学習中です。
「プログラミング演習 Python 2021」
Version2021_10_08_01.pdf

hdl.handle.net

CC-BY-NC-NDライセンスに従って引用します。

前回で第4章を終えました。

knimest.hatenablog.com

今回は第5章。制御構造を学びます。

プログラムの実行を制御する以下の方法を学びます.

  1. for 文, while 文による繰り返し処理と range() 関数
  2. if 文による分岐
  3. try 文によるエラー処理

 

また,これに関連して以下も学びます

  1. 条件式の書き方
  2. input() 関数によるキーボードからの入力
  3. Python の数学関数
  4. 文字出力におけるフォーマット指定

今の段階で細かなことをすべて覚えるのではなく,「何ができるのか」を知ること と,実際に書いてみることを体験する,と割り切って学習してください.

と書いてあります。今回は深追いを避けて、次章以降で実際に使って理解を深めていくように考えられているようです。

5.2 for 文による繰り返し処理

プログラミングの目的の一つは人が手作業で行うことが難しいぐらいの作業を繰

り返すことの自動化です.for 文はこのような繰り返しをプログラミングする重要

な方法です.

ここでは,for 文と range() 関数を用いて繰り返しを自動化することを学びます.

ということで、

演習 5-1 平方根を求めるプログラムへの for 文の適用

プログラム 5-1 を作成し,実行してください.

平方根を求めるニュートン法については前に学びました。

knimest.hatenablog.com

教材にある通りにIDLE Editorを使ってp5-1.pyファイルを作成し、Run Moduleを実行した結果を示します。

Tipsとして紹介されていましたが、IDLEにおいて編集を楽にするショートカットキーとして

Ctrl キーを押しながら ] キーを押す(Ctrl-]と表記します)一括して字下げできます.

字下げってスぺースキーを4回押して入力してました…。

逆にCtrl キーを押しながら [ キーを押す(Ctrl-[と表記)と字下げと逆になりますね。

これは便利。

でもつい、テキストエディタでCtrl-]など実行してしまい何度か苦笑いしています。IDLE エディタでは使えるTipsということで。

 

さて、for文の働きなどは課題5-2などで学ぶのですが、ブロックというのが繰り返し実行の制御に重要です。

 

複数行のプログラムを一括して扱うブロックはプログラミングでの重要な考え方で す.

  • Python ではブロックを「同じ深さの字下げ」で表記します.これは Python の 特徴の一つです.

  • ブロックを要求する for などの文の行末はコロン(:)で終わります.
  • Python のプログラムでは字下げが重要な意味をもつため,空白 4 文字など統

一した記法が望まれます.

  • IDLE Editor では for 文などブロックを伴う行を入力すると続く行を自動的に

字下げしてくれます.

  • 字下げに全角の空白を入れてしまうとエラーになります.見た目に分かりにくい

ので注意してください.また TAB キーはエディタの設定にもよりますが,TAB

コードがそのまま入力される場合もエラーになります.

  • 他の言語では例えば C ではブロックは { } で囲みます.他の言語に慣れた人

は記法に注意が必要です

上記の記法、しっかり守らないといけないです。
課題でも扱っていますが、コロン(:)を間違えてセミコロンにしたり、そもそも忘れたりはありがちなミスです。

字下げすなわちインデントも上記の通り統一した記法を徹底しないと

教材の17章にある通り

unindent does not match outer indentation level

unexpected indent

などのエラーが出てまごつくことになりますね。

 

さて、

for 文内の処理を打ち切ったり,特定の繰り返しでは処理をスキップしたりするために break と continue という命令が用意されています.

● break: for 文の繰り返しから脱出します.
● continue: for 文の繰り返しのブロックの残りの部分をスキップして次の繰り返しに移ります.
これらは,後述の if 文での条件分岐と組み合わせて用いられます.

下記の通り体験し、演習ではその実行結果をソースコードを用いて説明しました。

今回はここまでとして、次回もfor文の学習が続きます。

knimest.hatenablog.com