デカ文字Python

デカ文字&短文でPythonを簡潔にまとめたブログ

初めてのPython-whileループとForループ

 

VBAのDo Whileと違うから少し戸惑いました♨

 

 

whileループ

while <見出し行>: #←条件判定が行われる。TrueかFalseで判断される。
<statement1> #←ボディ部
else: #←statement1で一度もbreakが実行されなかったら実行される。
<statement2> #←elseブロックのボディ部
VBAをはじめ、通常の言語ではループstatementがelseを持つのは稀である。Pythonではループstatementがelseを持つことで、breakが実行されたか否かのフラグを態々つける必要がなくなっている。
prime_check_num = int(input("Please Enter Number Which You Want To Check 'Whether Prime Or Not':"))
factor_num = int(prime_check_num / 2)
while factor_num > 1:
if prime_check_num % factor_num == 0:
print(factor_num, "is", prime_check_num, "'s factor")
break
factor_num = factor_num - 1
else:#←これはifではなくwhileのelseブロック
print(prime_check_num, "is prime!!!")
>>>Please Enter Number Which You Want To Check 'Whether Prime Or Not':23
>>>23 is prime!!!
 これは便利だね(慣れるまで混乱しそうだけど)

forループ 

for <代入ターゲット> in <指定オブジェクト>: 
#オブジェクトのシーケンスが順々に代入
<statement1>
else:
<statement2>
指定オブジェクトはiterableなものでなければならない。
iterableが何かについてはここ参照。
指定オブジェクトのシーケンスが一つ一つ代入ターゲットに代入され、その代入ターゲット(変数)について<statement1>が実行される、というもの。
i_sum = ""
target_list = ["s", "p", "a", "m"]
for i in target_list:
i_sum += i
else:
print(i_sum)
>>>spam
 

 疑問:for内のボディ部分でオブジェクトに変更を加えたらどうなるのか?

word = "spam"
for character in word: #←当初オブジェクトwordのシーケンス数は4だった。
word = "spamham" #ボディ部でwordのシーケンス数は7に変更。
print(word) #何回printは実行される?=オブジェクトのシーケンス数は?
>>>spamham
spamham
spamham
spamham

 

ボディ部のprint(word)のwordはspamhamだけど、見出し部のオブジェクトはspam???

 

どうやら、forの見出し部のオブジェクトは、最初に呼ばれたときのリファレンスで固定らしいです。上の図では、word = "spam"のリファレンスが渡されているため、たとえボディ部で変数wordが"spamham"に上書きされても、見出し部wordは"spam"で固定なんだとか。

 

じゃあforの見出し部のオブジェクトがmutable(リストとか)で、ボディ部でそれを上書きした場合は?

というと、どうやら悪影響を及ぼすっぽいです。

【python】listをforループで回してremoveしたら思い通りにならない - 静かなる名辞

 

ちなみにwhileは見出し部の変数は上書き可能。

 

その仕様上当然だけどね(一応念のために)

 

num = 5
while num:
num = 1
print(num)
num = num - 1
>>>1

 

forループとfileオブジェクト

fileオブジェクトは各行を要素とするiterable(iterator)なため、forループの指定オブジェクトとして用いることができる。

f = open(r"C:\Users\pokio\Documents\Pyfile\test.txt", "w")
words = """あああ
いいい
ううう
えええ
おおお"""
f.write(words)
f.close()
f = open(r"C:\Users\pokio\Documents\Pyfile\test.txt", "r")
help(f)

>>>・・・・・・・・・・
| __next__(self, /)
| Implement next(self).
for line in f:
print(line, end="") #next(f)が戻すのは行
>>>あああ
いいい
ううう
えええ
for line in f.readline():
print(line, end="") #f.readline()=next(f),戻されるのは各行の文字
>>>あ




for line in f.readlines():
print(line, end="") #next(f.readlines())が戻すのはlistの各要素
>>>あああ
いいい
ううう
えええ
おおお

 

zip関数

主にforループの指定オブジェクトに使用される関数。

引数に渡したiterable同士をタプルにした、新たなiteratorを作る機能がある。

z = zip("spam", range(4))
for i in z:
print(i)
>>>('s', 0)
('p', 1)
('a', 2)
('m', 3)

 zip関数の便利どころは、アンパック代入x, y = "spam", "ham"がforループでも使えるというところにある。これを用いて辞書オブジェクトも作成できる。

z = zip("spam", range(4))
d = {}
for x, y in z:
d[x] = y

print(d)
>>>{'s': 0, 'p': 1, 'a': 2, 'm': 3}
#dict(z)でも同様の辞書オブジェクトが作成可能