ゆずまの○○日記がシンプルでいいと思います!

プログラミング、英語、将棋、健康を中心に書いていこうと思ってます。

04_if文の応用

  • 比較演算子
    • ==
    • !=
    • >
    • <
    • >=
    • \<=
    • in
  • 条件式は、True,Falseという2種類の値を返す。真偽値
  • 違うデータ型の比較を行うことはできない。
  • “100” > 200 のような比較を書いて、自動的に文字列を数値に変換してくれない。
    • int(“100”) > 200 のように、明示的に変換する必要がある
  • 論理演算
    • and
    • or
    • not
# coding: utf-8

# In[1]:

1+1 == 2 


# In[6]:

# 5の0乗 + 9 = 10
5**(4-4)+9 == 10


# In[7]:

5 > 2


# In[8]:

100 == 100.0


# In[9]:

"かなこ"  != "かなこぉ↑↑"


# In[10]:

[1, 2, 3] == [1, 2, 3]


# In[14]:

### 条件式に論理演算子を使った例
v = 30000
if v < 28400:
    print("地上に落下します")
if v > 28400 and v < 40300: #  
    print("月とお友達です")
if v > 40300 and v < 60100:
    print("惑星の仲間入りです")
if v == 60100:
    print("アルファケンタウリを目指せ")


# In[15]:




# In[ ]:



03_タプルを使う

  • タプルは、リストにとてもよく似た性質をもっている。
  • タプルは、要素を変更できないシーケンス
    • 複数の要素をもつことができる
    • インデックスを使って要素にアクセスできる。
    • 要素の変更ができない。
  • タプルの定義方法
    • (要素, 要素, …)
  • タプルから要素を取り出す
    • タプル名[インデックス]
  • タプルは要素を変更することができない
    • TypeError: ‘tuple’ object does not support item assignment が発生する
    • タプルは、要素を削除することができない。(変更されることになる)
  • タプル同士を連結することができる
  • タプルもリストと同じように、len(),in演算子,スライスを使える。
  • 要素が1つだけのタプルを定義するには、少しコツが必要。
    • 「(10,)」のように、要素の後にカンマを補う必要がある。
  • タプルの利点
    • ディクショナリのキーや、setの要素にすることができる。

補足

  • 2点間の距離の求め方
    • 緯度と経度の差を二乗して足す
# coding: utf-8

# In[1]:

### タプルの定義
month_names = ('January', 'February', 'March', 'April', 'May', 'June', 'July')

month_names


# In[2]:

### タプルから要素を取り出す
month_names[1]


# In[3]:

### タプルの要素を変更する
month_names[0] = '睦月'


# In[4]:

### タプル同士の連結 ###
month_names2 = month_names + ('August', 'September', 'October', 'November', 'December')

month_names2[11]


# In[5]:

### タプルをキーとしたディクショなりの作成
pref_capitals = {(43.06417, 141.34694):"北海道(札幌)",
                             (40.82444, 140.74): "青森県(青森市)",
                             (39.70361, 141.1525):"岩手県(盛岡市)"}
pref_capitals


# In[11]:

### 指定した緯度、経度に合致する県庁所在地を調べる
loc = (39.70361, 141.1525)
for key in pref_capitals:
    if loc == key:
        print(pref_capitals[key])
        break


# In[19]:

### 指定した緯度、経度に最も近い県庁所在地を調べる
# 調べたい地点の緯度、経度
loc = (41.768793, 140.72881)

# 最寄りの県庁所在地を保存する変数
nearest_cap = ''

# 最寄りの地点までの距離を保存する変数
nearest_dist = 10000

# keyでループする
for key in pref_capitals:
    dist = (loc[0]-key[0])**2+(loc[1]-key[1])**2
    print(key, pref_capitals[key])
    if nearest_dist > dist:
        # より近い地点が見つかったので、入れ替える。
        nearest_dist = dist
        nearest_cap = pref_capitals[key]

print(nearest_cap)


# In[22]:

aaa = (555,333,333)
aaa


# In[ ]:



02_set(集合)を使う

  • setは、集合を扱うために、Pythonに追加されました。
  • 複数の要素を持つデータの種類のこと
  • リストと同じように複数の要素を保存することができる。
  • リストと違い、中の要素が重複しないように管理される。
    • 存在する値を登録しようとしても、新しい要素が追加されない。
  • インデックスを使って、要素を取り出すことができない。
  • 和集合
    • 複数のsetを足したsetを作る
    • |演算子を使う
  • 差集合
    • あるsetに含まれる要素を他のsetから取り除く
    • -演算子を使う
  • 交わり
    • 共通する要素だけを抜き出す
    • &演算子を使う
  • 対象差 ( XOR のような操作)
    • あるsetと他のsetを合わせて、2つのsetが共通して持つ要素だけを取り除く
    • ^演算子を使う
  • 集合演算
    • 和集合、差集合、交わり、対象差を集合演算と呼ぶ。
  • setを定義する
    • {要素, 要素, 要素}
  • リストやディクショナリを要素として追加することはできない。
    • 変更できると重複した要素を持たないという性質を保てないため。
    • TypeError: unhashable type:“list"のようなエラーが発生する
  • setの集合演算では、ビット演算や、論理演算で使う演算子が利用されている。
  • setはfor文にシーケンスとして添えることができる。
  • リストからsetを作ることができる
    • 組み込み関数set()を使う。
  • リストと同じように、len(),max(),min(), sum()を使える
  • リストと同じように、in演算子を使って、要素の検索をすることができる。
  • if文の中で、<=を使うと、あるsetが他の部分集合かどうかを調べることができる。
    • A ⊆ B を Pythonでは、 A <= B とかける。
    • A ⊇ B を Pythonでは、 A >= B とかける。

集合の参考イメージ

http://suugaku-bukai.esnet.ed.jp/2008/study/2004/20040202.htm

# coding: utf-8

# In[3]:

# setの定義
dice = { 1,2, 3, 4, 5, 6 }
coin = {"表", "裏"}

print(dice)
print(coin)


# In[4]:

### 和集合を得る ###

# 素数のsetを定義する
prime = {2, 3, 5, 7, 13, 17}

# フィボナッチ数のsetを定義する
fib      = {1, 1, 2, 3, 5, 8, 13}

prime_fib = prime | fib
prime_fib


# In[5]:

### 差集合を得る ###
# サイコロの目のsetを定義
dice  = { 1, 2, 3, 4, 5, 6}

# 偶数のsetを定義する
even = { 2, 4, 6, 8, 10}

odd_dice = dice - even
odd_dice


# In[6]:

### setの交わりを得る ###
prefs      = {"北海道", "青森", "秋田", "岩手"}
capitals  = {"札幌"   , "青森", "秋田", "盛岡"}

pref_cap = prefs & capitals
pref_cap


# In[8]:

### setの交わりを得る ###
prefs      = {"北海道", "青森", "秋田", "岩手"}
capitals  = {"札幌"   , "青森", "秋田", "盛岡"}

pref_cap2 = prefs ^ capitals
pref_cap2


# In[10]:

### リストをsetに変換する ###
# リストを定義する
codon = ['ATG', 'GCC', 'TCC', 'AAG', 'TTC', 'TGG', 'GAC', 'TCC']
# リストをsetに変換する
s_codon = set(codon)

print(len(codon), len(s_codon))
print(s_codon)


# In[12]:

### 要素の検索とsetの比較 ###
prime = {2, 3, 5, 7, 13, 17}
fib      = {1, 1, 2, 3, 5, 8, 13}

prime_fib = prime & fib
print(prime_fib)

if 13 in prime_fib:
    print("13は素数で、フィボナッチ数でもある")
if {2, 3} <= prime_fib:
    print("2,3は素数で、フィボナッチ数でもある")


# In[ ]:



