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が他の部分集合かどうかを調べることができる。
集合の参考イメージ
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文を使う。リストの要素を削除するのと似ている。
- キーの存在確認
- in演算子を使う。
- キーを使ったループ
# 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[ ]: