目次
ローカルのpython環境の作成
(https://prog-8.com/docs/python-env-win)
- 必要なもの
- Windowsが搭載されたPC
- テキストエディタ(vscode)
- pythonのインストール https://www.python.org/ 上のリンクからpythonをダウンロード !Pythonの開発環境を用意しよう!(Windows) _ プログラミングの入門なら基礎から学べるProgate[プロゲート] – Google Chrome 2023_08_05 20_31_54 (2).png Add Python ●.●● to PATHを必ずクリックしてから Install Now をクリックでインストール完了。 pythonが使えるようになっているか確認するときは、PCの画面左下などにある検索バーにコマンドプロンプトと入力しアプリが表示されたらダブルクリック。黒い画面が表示されたら
python --version
と入力しenterを押す。pythonのインストールが正常に完了していれば、Python 3.10.5のようにpythonのバージョンが表示される。 - pythonのコードを実行 デスクトップに「python_lesson」というフォルダを作成し、vscodeでこのフォルダを開く。その中に「script.py」というファイルを作る。
print('Hello, world!') print(1 + 2)
上のコードを貼り付けたら、コマンドプロンプトに移動し、下のコマンドで作成したフォルダまで移動する。cd Desktop\python_lesson
次に下のコマンドを入力python [script.py](http://script.py/)
するとターミナル上で「Hello, world!」と「3」が表示される。
Pythonの基本文法の理解
(https://qiita.com/AI_Academy/items/b97b2178b4d10abe0adb)
- PEP8(pythonのコーディング規約) https://pep8-ja.readthedocs.io/ja/latest/
- コメント 行頭に「#」を書くと行末までコメントとみなされる。
- 文字列 シングルクォーテーション「’」またはダブルクォーテーション(”)で囲む。どっちを使ってもいい。
print("Hello, Python")
- 数値 数値はクォーテーションで囲む必要がなく、もし囲むと文字列になってしまう。四則演算が出来る。
print(10) # 数値はクォーテーションで囲む必要はありません。 print(10 + 5) # 足している print(5 - 2) # 引いている print(10 / 2) # 割っている print(10 % 5) # あまりを求めている print(10*2) #かけている print((20 - 5) // 3) # 出力結果 # 10 # 15 # 3 # 5.0 # 0 # 20 # 5
Python2系であれば、例えば、10/2は5となるのに対して、3系では5.0となる(2系では切り捨てているのに対して、3系は切り捨てていないため)。 3系で、2系と同じように切り捨てたい場合は、print(10//2)とすると切り捨てられる。print(10 + 5) print('10 + 5')
↑下のクォーテーションで囲んだほうは、計算されずそのまま10+5が出力される。 - 変数 変数=値につける名札
lang = "Python" # 変数langに文字列Pythonを代入
変数の名前(lang)は自由に決めることができる。# Pythonで変数名をつける際に2単語続ける場合 lowercase_underscore = "lowercase_underscore" # 推奨 lowercaseunderscore = "lowercase_underscore" # 非推奨
- 便利!
print(15 + 1) print(15 - 2) print(15 * 3) print(15 / 4) print(15 % 5)
15を220に書き換える必要があるとき、もし変数xが定義されていたら、x=15をx=220に書き換えるだけで良い。x = 220 print(x + 1) print(x - 2) print(x * 3) print(x / 4) print(x % 5)
- 便利!
- 定数 値が変えられない値。すべて大文字で変数名を定義することが多い。 例)
# constants.pyというモジュール MAX_OVERFLOW = 100 TOTAL = 200 import constants print(constants.MAX_OVERFLOW) print(constants.TOTAL)
- 予約語 関数名や変数名に使用できない単語。 [‘False’, ‘None’, ‘True’, ‘and’, ‘as’, ‘assert’, ‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’, ‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’, ‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’, ‘try’, ‘while’, ‘with’, ‘yield’]
- データ型
- 数字(数値型)
- 整数(int) 1, 2, 3, 100, -5, -2000 などの「全体」の数字を指す。
- 少数・実数(float) 3.14, 0.001, -2.5 などの小数点を持つ数字。
- 複素数 実部と虚部からなる数で、虚部は
j
またはJ
で表される。 例:3+4j は、実部が3で、虚部が4の複素数を意味する。
- 文字列型 ダブルクォーテーションまたはシングルクォーテーションで囲うと文字列になる。 +と*の2つを利用することができ、+は文字列同士で使う場合、結合の意味になり複数の文字列を1つの文字列として表現できる。*を使うと文字列を反復することができる。
# 結合 a = "hello " # 結合後見やすくするために最後に半角スペースを入れています。 b = "world" print(a + b) # hello world
# 反復 a = "hello" print(a * 3) # hellohellohello
- 型変換(キャスト) データ型の異なる文字列型と数値型を連結した場合エラーになってしまう。
print("Hello" + "World") # +により文字列同士を連結 name = "Tom" print("My name is " + name) age = 24 print("My name is " + name + "My age is " + age) # この行はエラーになります
このエラーを回避するために数値型を文字列型に変換する。このようにデータ型を変えることを型変換またはキャストと呼ぶ。 数値型を文字列型に変換するには str() を使う。 文字列型を数値型に変更するには int() を使う。# 数値型→文字列型 name = "Tom" age = 24 print("My name is " + name + "My age is " + str(age))
# 文字列型→数値型 string_price = "1000" price = 500 total_price = int(string_price) + price print(total_price) # 1500
- リスト型 変数は1つのデータしか管理できないが、リスト型は複数のデータ(変数)を管理できる。 配列名 = [“x”,”y”,”z”] という形式で宣言する。リストの中身は左から数え初め、最初は1ではなく0から数える。 このリストの中身につけられた番号を添え字やインデックスなどと呼ぶ。
fruits = ["apple", "banana", "cherry"] print(fruits[0]) # "apple"を出力 print(fruits[1]) # "banana"を出力
numbers = [1, 2, 3, 4, 5] fruits = ["apple", "banana", "cherry", "date"] mixed = [1, "apple", 3.14, True] matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(numbers) print(fruits) print(mixed) print(matrix) # 出力結果 # [1, 2, 3, 4, 5] # ['apple', 'banana', 'cherry', 'date'] # [1, 'apple', 3.14, True] # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
また、append()を使うことで、listの末尾に要素を追加することができる。li = [] li.append("python") # リストの最後にpythonという文字列追加 print(li) # ['python'] li.append("php") print(li) # ['python', 'php']
list = ["a", "b", "c", "d"] # 0~3までのインデックスにデータが格納されている配列 print(list[2]) # "c" list[0] = "z" # インデックス0のデータを変更 print(list) # ["z", "b", "c", "d"]
- 辞書型 任意のキーを使って値にアクセスすることができる。
profile = {"name": "tani", "email": "[kazunori-t@cyberbra.in](mailto:kazunori-t@cyberbra.in)" } print(profile["name"]) # tani # 新しく要素を追加 profile["gender"] = "male" # 新しく要素を追加した辞書型(profile)を出力 print(profile) # {"name": "tani", "email": "[kazunori-t@cyberbra.in](mailto:kazunori-t@cyberbra.in)", 'gender': 'male'}
- 数字(数値型)
- 制御構造
- コードブロックとインデント pythonではインデント(字下げ)で処理をまとめる。基本的には半角スペース4つもしくはtabキーがインデントの役割になるが、pythonの文法では末尾にコロンがつく構文が多いため、末尾にコロンが出てきたらインデントをするというのが決まり。 ↓こんな感じ
for i in range(10): if i%2==0: print("{} is even.".format(i)) else: print("{} is odd.".format(i))
- 条件分岐(if文)
# 注) このコードは動作しないので注意です。 if 条件A: 条件AがTrueなら実行 elif 条件B: 条件AがFalseかつ条件BがTrueなら実行 else: 条件AもBもFalseなら実行
if文を用いると「もし○○ならば☓☓を行う」という処理を、条件分岐によって表現できるので、例えば、テストの点数がが78点以上であれば、合格と出力するプログラムは次のように記述できる。score = 80 if score > 78: # 比較演算子 > を使っています。 print("合格です")
- 条件式の作り方 条件式の中で、2つの値を比較するための記号「比較演算子」が良く使われる。
条件部分は「if 条件式 :」のように書く。行末のコロンを忘れるとエラーが出る!
score = 80 if score > 78: print("合格です。おめでとう!") else: print("不合格。次回頑張りましょう。") score = 100 if score == 100: print("満点") elif score > 85: print("合格!") else: print("不合格。次回頑張りましょう。")
- ループ
- for文
# for ループ内変数 in リスト名: # 実行する処理 for i in ["apple", "banana", "melon"]: print(i) # 出力結果 # apple # banana # melon
for文で一定回数の繰り返し処理を行うには range() 関数を用いることが多い。 range(x): 0からx-1までの連番のリストを返す range(x,y): xからy-1までの連番のリストを返すfor i in range(1,5): print(i) # 出力結果 # 1 # 2 # 3 # 4
ループの例data = [20, 40, 60, 88] for d in data: print(d) # 出力結果 # 20 # 40 # 60 # 88 # (1) sum_d = 0 for d in data: # *=で、かけあわせることもできます。 sum_d += d # sum_d = sum_d + dを省略した書き方です。 print(sum_d) # 出力結果 # 208 sum_d = 0 # (2) for d in data: sum_d += d # ループが終わったら1回処理したいものが処理できる。 else: print(sum_d) # 出力結果 # 208 # (1)と(2)はelseを使っているかどうかの違い
# cotinue 1回スキップ for i in range(6): if i == 3: continue print(i) # 出力結果 # 0 # 1 # 2 # 4 # 5 # break 処理を終了 for i in range(10): if i == 3: break print(i) # 出力結果 # 0 # 1 # 2 data = [1, 2, 3, 4, 5, "f"] for x in data: if x == 'f': print('found') break else: print('not found') # 出力結果 # found # dataの中にfがあるかを調べている。xがfのときforループから抜け出す。 # breakを使うと、elseの中の処理は実行されない # もし break がなかったら↓ data = [1, 2, 3, 4, 5, "f"] for x in data: if x == 'f': print('found') else: print('not found') # 出力結果 # found # not found # elseはforループが完全に実行された後に1回だけ実行されるので、fではないdataが5つあるけどnot foundは1回しか表示されない。
イテレータ(最初の要素から最後の要素までを順にアクセスする=オブジェクトの中の次の要素を取得する。forループに使われる仕組み。)for char in "hello": print(char) # 出力結果 # h # e # l # l # o for item in (1, 2, 3): print(item) # 出力結果 # 1 # 2 # 3
# リストの要素を順に処理しつつ、インデックス番号も知りたい場合 # enumerate()を使う! for index, name in enumerate(["apple", "banana", "melon"]): print(index, name) # 出力結果 # 0 apple # 1 banana # 2 melon
# list()とrange()を組み合わせて、1~100までの要素を持ったリストを簡潔に記述 print(list(range(101))) # 出力結果 # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
- 辞書型のデータをループ (https://note.nkmk.me/python-dict-keys-values-items/) 辞書をイテレーションすると、デフォルトではそのキーが順に取り出される。values()を使用すれば値を、items()を使用すればキーと値のペアを取り出すことができる。
data = {"tani": 21, "kazu": 22, "python": 100} for key, value in data.items(): print("key: {} value: {}".format(key, value)) # key: tani value: 21 # key: kazu value: 22 # key: python value: 100
- while文 while文は、特定条件を満たすまでループを繰り返す。
# nが10になるまで繰り返し n = 0 while n < 10: print(n) n += 1 # +1するのを忘れずに。 # 出力結果 # 0 # 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9
n += 1もしくは、n = n + 1を記述しない場合、無限ループになってしまう。 - 無限ループ
# 下記プログラムを実行する場合は、Ctrl + cで終了してください。 # もしくはターミナル/コマンドプロンプトを強制的に終了してください。 while True: print("無限ループ")
- リスト内包表記 既存のリストやジェネレータから新しいリストを作る。既存のリストから取り出した要素に対し処理をするだけでなく、条件に応じた場合にだけ新しいリストに追加したい場合にも使える。
# 1から10までの数値をそれぞれ2乗した数値のリストを作る result = [x**2 for x in range(1,11)] print(result) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] # 通常のループでは次のようになります。 result = [] for i in range(1,11): result.append(i**2) print(result) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
- その他内包表記 リスト内包表記以外にも、セットと辞書を生成する内包表記もある。※セットと辞書内包表記の場合、生成する値によっては出力される値の順番が保持されない場合もある。 辞書内包表記の書き方は、キーと値をコロン「:」で区切り、 セット内包表記と同様に{}を使う。
# d×2 : dの2乗 d = {x*2:x**2 for x in range(1,11)} print(d) # {2: 1, 4: 4, 6: 9, 8: 16, 10: 25, 12: 36, 14: 49, 16: 64, 18: 81, 20: 100}
tuple内包表記はセット型、辞書型とは違いgeneratorが返ってきて、list()でキャストすると内包表記を実現できる。 ※generatorという言葉の意味は今のところは理解しなくて大丈夫 tupleにする際には、tuple()でキャストする必要がある。t = (x for x in range(5)) print(t) # <generator object <genexpr> at 0x1095c8eb8> t = tuple([x for x in range(5)]) print(t) # (0, 1, 2, 3, 4)
- 標準入力 input()を用いることで、ユーザからの入力を受け取ることが可能。
print("名前を入力してください") name = input() print("あなたの名前は"+name+"です")
ただし、input()を使って受け取った値は文字列型になってしまうので注意。 ↓無限にユーザが入力した内容を出力するプログラム# Ctr-Cで終了します。 while True: print("Please Input!") i = input() print(i)
- for文
- コードブロックとインデント pythonではインデント(字下げ)で処理をまとめる。基本的には半角スペース4つもしくはtabキーがインデントの役割になるが、pythonの文法では末尾にコロンがつく構文が多いため、末尾にコロンが出てきたらインデントをするというのが決まり。 ↓こんな感じ
- 関数 関数:特定のデータを入力として受け取り、あらかじめ決められた処理を行い、その結果を出力するツール。 独自関数:ユーザーが自分で作成する関数で、任意の名前と処理内容を設定できる。 標準関数:Pythonが提供している既存の関数。print()、input()など。
- 関数の定義 関数を定義するためには、defというキーワードを使う。
def 関数名(): # インデント(字下げ)をしっかりするように! # 処理 # hello関数の定義 def hello(): print("hello!") # 関数の呼び出し(実行) hello() # hello! が出力される
- pass 関数は、空のリスト型や空の辞書型を定義するときのように、中身の処理のない関数を定義することができる。 とりあえず関数を宣言しておいて、関数の処理としては何もしない時は、passを使う。
# 何も処理のないtest関数を定義 def test(): pass
- 引数 関数を呼び出す際に関数に与える値のこと。 関数はあらかじめ定義された手順に従って特定の処理を行うが、この手順を少し変更して柔軟に使いたいときに引数を使う。 引数は大きく2種類に分けることができる。 1) 仮引数:関数を定義するときに使用される変数。この変数が、関数の中でどのように使われるかを示す。 2) 実引数:関数を呼び出すときに実際に渡す値。この値は、関数の内部で仮引数として使用される。
def say_hello(name): # ここでの'name'は仮引数 print("こんにちは" + str(name) + "さん") say_hello("山田") # ここでの"山田"は実引数 # 出力結果 # こんにちは山田さん
- 返り値(戻り値)/ return 関数で処理されたデータを呼び出し元に返す。
- 引数とreturn(返り値 / 戻り値) 戻り値を省略した場合は、Noneが返り値(戻り値)となり、また関数内で戻り値がないreturnが実行された場合も、戻り値はNoneになる。
# def 関数名(引数): # 処理 # return 返り値 def adder(a, b): return a+b # 関数内部の処理を変数に保持しておきたい時にreturnは便利 value = adder(5,10) # 変数valueに15が代入される # 先ほどのlen()を用いて返り値(戻り値)に関して説明します。 # 変数dataは、1〜5の5つの要素を持ったリストです。 data = [1,2,3,4,5] # 関数len()を実行することで、リストであるdataの要素5が返り値になります。 # その返り値5が変数valueに代入されます。 value = len(data) print(value) # 5
まず変数dataに[1,2,3,4,5]が代入され、リストとして定義される。次にlen()関数によってリストであるdataの要素の数を取得する。その取得した結果がreturnによって返されており、この返された値が返り値になる。その後、返り値5が変数valueに代入されている。
- なぜprint()ではなくreturnを使うのか?
- returnは値を返すことが目的
- print()は値を出力すること目的
# returnの良さが伝わりにくくメリットが感じられない例 def adder1(a, b): print(a+b) def adder2(a, b): return a + b adder1(2, 4) sum = adder2(2, 4) print(sum)
# returnの使い方として正しいプログラム def a(a,b): return a + b def b(a,b): return a * b x = a(2,2) # xに4が代入 y = b(x, x) # 4 * 4 print(y) # 16が出力される
- returnを利用した関数のサンプル
def power(x): return x*x def absolute(x): if (x < 0): return -x else: return x print(power(10)) # 100 print(absolute(-10)) # 10
- 引数のデフォルト値 関数では引数を指定しなかった場合に引数を設定できる。
def func(a, b=5): print(a) # aは必須の引数で、関数を呼び出す際に指定しなければならない print(b) # bはデフォルトの値が5に設定されている引数で、もし関数を呼び出す際にこの引数を指定しなければ5が使用される。 func(10,15) # aに10、bに15を渡しているため、10と15が出力される func(3) # aに3を渡しているがbは何も指定していないため、3と5が出力される
この関数は整数値の引数を2つ与えることで、その2つを出力するだけの関数だが、もし引数を1つしか渡さなかった場合は、2つ目の値はデフォルト値bが5となっているために、5が出力される。 下記のプログラムを実行すると、[‘python’, ‘Python’]が最後の関数呼び出しで出力される。def sample(arg, arg_list=[]): arg_list.append(arg) # argの値をarg_listに追加 print(arg_list) # arg_listの現在の内容を出力 sample('python') # ['python'] sample('Python') # ['python','Python']
この関数を実行する際に、毎回引数に渡した要素だけを返すようにするには下のように修正する。def sample(arg): arg_list = [] # リストの初期化 arg_list.append(arg) print(arg_list) sample('python') # ['python'] sample('Python') # ['Python']
上記は毎回リストを初期化していて、その後に引数で渡されたargを初期化した空のリストにappendしている。 - 関数 変数のスコープ 変数はどこで作成したかによってスコープ(有効範囲)が違う。
- 関数内部(ローカルスコープ) 関数の中で定義された範囲。関数内部で宣言された変数はローカル変数として知られ、その関数の実行中だけ存在する。関数の実行が終了するとローカル変数はメモリから解放されアクセスできなくなる。
- 関数外部(グローバルスコープ) 関数の外部で定義された変数は、グローバル変数として知られる。これはプログラム全体からアクセス可能な変数であり、プログラムが実行されている間ずっと存在する。
global_var = "I am global" # これはグローバル変数です。 def my_function(): local_var = "I am local" # これはローカル変数です。 print(global_var) # グローバル変数にアクセスできます。 print(local_var) my_function() # print(local_var) # これはエラーを引き起こします。ローカル変数は関数の外からアクセスできません。
# 通常の関数の例 def add(x1): # 関数の外部から値を受け取るための引数 x2 = 10 # 関数内で変数を作成(ローカル変数) result = x1 + x2 print(result) add(5) # 5 + 10で15が出力
# 変数のスコープ(有効範囲)に関するプログラム def add(x1): x2 = 10 result = x1 + x2 print(result) add(5) # 5 + 10で15が出力 print(x2) # ここでエラーが発生
これは関数内で定義した変数x2はローカル変数であり、ローカル変数か関数内部だけしか有効ではないため、関数の外側でx2を呼び出すとエラーになってしまう。 有効な解決手段は関数の外にx2を定義すること↓def add(x1,x2): result = x1 + x2 return result x1 = 5 x2 = 10 result = add(x1, x2) # 5 + 10で15が出力 print(result)
- グローバル宣言・グローバル変数
glb = 0 def func1(): glb = 1 def func2(): global glb glb = 5 print(glb) # 0が出力される func1() print(glb) # 0が出力される func2() print(glb) # 5が出力される
グローバル変数とローカル変数をそれぞれ宣言var1 = 'グローバル変数’ def sample(): var2 = 'ローカル変数' return (var1, var2) print(sample())
関数内からグローバル変数を変更するプログラムvar1 = 'グローバル’ def sample(): global var1var1 = 'ローカルに変更されました'sample() # グローバル変数var1を関数内部で変更 print(var1) # ローカルに変更されました
- 関数の定義 関数を定義するためには、defというキーワードを使う。
- おみくじアプリを作る
- ライブラリ ある程度まとまった汎用性の高い処理(関数・クラス・その他)を他のプログラムから読み込むことで、使うことが出来るようにしたファイルで、Pythonでは基本的にライブラリという表記があったらモジュールのことだと思えば良い。
- モジュール Pythonのコードをまとめたファイルであり、他のプログラムから再利用できるようにしたファイルのこと。
- パッケージ init.pyと複数のモジュールがディレクトリに集まったもの。
- モジュールのインポート import 読み込みたいモジュール のように使う。 読み込みたいモジュールの部分はほかのPythonのファイルのファイル名から拡張子の.pyを取り除いたもの。 例:sysモジュール(Pythonをインストールした段階で利用できるモジュールの1つ。標準モジュールと呼ぶ。)を読み込みたいとき
import sys
複数のモジュールをインポートする場合は , でモジュール名を区切ってインポートする。import sys, os
例えばmathモジュールのcos関数を利用したい場合はモジュール名.関数名(引数)で利用できる。import math math.cos(1) # 0.5403023058681398
- 独自で作成したモジュールをインポート ここでは運勢プログラム(占いモジュール)を作る! まずファイル名「main.py」のmainプログラムを作成。
import fortune result = fortune.get_fortune() print("今日の運勢は... ", result)
次にfortuneモジュールを作る。 下記プログラムをfortune.pyというファイル名でmainプログラムと同じ場所に保存。def get_fortune(): import random # randamではなく、randomなので注意です results = ['大吉', '吉', '小吉', '凶', '大凶', '末吉'] return random.choice(results)
main.pyを実行すると今日の運勢が実行される。 実行するたびに出力結果が変われば問題なく動作している。 - fromとimport from ファイル名(モジュール名) import *でファイル名の指定なしに呼び出しが可能になる。=インポートした後にその変数や関数、クラスを使うときにモジュール名やファイル名を先頭につける必要がない。
# 通常のインポート import my_module my_module.my_function()
# from ... import ...を使用した場合 from my_module import my_function my_function()
# from ... import *を使用した場合 from my_module import * my_function()
モジュールの関数などを利用する際に、モジュール名.の記述を省略して関数名だけで使用したい場合は以下のようにする。from モジュール名 import 関数名, 関数名, …
上記の構文を元に次のようにプログラムを書くことが出来る。from math import cos, sin, tan cos(1)
さっきfortune.pyでrandom.choice(results)と記述したが、fortune.pyはfromを使い以下のように書き換えることができる。def get_fortune(): from random import choice results = ['大吉', '吉', '小吉', '凶', '大凶', '末吉'] return choice(results)
名前を指定せずにモジュール内のすべてのメンバ(関数、定数、クラスなどのこと)をインポートする場合は、以下のように指定する。# from モジュール名 import * from math import * cos(1) sin(1)
fortune.pyでrandomをサンプルでimportしているのは関数内だが、関数外でもインポートできる。from random import * def get_fortune(): results = ['大吉', '吉', '小吉', '凶', '大凶', '末吉'] return choice(results) print(get_fortune()) sin(1)
- 別名でのモジュールインポート
# main.py import fortune result = fortune.get_fortune() print("今日の運勢は... ", result)
import fortuneと記述していたが、asを用いることで別名をつけることができる(エイリアスを設定する)。# 別名をつけた import fortune as ft result = ft.get_fortune() print("今日の運勢は... ", result)
別名をつけたことでft.get_fortune()と呼び出すことが出来るようになった。 別名を付けると便利な場面- 名前の衝突を避ける あるモジュール名や関数名が、現在の名前空間内で既に存在する名前と衝突する場合に、別名をつけることでその衝突を避けることができる。
- 名前が長すぎる場合 モジュール名やライブラリ名が長いとき、都度その長い名前を書くのは煩雑ため、別名を設定することでコードの簡潔性を保つことができる。
- 標準的なエイリアス matplotlib.pyplot as pltやnumpy as npなどは良く使われる例で、これを採用することによって他のPython開発者がコードを見た際に、簡単に理解することができる。
- 複数の似たモジュールを使用する場合 似たような機能を持つ異なるモジュールやバージョンを同時に使用したい場合に、それぞれに別名をつけることで区別が容易になる。
- 必要なものだけをインポートする *で全てインポートしましたが、必要な部品だけもインポートできる。
from fortune import get_fortune result = get_fortune() print("今日の運勢は... ", result)
別名をつけ、かつget_fortuneだけインポートすることもできる。from fortune import get_fortune as gf result = gf() print("今日の運勢は... ", result)
- ライブラリ・モジュールの場所を調べる ライブラリの場所は、モジュールの file アトリビュートか path アトリビュートで調べることができる。
import os print( os.**file** ) # /Users/aiacademy/anaconda3/lib/python3.6/os.py
- はじめに Pythonはオブジェクト指向言語と呼ばれている。ここからはオブジェクト指向言語の理解には欠かせない「クラス」の基本を説明する。オブジェクト指向は理解がしにくいものなので、ここでは、こういうものなんだな程度の理解で大丈夫!
- 重要な用語 Pythonに限らずオブジェクト指向言語(Javaなど)にすべて待ち合わせている10つの重要な用語が登場する。 1.オブジェクト指向 2.クラス 3.オブジェクト 4.コンストラクタ 5.インスタンス 6.メソッド 7.継承 8.多重継承 9.オーバーライド 10.親クラスと子クラス
- オブジェクト指向 プログラミングのスタイル・手法のことで、プログラミングパラダイムと呼ばれる1つ。 プログラミングパラダイムには、オブジェクト指向プログラミング以外にも、関数型プログラミング、手続き型プログラミングがある。 手続き型プログラミングでは、連続した手続きを記述し、上から下へと流れ、変数などの状態が変化しながらコードを書いていく。
# 例 a = 10 b = 20 y = a + b print(y) # 20
しかし手続き型プログラミングはすべてのコードがグローバル変数なため、ある関数でグローバル変数を変更し別で書いた関数でそのグローバル変数を上書きするなど、プログラムが多くなるにつれ様々な問題が出てくる。こうすると次第にプログラムを管理することが困難になってくる。 その問題を解決するきっかけにオブジェクト指向プログラミングが登場する。 オブジェクト指向は上記の問題を解決するだけでなく、開発の効率や保守性を上げることができる。 オブジェクト指向を活用可能なプログラミング言語は、PythonやJava、C++といった言語が挙げられる。 - クラス クラスとはデータ構造を作る仕組みで、クラスを使うと新しいデータ型を作ることができる。 よくクラスは、オブジェクトを作る設計書と説明される。
インスタンス化というのはクラスからインスタンス(オブジェクト)を作ること。 早速クラスを作る!
# クラスを作るとき,クラス名はCamelCase(キャメルケース)「単語の頭文字を大文字にして接続する書式」で作るようにしてください。 # また、関数やこの章で登場するメソッドの場合は、スネークケース(小文字の単語同士をアンダースコアで繋ぐ形式)を使います。 # (余談ですが、小文字のみでアンダースコアなしのことをlowerケースと呼びます。) # Sampleクラスを作ります。(保存するファイル名は任意の名前で可能です。) class SampleClass: # クラス内ではスペースを4つ開けてインデントしてください。クラスの中には変数やメソッド(クラスの中にある関数をメソッド)を定義できます。 '''sample class ''' sample = SampleClass() # インスタンスクラスを使うには、関数の呼び出しのようにクラス名()することでインスタンス化します。こうすることでクラスを使うことができます。sampleにSampleClassのインスタンスが格納されました。クラスからつくられたこのデータをインスタンスと呼びます。 sample.name = "A" sample2 = SampleClass() # このSample型から、いくつでもデータを作ることができるのでsample2を作りましょう。 sample2.name = "B" # sample2に対してさまざなな属性を作ることができる。 print(sample.name) # sampleの名前はA print(sample2.name) # sample2の名前はB
空のクラス(中身のないクラス)を作るには次のように書く。class SampleClass: pass # passを使うことで空のクラス(や関数)を作ることが出来ます。 sample = SampleClass() sample.name = "Sample"
- オブジェクト データ(属性)とメソッド(クラスに定義された関数)を持ったもの。Pythonの値は全てオブジェクトであり、オブジェクトには実行で出来る関数(メソッド)が定義されている。
- コンストラクタ(初期化メソッド) コンストラクタは対象のクラスのインスタンスを初期化するために利用する。 ※Pythonでは、厳密にはコンストラクタではなく、コンストラクタから呼び出される初期化メソッドになる。 クラスにはinitという特殊なメソッドを書くことができる。これが初期化を行うメソッドでコンストラクタと呼び、クラスのインスタンスが作成される際に一度だけ呼ばれるメソッドである。 また、クラスが内包するデータ属性と呼ぶ。
# Userクラスを作るプログラム class User: def __init__(self, name): # インスタンス化されて渡ってくる値を受ける変数を定義します # インスタンス変数(属性の初期化) self.name = name print("コンストラクタが呼ばれました")def hello(self): print("Hello " + self.name)user = User("Sample User") # userというインスタンスを生成しています。
Userクラスのコンストラクタはnameという引数を取り、その引数であるself.name(この変数のことをインスタンス変数と呼びます)を初期化している。 インスタンス変数は、個々のインスタンスに格納される変数のこと(ここではnameがインスタンス変数)。 helloメソッド内で、selfの後に属性名を書いているが、このように書くことでインスタンス変数の作成及びアクセスができる。user = User("Sample User") py = User("python") user.hello() py.hello()
- メソッド クラスに定義された関数のこと。 前回、空のSampleClassを定義したが、今回はメソッドを持つSampleClassを作る!
class SampleClass: # メソッドメソッドには1つ目の引数selfを必ずつけてください。selfというのはクラスのインスタンス自身を指しています def set_name(self, name): self.name = name # 受け取った値をSampleClasasのインスタンスに格納する必要があります。そのためにself.name = nameとします。self自体がSampleClassのインスタンスをさしますので、nameと言うインスタンス変数を用意して引数nameを代入します。def hello(self): print("hello, {0}".format(self.name))sample = SampleClass() sample2 = SampleClass() sample.set_name("Python") # selfは自分自身を示すものなので、nameに当たるPythonだけの引数だけで問題ありません。 sample2.set_name("AI") sample.hello() sample2.hello()
- 継承 既存のクラスをもとに新しいクラスを作る仕組み。継承を利用することで既存のクラスの拡張が効率良く行なうことが可能になり、またプログラムの保守性も上がる。 User(親クラス・スーパークラス・基底クラス)-> SuperUser(子クラス・サブクラス・派生クラス) これから定義する子クラスSuperUserクラスは、親クラスの機能が備わっているため、子クラスを定義する際には新しく追加したい機能だけを定義するだけで済む。 継承することで既存のクラスを再利用し、新たなクラスを作成することができる。
class User: def __init__(self, name): self.name = namedef hello(self): print("Hello " + self.name)class SuperUser(User): # ユーザークラスを継承するには、()の中にUserクラスを書けばoKです。 def __init__(self, name, age): # super()を使うことで親クラスのメソッドを呼び出すことができます。 super().__init__(name) # こクラスから親クラスのコンストラクタを呼び出す self.age = age# メソッドのオーバーライド def hello(self): print("SuperHello" + self.name)# またこクラスのメソッドの中で、例えばオーバライドした # メソッド内で、super()を使うことで親クラスUserのメソッドを呼び出すこともできます。 super().hello()</code></pre>t = SuperUser("tani", 100)t.hello()
- 多重継承 複数の親クラスから継承すること。 下記の例では、Base1とBase2の2つが親クラス(基底クラス)でその2つから継承されていることを意味する。
# Pythonは多重継承をサポートしています。 # 複数の基底クラスを持つクラス定義は次のような構文になります。 class SampleClassName(Base1, Base2): ・・・・ ・・・・ # 上記のBase1を継承した後にBase2を継承します。
- オーバーライド メソッドを独自の機能で上書きすることをオーバーライド(over ride)と言う。 下記のDerivedクラス内のsampleメソッドがBaseクラスのsampleメソッドをオーバーライドすることで上書きされている。 今回はsampleメソッドのみオーバーライドしたが、init()を含むあらゆるメソッドをオーバーライドできる。
# 基底クラス class Base: def sample(self): print("Base.sample()が呼ばれました")def test(self): print("Baseクラスtestメソッドが呼ばれました")# 派生クラス class Derived(Base): def sample(self): # Baseクラスのsampleメソッドをオーバーライド print("Derived.sample()が呼ばれました") self.test() # Baseクラスのtestメソッドを呼び出し d = Derived() d.sample()
元のBaseクラスは、親クラスもしくはスーパークラス(もしくは基底クラス)と呼ばれる。 新しくできたDerivedクラスは子クラス、サブクラス、派生クラスなどと呼ばれる。
- オブジェクト指向 プログラミングのスタイル・手法のことで、プログラミングパラダイムと呼ばれる1つ。 プログラミングパラダイムには、オブジェクト指向プログラミング以外にも、関数型プログラミング、手続き型プログラミングがある。 手続き型プログラミングでは、連続した手続きを記述し、上から下へと流れ、変数などの状態が変化しながらコードを書いていく。
コメント