LoginSignup
0
3

More than 3 years have passed since last update.

【データサイエンティスト入門】Pythonの基礎♬条件分岐とループ

Last updated at Posted at 2020-08-09

昨夜の続きです。
【注意】
「東京大学のデータサイエンティスト育成講座」を読んで、ちょっと疑問を持ったところや有用だと感じた部分をまとめて行こうと思う。
したがって、あらすじはまんまになると思うが内容は本書とは関係ないと思って読んでいただきたい。

Chapter1-2 Pythonの基礎

演算子と演算が参考にまとめられている。
【参考】
とほほのPython入門 - 演算子

1-2-4 条件分岐とループ

Pythonコードは、上から下に向けて実行される。その流れを変えて、条件分岐や繰り返しの処理をするための構文

1-2-4-1 比較演算子と真偽判定
print(1 == 1)
print(1 == 2)
print(1 != 2)
print(1 > 0)
print(1 > 2)
print((1 > 0) and (10 > 5))
print((1 < 0) or (10 > 5))
print(not (1 < 0))
print(not (1 < 0))
print(not (1 < 0) and (10 > 5))
print(not (1 < 0) and not (10 > 5))
print(5 >= 50 or 5 < 20 and 5 == 5)
print((5 >= 50 or 5 < 20) and 5 == 5)

結果

True
False
True
True
False
True
True
True
True
False
True
True

【参考】
図解!Pythonのif文でand、orによる複数条件の指定方法を徹底解説!
参考によれば以下のコードは「Falseです。」

x = 5
y = 5
if x >= 50 or x < 20 and y == 5:
   print("Trueです。")
else:
   print("Falseです。")

理由;andとorではandが優先される
とありますが、現在のPython3でのOperator precedenceは、orがandに優先し、Trueになります。
【参考】
6.17. Operator precedence
(一部引用)

Operator Description
:= Assignment expression
lambda Lambda expression
if – else Conditional expression
or Boolean OR
and Boolean AND
not x Boolean NOT
in, not in, is, is not, <, <=, >, >=, !=, == Comparisons, including membership tests and identity tests
^ Bitwise XOR
& Bitwise AND
... ...
1-2-4-2 if文

基本

if 条件式1:
    `条件式1がTrueのときに行う処理`
elif 条件式2:
    `条件式1がFalseで条件式2がTrueのときに行う処理`
elif 条件式3:
    `条件式1, 2がFalseで条件式3がTrueのときに行う処理`
...
else:
    `すべての条件式がFalseのときに行う処理` 
Pythonのif文の条件式において、偽Falseとみなされるのは以下のオブジェクト。
・bool型のFalse
・None
・数値(int型やfloat型)の0, 0.0
・空の文字列''
・空のコンテナ(リスト、タプル、辞書など)[], (), {}

これ以外はすべて真Trueとみなされる。

ここまでは、以下の参考より引用
【参考】
Pythonのif文による条件分岐の書き方

data_list = [1,2,3,4,5,6,7] 
findvalue = 8
if findvalue in data_list:
    print('{}は入っています'.format(findvalue))
else:
    print('{}は入っていません'.format(findvalue))
print('findvalueは{}でした'.format(findvalue))

結果
最後のprint行はif文の外で必ず表示される。

8は入っていません
findvalueは8でした
format記法

【参考】
【Python入門】format関数で文字列の書き方
参考を見つつ、面白そうな記法を試してみます。

apple  = 50
orange = 100
total = apple + orange

print('りんご:{0}円 みかん:{1}円 合計:{2}円'.format(apple, orange, total))
print('りんご:{}円 みかん:{}円 合計:{}円'.format(apple, orange, total))

list1 = [apple, orange]  #リストの作成
list2 = [total]
print('りんご:{0[0]}円 みかん:{0[1]}円 合計:{1[0]}円'.format(list1,list2))
print('りんご:{0[0]}円 みかん:{0[1]}円 合計:{1}円'.format(list1,list2[0]))
print('りんご:{}円 みかん:{}円 合計:{}円'.format(list1[0],list1[1],list2[0]))
りんご:50円 みかん:100円 合計:150円
りんご:50円 みかん:100円 合計:150円
りんご:50円 みかん:100円 合計:150円
みかん:100円 りんご:50円 合計:150円
りんご:50円 みかん:100円 合計:150円

浮動小数点の場合の記法はよく使うので、以下参照
【参考】
Pythonの文字列フォーマット(formatメソッドの使い方)

