数弱の文系大学生によるブログです。

Python、Webデザイン関連の記事を投稿していけたらなと思っています。

備忘録的なブログなので、読みにくい文章だと思います。ご了承ください。

Python3の復習(if文・while文・for文)

こんにちは。

就活に関して意識低めのかにたまごです。
そろそろ動き出さないとなーと思ってはいるんですが、就活に活かせる材料がないもんで・・・。
ボチボチ情報を集めていきたいと思います。


さて、今回は

  • if文
  • for文

について、復習していきたいと思います。


今までのPython3 復習履歴は以下の通り。

  1. 数値・文字列
  2. リスト・タプル
  3. 辞書・集合

if文

僕がプログラミングを始めてから今に至るまで、最もお世話になったと言える構文。
Unityでアプリ作ったときのコードは、ほぼif文で埋め尽くされてた・・・( ^ω^)
いわゆるスパゲッティコードの温床となることが多い構文。

if構文下の左端インデントは必ず揃っていなければならない。
推奨スタイル(4つのスペース)はPEP8
比較演算子や論理演算子を用いると複雑な条件分岐が実現可能。
比較演算子/論理演算子について

num = 9

if num % 3 == 0 and num % 5 == 0:
    print("FizzBuzz!!!")
elif num % 3 == 0:
    print("Fizz!")
elif num % 5 == 0:
    print("Buzz!")
else:
    print(num)

出力 -> Fizz!
  • True・Falseとは

下記の値は全てFalseとみなされる。

bool = False
null = None
int_zero = 0
float_zero = 0.0
string = ""
list = []
tuple = tuple()
dict = dict()
set = set()

#flase_val = bool
if false_val:
    print("True")
else:
    print("False")

出力 -> 全てFalse

それ以外の値は全てTrueとみなされる。

val = 10
if val:
    print("True")
else:
    print("False")

出力 -> True

while文

複数回の処理を行いたい場合に利用される構文。
永遠ループ怖いって印象。

  • インクリメントでループ中断

ループ変数は自分で定義する必要がある。

count = 1
while count <= 10:
    print("Loop ",count)
    count += 1

出力 -> 
Loop  1
Loop  2
Loop  3
Loop  4
Loop  5
Loop  6
Loop  7
Loop  8
Loop  9
Loop  10

インクリメント(count += 1)を忘れると永遠ループ・・・。

#永遠に10にならないから'Loop 1'が出力され続ける。
count = 1
while count <= 10:
    print("Loop ",count)

出力 -> 
Loop 1
Loop 1
Loop 1
Loop 1
Loop 1
Loop 1
(無限)
  • ある条件でループ中断

中断条件が不規則な場合は、永遠ループ中にbreak文を入れてループを止める。

while True:
    print("入力された文字を逆にします。")
    word = input("文字列を入力してください: ")
    if word == "q":
        break
    reversed_word = word[::-1]
    print(word+"を逆順にすると、"+reversed_word+"になります。\n")
入力 -> モブサイコ
出力 -> コイサブモ


continue文を使用すると、ある条件に当てはまる処理をスキップし、次のイテレーションに移行できる。

while True:
    print("入力された文字を逆にします。")
    word = input("文字列を入力してください: ")
    if word == "q":
        break
    reversed_word = word[::-1]
    if word == reversed_word:
        print("回文!!!\n")
        continue
    print(word+"を逆順にすると、"+reversed_word+"になります。\n")

入力1 -> たいにいきたい
出力1 -> いたきいにいた

入力2 -> みぎてばてぎみ
出力2 -> 回文!!!

ある条件を満たす値をbreak文でチェックしたいとき、その条件を満たさなかった場合の処理をelse節に記述できる。

exists = ["aiaipy", "pypyde", "thonpy", "oopython", "pythodn"]
not_exists = ["aiaipy", "pypyde", "thonpy", "ppap", "pythodn"]
idx = 0
while idx < len(exists):
    if "python" in exists[idx]:
        print("pythonを含む文字列を見つけました")
        print("該当文字列: ", exists[idx])
        break
    idx += 1
else:
    print("pythonを含む文字列はありませんでした。")

exists -> oopythonが引っかかる
not_exists -> else節が実行される

for文

while文と同じく、複数回の処理を行いたい場合に利用される構文。
while文と違い、ループ変数を定義する必要がない。
つまり、データ構造(サイズ等)を意識せずにループ処理をすることができる。


先ほどのコードは以下のように記述できる。

for word in exists:
    if "python" in word:
        print("pythonを含む文字列を見つけました")
        print("該当文字列: ", word)
        break
