乙Py先生のプログラミング教室
初学者のためのプログラミング学習サイト

プログラミング

                 25.while文

制御文の最後は while文です。

for文では繰り返しの回数が決まっていましたが
whileでは条件を満たすまで繰り返し続けます。

whileの書き方

while 条件 :
    処理

と書きます。

while True:


しかしこう書いてしまうと、繰り返しがずっと行われてしまい
いつまでたっても終わりません。

jupyter notebook上で止めたい場合は
上の四角ボタン(停止)を押して止めてください。

while文は条件を抜けるような処理を書いてあげないと
永久ループになってしまうので、注意が必要です。

while文の例:

In [1]:
sample_int =1 
while sample_int <= 10:
    print(sample_int)
    sample_int = sample_int  + 1
1
2
3
4
5
6
7
8
9
10

このようにして、変数などを条件に用いてwhile文の中で
変数を条件に合致しないように変更すると
whileの繰り返しを抜けることができます。

あらかじめカウント用の変数を用意したり、
フラグ値を用いたりすることでwhile文を抜けるのが
一般的な使い方になります。

for と同じように continueやbreakも使えます。

In [2]:
i=0
while i<5:
    if i ==2:
        i+=1
        continue
    print(i)
    i+=1
0
1
3
4
In [3]:
i=0
while i<5:
    if i ==2:
        break
    print(i)
    i+=1
0
1

continueは条件が満たされ続ける限りは
繰り返しが実行され続けるので注意

                 24.for文

プログラムの制御文は条件分岐と繰り返しで
今回は繰り返しをやっていきます。

お待たせしました、for文です。

pythonで処理を繰り返し行う場合は for を使っていきます。

forの使い方

for 任意の変数名 in イテラブルオブジェクト:
    処理

※イテラブルオブジェクトとは?

繰り返しができるオジェクト、
要は複数要素をもつオブジェクトの事

例えば
こう変数に文字を格納すると

In [1]:
aaaa = 'abcde12345'
print(aaaa)
abcde12345

これは文字列の「オブジェクト」になります。

オブジェクト指向では,「⁠データ」を「オブジェクト」として扱うので
データを格納した「⁠変数」もまた「オブジェクト」と同じものだと言えます。

ではイテラブルオブジェクトってなんでしょうか?
これは繰り返しができるという意味で、
複数要素をもつオブジェクトのことです。

要はリスト型や辞書型のようなデータ構造のオブジェクトとなります。
for文では文字列型でも繰り返しを行う事ができます。

簡単なfor文の例:

In [2]:
# 5回繰り返し処理を行う
for i in [1,2,3,4,5]:
    print(i)
1
2
3
4
5

これが一番シンプルな繰り返しです。
for 文の中の繰り返される処理の部分はインデントをしてください。

繰り返し行う回数というのが、「in」のあとに書いた
イテラブルオブジェクトの要素数だけ行われます。

for の後に書いた この「 i 」という変数は
繰り返しの中で使うことのできる変数になります。

それぞれ1回目はこのリストの1つ目がこの「 i 」に代入される
2回目は2つ目・・・
という仕組みになっているので、
このリストの要素数分だけ処理が実行されるという仕組みです。

リストは変数に代入しておいても同じように動きます。

In [3]:
# リスト型の変数に6つの要素を格納する
sample_list =[ 1,2,3,4,5,6]

# 6回繰り返し処理を行う
for i in sample_list:
    print(i)
1
2
3
4
5
6

回数を指定したい場合

range()関数で回数分の値を生成する。

range(整数値)
range(開始,終了)
range(開始,終了,間隔)

※range()関数は引数に指定した整数値の分だけ
数値を生成してくれます。
引数を追加すると開始、終了の数値、間隔を調整する事もできます。

In [4]:
# 10個の数値を持ったオブジェクトを生成
print(range(10))
range(0, 10)

ただしこれはリストではないので分かりづらいです。
リストに変換してみましょう。

In [5]:
print(list(range(10)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

これでリスト型になりわかりやすくなります。

range()関数では0から始まって引数分だけ整数値を生成しますが
注意点としては0から始まるので
終わりは指定した値にならないので注意してください。
指定した値 -1 になっています。

In [6]:
for i in range(3):
    print(i)
0
1
2

繰り返しは基本、なんらかのオブジェクトを用いてその要素数だけ実行するか
range()関数を使って指定した回数だけ実行するか、ということになります。

In [7]:
# 文字列型の文字数だけ実行する場合
for i in 'apple':
    print(i)
a
p
p
l
e
In [8]:
# range関数で4回だけ実行する場合
for i in range(4):
    print(i)
0
1
2
3

第一引数から始まって、第二引数まで、となります。
この場合は5から10 の1つ手前までの値を生成します。

In [9]:
# 5から9まで
for i in range(5,10):
    print(i)
5
6
7
8
9

第三引数は、どれだけ加算するかを決められます。

マイナスを指定すると、引いていくこともできます。

In [10]:
# 2から10手前までの偶数
for i in range(2,10,2):
    print(i)
2
4
6
8
In [11]:
# 20から10手前までの3個飛ばしで
for i in range(20,10,-3):
    print(i)
20
17
14
11

繰り返しの途中で抜ける場合

break を用いる

In [12]:
li = ['Alice', 'in', 'Chains']
for name in li:
    if name == 'in':
        print('!!BREAK!!')
        # ここで抜ける
        break
    # 2回目の処理は行われない
    print(name)
Alice
!!BREAK!!

この場合は繰り返しの2回目でif 文の条件に引っかかり、
その中のプリント文と break が実行されます。

そうなると途中で抜けた場合は、抜けた後以降の処理は行われません。
結果として2回目のプリントの前に抜けた、ということになります。

for 文でもelse が使用できます。

In [13]:
for i in  ['Alice', 'in', 'Chains']:
    print(i)
else:
    # for文の後に実行される
    print('処理終了')
Alice
in
Chains
処理終了

breakによって途中絵終了した場合には
elseの処理は実行されません。

In [14]:
li = ['Alice', 'in', 'Chains']
for name in li:
    if name == 'in':
        print('!!BREAK!!')
        break
    print(name)
else:
    # break後は実行されない
    print('!!FINISH!!')
Alice
!!BREAK!!

breakは完全に処理を抜けてしまいますが
処理の一部だけを飛ばして、まだ処理を続けたい時は
continue を使います。

In [15]:
li = ['Alice', 'in', 'Chains']
for name in li:
    if name == 'in':
        print('!!continue!!')
        # ここで処理を飛ばす
        continue
    # continue後は実行されない
    print(name)
else:
    # 最後に実行される
    print('!!FINISH!!')
Alice
!!continue!!
Chains
!!FINISH!!

for文はプログラムの中でも高頻度で使われるもので
プログラムでは必須です。

どう処理を組み立てれば良いかを考えながら
for文を用いていきます。

特に2回以上行うような複雑な処理を二回書くよりは
for文内で1回で済ませてしまう方が楽になるので
使い方なども研究してみてください。

                23.IF文

前回の講義まではpythonの基本的なデータ型や
演算子の使い方などをお伝えしてきました。

次は制御文のお話です。

pythonでは条件分岐や繰り返しなど、
プログラムを制御するための文法が存在します。

まずは条件分岐にあたるif文の使い方を学習していきましょう。

IF文の書き方

条件に合致した時に処理を分ける場合:

if 条件 :
    処理

条件に合致した場合とそれ以外の2分岐処理の場合

if 条件:
    処理
else:
    処理

複数条件に分岐する場合

if 条件:
    処理
elif 条件 :
    処理
    ・・・

まずはIF単独の場合

条件を書いてセミコロンを末尾に書きます。

In [1]:
# if文で条件に合致した場合printする
if 1<2:
    print('1より2の方がおっきい')
1より2の方がおっきい

その条件に合致した場合にだけ if 文の中の処理が実行できます。

なお注意として制御文を使う場合、処理を書くブロックは
インデントといって空白4つ分ずらしてあげないといけません。
また空白4つはタブボタンでも代用可能です。

In [2]:
if 1<2:
print('1より2の方がおっきい')
  File "<ipython-input-2-258e6cb91b61>", line 2
    print('1より2の方がおっきい')
        ^
IndentationError: expected an indented block

インデントを行わないとエラーになります。

In [3]:
# 条件はTrue or False
hh = 8
if hh== 8:
    print(hh)
8

if 文では条件は bool型、真偽値になるものを採用できます。

次に条件に合致しなかった場合は

if文のあとに else: と書いて

条件に合致しない場合の分岐処理も書くことができます。

In [4]:
hh = 7
if hh== 8:
    print('{}時だよ、全員集合'.format(hh))
else:
    # 条件に合致しなければこちらが実行される。
    print('{}時だよ、全員解散'.format(hh))
7時だよ、全員解散

条件が複数ある場合

elif : で条件を増やすことができます。

In [5]:
hh = 9
if hh== 8:
    print('{}時だよ、全員集合'.format(hh))
elif hh==9:
    # 条件に合致すれば実行される。
    print('{}時だよ、全員遅刻'.format(hh))
else:
    # 条件に合致しなければこちらが実行される。
    print('{}時だよ、全員解散'.format(hh))
9時だよ、全員遅刻

if文では条件が合致したところだけ実行されます。

条件を分岐させたい時にだけelse や elif を使えば良いです。

条件が複数にまたがる場合

ネストと言って、if文の階層を作ることができます。

その場合、if文の階層の分だけインデントを行います。

In [6]:
aa = 2
bb = 50
if aa == 2:
    if bb == 50:
        print('江頭{0}{1}分'.format(aa,bb))
    else:
            print('江頭{0}時'.format(aa))
else:
        print('江頭')
江頭2時50分

インデントの位置で処理が変わってしまうので注意。

ネストを使うことでどんな条件でも
書き分けることができるようになります。

ただし、あまりネストを使いすぎると
わけわからなくなってきます。みるのも大変です。

あまり深い階層になってしまった場合は
そもそもの処理や条件などを見直した方が良いと思います。

if文では何かしら処理を書かないとエラーになってしまいます。

In [7]:
if 1<2:
  File "<ipython-input-7-7e41fe00229c>", line 1
    if 1<2:
           ^
SyntaxError: unexpected EOF while parsing

特に処理を思いつかない場合はとりあえず passというのを書きます。

In [8]:
if 1<2:
    pass

pass は何もしない処理を現します。
制御文だけを書いて、処理を書かずに実行すると
エラーになるので回避のために使えます。

pythonではインデントで処理するブロックが変わってきます。

なのでif文の中の処理なのか、その前の処理になるのかで
全体の処理が大きく変わってくることがありますので
どういう処理をさせるのかを考えてインデントをしてください。

                 22.辞書型

リストと同じくpythonの中で最も使われるデータの形が
辞書型とよばれるデータ構造です。

辞書型は
キーと値をペアにして
複数の要素を管理することができます。

キーは整数だけではなく、文字で設定可能です。
値は様々な型を用いることができます。

また、リストとは違って、順番は特に関係ありません

辞書型は

{} 波カッコ

で定義できます。

キーと値を要素として格納できます。

{キー:値}

In [1]:
# キーが数値の辞書型の例

d1 = {1:10,2:20}
print(d1)
{1: 10, 2: 20}
In [2]:
# キーが文字列の辞書型の例

d2 = {'a':10,'b':20}
print(d2)
{'b': 20, 'a': 10}

登録した要素の参照するには

変数名[キー]

で値を返すことができます。

ただし、キーが無いとエラーになってしまいます。

In [3]:
# 5つの要素を登録
sample_dic_data = {'apple': 100, 'banana': 100, 'orange': 300, 'mango': 400, 'melon': 500}

# キーがmelonの要素を返す
print(sample_dic_data['melon'])
500
In [4]:
sample_dic_data = {'apple': 100, 'banana': 100, 'orange': 300, 'mango': 400, 'melon': 500}

# キーがgrapeの要素を返す
print(sample_dic_data['grape'])
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-4-ba326f7293a6> in <module>()
      2 
      3 # キーがgrapeの要素を返す
----> 4 print(sample_dic_data['grape'])

KeyError: 'grape'

要素の中にそのキーが無い場合はKeyErrorが発生する。

辞書型の機能としては
要素の追加、変更、削除もリストと同様にできます。

要素の追加

変数名[キー名] = 値

In [5]:
d3 = {1:2 , 3:4}
print(d3)

# 辞書の要素の追加
d3[5] = 8

print(d3)
{1: 2, 3: 4}
{1: 2, 3: 4, 5: 8}

同じキーを指定した場合は値を上書きして変更する。

In [6]:
d4 = {1:2 , 3:4}
print(d4)

# 辞書の要素の変更
d4[1] = 18

print(d4)
{1: 2, 3: 4}
{1: 18, 3: 4}

キーの検索

リストと同じように in を用いて

キー in 辞書名

とすると、キーが存在している場合はTrue
なければFalseが返ります。

In [7]:
d5 = {3:4 , 5:6 , 7:8}

# キー名で検索
print( 7 in d5)
print( 11 in d5)
True
False
In [8]:
mydict = {'pen':1 , 'pineapple':2 , 'apple':3}
print('apple' in mydict)
True

キーを文字列で設定した場合は探す時のキーも文字列で
整数値でキーを設定したら探す時も整数の値で探すことになるので
キーを検索する際のデータの形は注意しましょう。

辞書の削除

全ての要素の削除
辞書変数名.clear()

要素を指定して削除
del 辞書変数名[キー]

もしくは

辞書変数名.pop(キー)

del は値を返さ無いが
popは値を返す。

In [9]:
d6 = {'pen':1 , 'pineapple':2 , 'apple':3}
print(d6)

# キーで削除
del d6['pen']
print(d6)

# 要素の全削除
d6.clear()
print(d6)
{'apple': 3, 'pineapple': 2, 'pen': 1}
{'apple': 3, 'pineapple': 2}
{}
In [10]:
d7 = {'pen':1 , 'pineapple':2 , 'apple':3}
print(d7)

# pop関数でキーで削除
print(d7.pop('pen'))
print(d7)
{'apple': 3, 'pineapple': 2, 'pen': 1}
1
{'apple': 3, 'pineapple': 2}

popは消した値を用いて何かをする場合に使う。

In [11]:
d8 = {'pen':1 , 'pineapple':2 , 'apple':3}
print(d8)

# pop関数で存在しないキーで削除
print(d8.pop('penpen'))
{'apple': 3, 'pineapple': 2, 'pen': 1}
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-11-1964c019c260> in <module>()
      3 
      4 # pop関数で存在しないキーで削除
----> 5 print(d8.pop('penpen'))

KeyError: 'penpen'

値の参照と同じく、存在しないキーを削除するとエラーになる。

キーがない場合でも安全に消したい場合は
popに第二引数を追加します。

辞書変数名.pop(キー名 , 返す値)

In [12]:
d9 = {'pen':1 , 'pineapple':2 , 'apple':3}
print(d9)

# pop関数で存在しないキーで削除
print(d9.pop('penpen' , None))
{'apple': 3, 'pineapple': 2, 'pen': 1}
None

こうするとこのキーで要素があった場合はその値を
要素がなければ、第二引数の値を返すようにできます。

Noneを設定しておくと、何も起きないように見えるので
安全に消すことができます。

後の講義に出てくるIF文や検索の機能を使って
キーが有ったら、という工程を挟むことでも
うまく消すことができます。

この消した値を使って何かする場合は、少しだけ
テクニックが必要になるので注意しましょう。

全ての要素の参照

辞書型の要素は キー と 値 で構成されているので
次の3つの参照方法があります。
・辞書型変数.keys() : キーのリストを返す。
・辞書型変数.values() : 値のリストを返す。
・辞書型変数.items() : キーと値のリストを返す。

In [13]:
# 辞書を定義
mydict = {"pen":1, "pineapple":2, "apple":3}

# キーのリストを返す。
print(mydict.keys())

# 値のリストを返す。
print(mydict.values())

# キーと値のリストを返す。
print(mydict.items())
dict_keys(['apple', 'pineapple', 'pen'])
dict_values([3, 2, 1])
dict_items([('apple', 3), ('pineapple', 2), ('pen', 1)])

キーと値のリストを返す items() では
キーと値をタプル型にまとめたもののリスト
が返ってきています。

返ってきたリスト型の中身がタプル型の値になっているので
そこからキーと値を取り出す、ということをします。

この全てを参照する使い方については
繰り返しの「for文」のところで詳しくやっていきたいと思いますので
まずは 辞書型の取り扱い方を覚えましょう。

辞書はpythonのなかでも最もよく使うデータ型になると思いますので
繰り返し試してみるのが良いと思います。

                 21.タプル

リストと同じようなデータとしてタプル型というものがあります。

pythonでは

()
丸括弧

で定義することができます。

リストとの大きな違いは
値の追加や変更ができないという点です。

一度、変数を作ったら
その変数の中の要素を変更したり付け足したり
削除したりすることができないリスト だと思ってください。

なので、用途としては
変わることのないものを格納しておく、
というような使い方になります。

In [1]:
# 5つの要素をもったタプルを定義
a = (1,2,3,4,5)
print(a)
(1, 2, 3, 4, 5)
In [2]:
# 要素を持たないタプルも定義できるが意味がない
b=()
print(b)
()

要素の取り出しについてはリストと同じく
インデックスとスライス機能を使ったりすることができます。

In [3]:
# タプルの3番目の要素を取り出す
a = (1,2,3,4,5)
print(a[2])
3
In [4]:
# タプルの2-4番目の要素を取り出す
a = (1,2,3,4,5)
print(a[1:4])
(2, 3, 4)

要素の追加、削除、変更はできません。

In [5]:
# タプルの要素の追加
c = (1,3,5,7,9)

c.append(11)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-62fd258abb69> in <module>()
      2 c = (1,3,5,7,9)
      3 
----> 4 c.append(11)

AttributeError: 'tuple' object has no attribute 'append'
In [6]:
# タプルの削除
d = (1,3,5,7,9)

del d[2]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-6-fb54d548927f> in <module>()
      2 d = (1,3,5,7,9)
      3 
----> 4 del d[2]

TypeError: 'tuple' object doesn't support item deletion
In [7]:
# タプルの要素の変更
e =(2,3,4,5,6)
e[3]=13
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-56560fbbf80f> in <module>()
      1 # タプルの要素の変更
      2 e =(2,3,4,5,6)
----> 3 e[3]=13

TypeError: 'tuple' object does not support item assignment

タプルの要素に手を加えようとするとエラーが発生します。

ただし、タプルとタプルを組み合わせて要素の追加のようなことはできます。

In [8]:
t1 = (1,2,3,4,5)
t2 = (2,3,4,5,6)
t3 = t1 + t2
print(t3)
(1, 2, 3, 4, 5, 2, 3, 4, 5, 6)

このように
一度作ってしまえば要素は変わらないような使いみちであれば
間違って書き換える心配のないタプルが適しています。

タプルという形のデータもあるんだよ、ということを
押さえていただければと思います。

このページのトップヘ