line = "{0}さんの身長は{1:.0f}cm、体重は{2:.1f}kgです。".format("山田", 190, 105.3)
print(line)
line = "{1}さんの身長は{2:^10,.5f}mm、体重は{3:.0f}kgです。".format("山田","山", 1900, 105.3)
print(line)

結果

山田さんの身長は190cm、体重は105.3kgです。
山さんの身長は1,900.00000mm、体重は105kgです。
{2:^10,.5f} 1,900.00000
2 index
: 書式開始
^ 出力位置
10 出力幅
, 千の所に,
.5 小数点以下5桁表示
f 浮動小数点数
1-2-4-3 for文

for文はよく使うのは以下の三種類(数値、list型, 辞書型)

1-2-4-4 数値

以下は普通に0~10まで回す。
演算は、足し合わせ。都度出力しています。
range(0,11,1);range(初期値,最終値+1,間隔)

s=0
for i in range(0,11,1):
    s += i
    print(s)

結果

0
1
3
6
10
15
21
28
36
45
55
list型
s=0
list1 = [0,1,2,3,4,5,6,7,8,9,10]    
for i in list1:
    s += i
    print(s)

結果

0
1
3
6
10
15
21
28
36
45
55
辞書型
dict_data = {'apple':100,'banana':100,'orange':300,'mango':400,'melon':500}
for dict_key in dict_data:
    print(dict_key,dict_data[dict_key])

結果

apple 100
banana 100
orange 300
mango 400
melon 500

辞書型から、dict_data.items()でkey, valueを取得して出力

dict_data = {'apple':100,'banana':100,'orange':300,'mango':400,'melon':500}
for key, value in dict_data.items():
    print(key,value)

結果

apple 100
banana 100
orange 300
mango 400
melon 500
1-2-4-5 内包表記
data_list = [1,2,3,4,5,6,7,8,9]
data_list1 = []
data_list1 = [i*2 for i in data_list]
print(data_list1)

結果

[2, 4, 6, 8, 10, 12, 14, 16, 18]

i%2==0(iを2で割った時の余りが0)の時だけ出力する

print([i*2 for i in data_list if i%2==0])
[4, 8, 12, 16]
1-2-4-6 zip関数

以下のように二つのリストがあるとき、それぞれから順番に要素を取り出せる。

list1 = ['apple','banana','orange','mango','melon']
list2 = [100, 100, 300, 400, 500]
for one, two in zip(list1, list2):
    print(one, two)

結果
因みに、要素数が不一致な場合は頭から少ない方に合わせて出力する。

apple 100
banana 100
orange 300
mango 400
melon 500
zip関数で二つのリストから辞書型データ作成
dict_new = {}
list1 = ['apple','banana','orange','mango','melon','pinapple']
list2 = [100, 100, 300, 400, 500]
for one, two in zip(list1, list2):
    dict_new.update({one: two})
print(dict_new)
print(type(dict_new))

結果

{'apple': 100, 'banana': 100, 'orange': 300, 'mango': 400, 'melon': 500}
<class 'dict'>
enumerate関数
list1 = ['apple','banana','orange','mango','melon','pinapple']
list2 = [100, 100, 300, 400, 500]
for i, name in enumerate(list1):
    print(i, name)

結果

0 apple
1 banana
2 orange
3 mango
4 melon
5 pinapple

開始のindex指定

for i, name in enumerate(list1, 3):
    print(i, name)

結果

3 apple
4 banana
5 orange
6 mango
7 melon
8 pinapple

list1とlist2をzipして、indexも付ける。

for i, name in enumerate(zip(list1, list2)):
    print(i, name)

結果

0 ('apple', 100)
1 ('banana', 100)
2 ('orange', 300)
3 ('mango', 400)
4 ('melon', 500)
1-2-4-7 while文を使った繰り返し処理
num = 0
s = 0
while num <= 10:
    s += num
    print(s)
    num += 1

結果

0
1
3
6
10
15
21
28
36
45
55
continueとbreak

以下のコードの結果は上記と同じですが、while 1:は常にTrueであり、処理の継続cotinueと処理の中断breakの役割を説明しています。

num = 0
s = 0
while 1:
    if num <= 10:
        s += num
        print(s)
        num += 1
        continue
    break

因みに、continueが無いと0で終わってしまうし、breakが無いと処理が終了しません。また、両方ない場合も処理が終了しません。

まとめ

・条件分岐とルール
・if文, for文, 内包表記, zip関数,enumerate関数, while文をまとめた

基本に立ち返って、並べてみると分かり易い。

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3