01_ディクショナリ(辞書)を使う

  • 要素にキーをつけて、複数のデータを管理する
    • {キー1:値1, キー2:値2 … }
    • キーには、文字列や数値が使える。
    • リストをキーとして登録することはできない。
    • キーに対応する値は、文字列や、数値、リスト、他のデータ型も使える。
  • キーを使って要素を取り出す。
    • ディクショナリの要素を取り出すには、キーを使う。
      • ディクショナリ名[要素のキー]
    • 存在しないキーを指定した場合、KeyError になる.
  • ディクショナリは、キーで要素を管理するデータ型
  • 順番という概念がない。
  • ディクショナリを表示するときには、文字コード順に並びます
    • キーが英数字ならアルファベット順に表示される。
  • キーを使って要素を入れ替える
    • purple[‘キャッチフレーズ’] = “鋼少女”
  • 新しいキーと値を追加する
  • ディクショナリの場合、要素を足すというよりは挿入するイメージ
  • キーを使って要素を削除する。
    • ディクショナリから要素を削除するには、del文を使う。リストの要素を削除するのと似ている。
  • キーの存在確認
  • キーを使ったループ
# coding: utf-8

# In[4]:

# ディクショナリを使う

# ディクショナリの定義
purple = { "ニックネーム"     : "れにちゃん",
           "出身地"           : "神奈川県",
           "キャッチフレーズ" : "感電少女"
         }



# In[3]:

# ディクショナリから値を取り出す
print(purple['出身地'])


# In[5]:

# ディクショナリ「purple」の内容を確認する
purple


# In[6]:

# キーを使って要素を入れ替える
purple['キャッチフレーズ'] = "鋼少女"
purple


# In[7]:

# 要素の追加
purple["生年月日"] = "1993年6月21日"
purple


# In[8]:

# 要素の削除
del purple['ニックネーム']
purple


# In[9]:

# 存在しないキーを指定した場合
purple["ニックネーム"]


# In[16]:

# in演算子を使った関数の定義

def convert_number(num):
    # アラビア数字とローマ数字の対応表をディクショナリに定義
    roman_nums = {1:"I", 2:"II", 3:"III", 4:"IV", 5:"V", 6:"VI", 7:"VII", 8:"VIII", 9:"IX"}
    
    #  ディクショナリのキーとして引数の整数が存在していたら
    #  キーに対応する値を戻り値にする
    if num in roman_nums:
        return roman_nums[num]
    else :
        return "[変換できません]"


for number in range(1,11) :
    print( convert_number(number) )




# In[17]:

purple = {"ニックネーム"     : "れにちゃん",
          "出身地"           : "神奈川県",
          "キャッチフレーズ" : "感電少女",
          "生年月日"         : "1993年6月21日"
         }

for key in purple:
    print(key, purple[key])


# In[ ]:



08_モジュールを使う

  • プログラムでよく使うデータ、関数などは、Pythonに内蔵されていていつでも使えるようになっています。
  • ここでいう組み込みとは、「Built in」
  • Pythonに付属しているモジュールの集合体のことを標準ライブラリと呼んでいる。
  • turtle → 標準ライブラリ
  • matplotlib → Anacondaのライブラリ
  • モジュールをインポートする
    • import モジュール名
  • as を使うと、別名で使うことができる。
    • import モジュール名 as 読み込む名前
  • from を使ったインポート
    • from というキーワオド組み合わせるとモジュールにある関数などを直接インポートできる。
    • モジュールの関数を直接インポートすると、実行時にモジュール名を書く必要がなくなる
    • アスタリスク(*)を使うと、モジュールの持っている関数などをまとめてインポートできる。(副作用が大きいのがデメリット)
  • モジュールの探し方
# coding: utf-8

# In[5]:

# モジュールを使う
import random

# 0 < x < 1 の乱数を得る
print(random.random())

# 0 < x <= 6 の乱数を得る
print(random.randint(0, 6))

a_list = [0, 1, 2, 3, 4, 5]

# リストをランダムに入れ替える
random.shuffle(a_list)
print(a_list)

# リストの要素を1つランダムに選ぶ
print(random.choice(a_list))


# In[6]:

#  fromを使ったimport文の気泡
from statistics import median

monk_fish_team  = [158, 157, 163, 157, 145]
volleyball_team = [143, 167, 170, 165]
print( median(monk_fish_team) )
print( median(volleyball_team) )


# In[ ]:



07 関数を使う

  • 関数とは入力に対して出力を返す仕組みのこと。
  • 関数を呼び出すとき
    • 関数名(引数1, 引数2 …)
  • abs
    • 絶対値を求める関数
  • 引数
    • 関数を呼び出すとき、丸カッコの中に数値や文字列のようなデータを入れます
    • 関数に幾つの引数を渡すかも、関数ごとに決まっています。
  • 戻り値
    • 関数が処理した結果、関数から出力するデータのことを言う
    • 関数の中には戻り値がない関数もある。print()
    • def文で定義した関数から戻り値を返すには、return文を使います。
  • 関数を定義するときは、def文を使います。
  • 関数名をつけるコツ
    • 英語の動詞 + 名詞(目的語)
  • ローカル変数
    • 関数の外で引数を使おうとするとエラーになる
    • 関数の外にでると、関数内世界は消えてしまいます。
    • 関数内世界が消えた後は、ローカル変数も一緒に消えて位使えなくなる。
# coding: utf-8

# In[1]:

the_list = [101, 123, 152, 123]

# 合計するための変数を作成しておく
summary = 0;

for item in the_list:
    summary = summary + item;

summary


# In[2]:

sum(the_list)


# In[3]:

abs(10)


# In[4]:

abs(-200)


# In[5]:

int("100")


# In[6]:

int("100", 2)


# In[7]:

# 文字列を16進数の数値に見立てて変換する
int("100", 16)


# In[16]:

# 引数のない関数を定義する
def destiny_tank():
    tanks = ["IV号戦車D型" , "III号戦車J型", "チャーチル MK.VII",
             "MAシャーマン", "P4O重戦車",    "T-34/76"]
    num = input("好きな数字を入力してください。")
    
    # 入力値をリストのインデックスに変換して、長さで割ったあまりを計算している。
    idx = int(num) % len(tanks)
    
    print("あなたの運命の戦車は?")
    print(tanks[idx])

    
destiny_tank();


# In[17]:

# 引数を持つ関数の定義
def destiny_tank2(num):
    tanks = ["IV号戦車D型" , "III号戦車J型", "チャーチル MK.VII",
             "MAシャーマン", "P4O重戦車",    "T-34/76"]
    
    # 入力値をリストのインデックスに変換して、長さで割ったあまりを計算している。
    idx = num % len(tanks)
    
    print("あなたの運命の戦車は?")
    print(tanks[idx])

num_str = input("好きな数字を入力してください:")
num = int(num_str)
destiny_tank2(num);


# In[20]:

from random import randint
num = randint(0, 10)
destiny_tank2(num)


# In[23]:

# 引数を持つ戻り値を返す関数の定義
def destiny_tank3(num):
    tanks = ["IV号戦車D型" , "III号戦車J型", "チャーチル MK.VII",
             "MAシャーマン", "P4O重戦車",    "T-34/76"]
    
    # 入力値をリストのインデックスに変換して、長さで割ったあまりを計算している。
    idx = num % len(tanks)
    
    return tanks[idx]

from random import randint
num  = randint(0, 10)
tank = destiny_tank3(num)
print("今日あなたが乗るべき幸運の戦車は、", tank ,"です")


# In[24]:

def test_func(arg1):
    inner_var = 100
    print(arg1 + inner_year)

test_func(10)

# 関数内で定義した変数はエラーになる
inner_year


# In[28]:

# ローカル変数おw関数の外で使う
monk_fish_team = [158, 157, 163, 157, 145]

total    = sum(monk_fish_team)
length   = len(monk_fish_team)
mean     = total / length
variance = 0

for height in monk_fish_team:
    variance += ( height-mean)**2

variance = variance / length

volleyball_team = [143, 167, 170, 165]

total2    = sum(volleyball_team)
length2   = len(volleyball_team)
mean2     = total2 / length2
variance2 = 0

for height in volleyball_team:
    variance2 += (height - mean2)**2

# 足した数値を要素数で割って分散を求める
variance2 = variance2 / length2

print(variance)
print(variance2)


# In[30]:

def calc_variance(a_list):
    total    = sum(a_list)
    length   = len(a_list)
    mean     = total / length
    variance = 0
    
    for height in a_list:
        variance += ( height-mean)**2
        
    variance = variance / length
    
    return variance

print ( calc_variance([158, 157, 163, 157, 145]) )
print ( calc_variance([143, 167, 170, 165]) )


# In[31]:

monk_fish_team  = [158, 157, 163, 157, 145]
volleyball_team = [143, 167, 170, 165]
pravda_team     = [127,172,140, 160, 174]