else:
    print("pythonを含む文字列はありませんでした。")

文字列、タプル、辞書、集合などもリストと同様にイテラブルオブジェクトなので、for文で処理することができる。

文字列:

string = "Python3 復習"
for s in string:
    print(s)

出力 -> 
P
y
t
h
o
n
3

復
習
#空白も一文字として処理される


タプル:

tuple = ("Python", "復習")
for t in tuple:
    print(t)

出力 -> 
Python
復習


辞書:

dict = {"名前": "かにたまご", "年齢": 22, "性別": "男", "職業": "大学生"}
#普通にfor文処理
for d in dict:
    print(d)

出力 -> 
名前
年齢
性別
職業

#明示的にキーを取り出す
keys = dict.keys()
#dict_keys(['名前', '年齢', '性別', '職業'])
for key in dict.keys():
    print(key)

出力 -> 
名前
年齢
性別
職業

#値のみを取り出す
for value in dict.values():
    print(value)

出力 ->
かにたまご
22
男
大学生

#キーと値を取得
for item in dict.items():
    print(item)

出力 ->
('名前', 'かにたまご')
('年齢', 22)
('性別', '男')
('職業', '大学生'#別々に取得したい場合
for key, value in dict.items():
    print("KEY: ", key)
    print("VALUE: ", value)
    print()

出力 ->
KEY:  名前
VALUE:  かにたまご

KEY:  年齢
VALUE:  22

KEY:  性別
VALUE:  男

KEY:  職業
VALUE:  大学生


集合:

set = set([1, 2, 3, 4, 4, 5, 3, 2])
#{1, 2, 3, 4, 5}
for s in set:
    print(s)

出力 ->
1
2
3
4
5
  • zip関数で複数のシーケンスを処理

zip関数で複数のシーケンスを並列的にループ処理することができる。

(無理くり作ったコード感ハンパない。)
nums = []
odd_even = []
squaring_nums = []
count = 1
while count <= 100:
    nums.append(count)
    if count % 2 == 0:
        odd_even.append("偶数")
    else:
        odd_even.append("奇数")
    squaring_nums.append(count**2)
    count += 1

for num, div, sq in zip(nums, odd_even, squaring_nums):
    print(num, "は", div)
    print("二乗すると、", sq)
    print()

出力 ->
1 は奇数
二乗すると、1

2 は偶数
二乗すると、4

3 は奇数
二乗すると、9
(100まで)

zip関数から返されるイテラブルオブジェクトをタプルや辞書に変換することが可能。

zippedObj1 = zip(nums, odd_even, squaring_nums)
#<zip object at 0x032DB530>

#対応する値同士がタプル化される
print(list(zippedObj1))

出力1 ->
[(1, '奇数', 1), (2, '偶数', 4), (3, '奇数', 9)...(100まで)]


zippedObj2 = zip(nums, squaring_nums)
#<zip object at 0x032DC738>

#2要素のシーケンスを辞書化
print(dict(zippedObj2))

出力2 ->
{1: 1, 2: 4, 3: 9...(100まで)}

このコード見たときに一瞬「中身どうなってるっけ・・・?」と思ってしまったので強調しておく。

  • range関数で数値シーケンスの作成

決まった範囲の処理をするならば、range関数で数値シーケンスを作成してループ処理をした方が手軽。

for num in range(1, 101):
    str_num = str(num)
    if len(str_num) == 2 and str_num[0] == str_num[1]:
        print(str_num+"はゾロ目です!")

出力 ->
11はゾロ目です!
22はゾロ目です!
33はゾロ目です!
44はゾロ目です!
55はゾロ目です!
66はゾロ目です!
77はゾロ目です!
88はゾロ目です!
99はゾロ目です!


第三引数にステップ数を指定できる。

for num in range(1, -100, -2):
    print(num)

出力 ->
1
-1
-3
-5
(-99まで)

zip関数と同様に、range関数もイテラブルオブジェクトを返すので、リスト等のシーケンスに変換することができる。

#リスト化
one_to_hundred = list(range(1, 101))
print(one_to_hundred)

出力1 ->
[1, 2, 3, 4, 5...(100まで)]


#タプル化
one_to_hundred = tuple(range(1, 101))
print(one_to_hundred)

出力2 ->
(1, 2, 3, 4, 5...(100まで))

今回のお試しコードはありきたりな感じだ。
なんにせよ、楽しみつつ色々と考えながらコードを書くことを心がけていこう。


以上です。