monk_fish_variance  = calc_variance(monk_fish_team)
volleyball_variance = calc_variance(volleyball_team) 
pravda_vairiance    = calc_variance(pravda_team)

print(monk_fish_variance**0.5)
print(volleyball_variance**0.5)
print(pravda_vairiance**0.5)


# In[ ]:


06_if文で条件分岐をする

条件に従って処理の内容を分けることを条件分岐と呼ぶ。 - 数値を比較する - 計算の結果を変数に入れて比較する - 関数が結果として返す数値を比較する - 文字列を比較する - == (等しい), != (異なる) - 文字列を検索する - 文字列の中に、特定の文字列が含まれている以下どうかを調べる in演算子 - リストも比較できる. - == , != , in - else文はある - switch文はない。elifで対応する。elseifの省略系。

他に気づいたところ。

# coding: utf-8

# In[1]:

if 2*2*2+2 == 10:
    print('2*2*2+2は10')
if 2+2*2+2 == 10:
    print('2+2*2+2は10')
if (2+2)*2+2 == 10:
    print("(2+2)*2+2は10")


# In[2]:

# 数値を比較する

if 1 == 1:
    print("1番目はTrue")
if 5^(4-4)+9 == 10:
    print("2番目はTrue")
if 2 < len([0, 1, 2]):
    print("3番目はTrue")
if sum([1, 2, 3, 4]) < 10:
    print("4番目はTrue")


# In[3]:

# 文字列を比較する
# == (等しい), != (異なる)

if "AUG" == "AUG" :
    print("1番目はTrue")
if "AUG" == "aug" :
    print("2番目はTrue")
if "あいう" == "あいう":
    print("3番目はTrue")


# In[4]:

# 特定の文字列が含まれているか in演算子

if "GAG" in "AUGACGGAGCUU" :
    print("1番目はTrue")
if "恋と戦いはあらゆることが正当化されるのよ" in "正当化" :
    print("2番目はTrue")
if "stumble" in "A horse may stumble though he has four legs" :
    print("3番目はTrue")


# In[5]:

# リストを比較する
if [1, 2, 3, 4] == [1, 2, 3, 4]:
    print("1番目はTrue")
if [1, 2, 3] == [2, 3] :
    print("2番目はTrue")
if [1, 2, 3] == [ '1', '2', '3']:
    print("3番目はTrue")


# In[6]:

# リスト内の要素を調べる~その1
if 2 in [2, 3, 5, 7, 11]:
    print("1番目はTrue")
if 21 in [13, 17, 19, 23, 29]:
    print("2番目はTrue")
if 'アッサム' in ['ダージリン', 'アッサム', 'オレンジペコ']:
    print("3番目はTrue")


# In[7]:

# リスト内の要素を調べる~その2
if 1 in [0, 1, 2, 3, 4]:
    print("1番目はTrue") 
if [1, 2] in [0, 1, 2, 3, 4]:
    print("2番目はTrue")
if [1, 2] in [0, 1, [1, 2], 3, 4]:

    print("3番目はTrue")


# In[8]:

# ^ は XOR で排他的論理和。優先順位は、 - と + よりも低い。

if 2^3-2+4 == 10:
    print("式1は10")
else :
    print("式1は10にならない")

if 2**3-2+4 == 10:
    print("式2は10")
else :
    print("式2は10にならない")


# In[13]:

2^3


# In[14]:

2^3-2


# In[15]:

2^1


# In[16]:

3-2+4


# In[17]:

2^5


# In[18]:

#  if - else をつかう。

a_year = 2080
if a_year >= 1993:
    if a_year == 1993:
        print(a_year, "年、れに誕生")
    else :
        print(a_year, "年、れに", a_year-1993, "歳")


# In[21]:

# if -elif をつかう

a_year = 2080
if a_year == 1993:
    print(a_year, "年、れに誕生")
elif a_year > 1993:
    print(a_year, "年、れに", a_year-1993, "歳")


# In[22]:

# 素数判定
a_num = 57;

for num in range(2, a_num):
    if a_num % num == 0:
        print (a_num, "は素数ではありません")
        break


# In[ ]: