この記事は、他の言語を習得済みの方に向けたPythonチュートリアルです。
簡潔に解説しているのでプログラミング初心者の方にはわかりづらい内容となっているかもしれませんが、都度に関連記事を貼っておくので参照してください。
この記事では「Python 3」に焦点を当てて解説します。
Pythonの特徴
Pythonは、以下のような特徴を持つ言語です。
- 代入した値によって動的かつ暗黙的に型付けされる(動的型付け)
- 変数の宣言は必要ない
- 大文字と小文字が区別される
- オブジェクト指向言語なので全てがオブジェクト
出力
標準出力にオブジェクトを出力するにはprint()関数を使います。
print('Hello World')
実行結果
Hello World
ヘルプを参照する
Pythonのヘルプはいつでも参照できます。関数やクラスの使い方に困った場合はヘルプを見てみましょう!
| help(オブジェクト) | オブジェクトの使い方を取得できる |
|---|---|
| dir(オブジェクト) | オブジェクトの属性を全て表示できる |
| オブジェクト.__doc__ | ドキュメンテーション文字列を参照できます |
ヘルプ
int型のヘルプを確認してみます。
help(1)
実行結果
Help on int object: class int(object) | int([x]) -> integer | int(x, base=10) -> integer | | Convert a number or string to an integer, or return 0 if no arguments | are given. If x is a number, return x.__int__(). For floating point | numbers, this truncates towards zero. | :
属性一覧
int型の属性を確認してみます。
print(dir(1))
実行結果
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']
ドキュメンテーション文字列
abs()関数のドキュメント文字列を確認してみます。
print(abs.__doc__)
実行結果
Return the absolute value of the argument.
使い方に困った場合はヘルプを参照してください。ヘルプは基本的に英語で書かれているのでわからない場合は Google先生に翻訳してもらいましょう!
変数
Pythonでは、変数(名前)にオブジェクトを束縛(バインド)して使用します。
# varに1、VARに2の整数をバインド var = 1 VAR = 2 # 大文字の変数は定数としてみなす慣習がある print(var) print(VAR)
実行結果
1 2
type()関数で型を確認することができる。
print(type(var)) print(type(VAR))
実行結果
<class 'int'> <class 'int'>
構文
Pythonの構文の特徴は以下の通りです。
- 行末に「;」などの必須な終了文字がない
- ブロックはインデント・逆インデントで表現する
- ブロックを期待するステートメント(if や for など)は「:」で終わる
コメント
コメントは「#」を使って行コメント、「''' or """」で囲んで複数行コメントを表現します。
# 行コメント '''複数行 コメント です''' """ダブルクォート でも表現できます"""
演算子
バインド(代入)には=が使用され、2つの値が等しいか比べるには==が使用されます。+=や-=の代入演算子を使うことで右辺の値だけ「インクリメント/デクリメント」できます。これは文字列を含む多くのデータ型で使えます。
# インクリメント num = 1 num += 2 print(num) 3 # デクリメント num -= 1 print(num) 2 # 文字列の結合 s = "Hello" s += "world" print(s) Helloworld
また、1行で複数の変数を使用することもできます。
num = 1 val = 2 num, val = val, num print(num) 2 print(val) 1
配列
Pythonで利用できる配列は、「リスト、タプル、辞書、セット」です。リストは配列であり、辞書は連想配列であり、タプルは不変の配列であり、セットは集合です。Python の「配列」は異なる型を混在させることができます。
# リスト mylist = [1, ["別の", "リスト"], (10, "タプル")] # 辞書 mydict = {"Key 1": "Value 1", 2: 3, "pi": 3.14} # タプル mytuple = (1, 2, 3) # セット myset = {1, 2, 3, 1} # 同等の要素は削除される print(myset) {1, 2, 3}
全ての「配列」タイプの最初の項目のインデックスは「0」です。負の数は最後から最初に向かってカウントされ「-1」が末尾の項目です。
mylist = [1, 2, 3.14] # 最初の要素 print(mylist[0]) 1 # 最後の要素を3に変更 mylist[-1] = 3 [1, 2, 3] mydict = {'名前': '太郎', '年齢': 24} # 名前の取得 print(mydict['名前']) 太郎 # 年齢の変更 mydict['年齢'] = 30 {'名前': '太郎', '年齢': 30}
変数に関数の参照を渡すことができます。
# len関数をバインド func = len # len関数は配列の要素数を取得 print(func([1, 2, 3])) 3
「:(コロン)」を使って範囲で要素にアクセスできます。これをスライスと言います。
mylist = ["要素1", 2, 3.14] print(mylist[:]) ['要素1', 2, 3.14] print(mylist[0:2]) ['要素1', 2] print(mylist[-3:-1]) ['要素1', 2] print(mylist[1:]) [2, 3.14] # 3つ目のパラメーターを追加するとステップが指定できます # stepはインデックスの増分を変更できます print(mylist[::2]) ['要素1', 3.14]
文字列
文字列はシングルクォートまたはダブルクォートのいずれかで使用でき、一方のクォートを使った文字列内にもう一方のクォートを含めることができます(つまり、'これは"文字列"です'は有効)。複数行の文字列は、トリプルクォート('''または""")で囲んで表現します。
'文字列リテラル' '文字列リテラル中にもう一方のクォート(")を含めることができる' '''複数行 文字列 リテラル'''
Pythonの文字列は常にUnicodeですが、バイトである別の文字列型もあります。これはバイト文字列と呼ばれ、文字列前にbを付けて表現します(例えばb'Hello')。
bytestring = b'Hello' print(bytestring, type(bytestring)) b'Hello' <class 'bytes'>
文字列に値を挿入するには、%記法やfomatメソッドを使います。Python 3.6以降のバージョンの場合はフォーマット済み文字列リテラルを使うとより簡単です。
name = '太郎' # %記法 print("Name: %s, Number: %s, String: %s" % (name, 3, 3 * "-")) Name: 太郎,Number: 3,String: --- # %(key名)s を使って辞書の値を挿入できます print('私の名前は%(name)sです。年は%(age)sです' % {'age': 25, 'name': '太郎'}) 私の名前は太郎です。年は25です # 文字列型(str型)のformatメソッドを使う "Hello, {}!".format(name) Hello, 太郎 # フォーマット済み文字列リテラル print(f"Hello, {name}!") Hello, 太郎
制御構文
制御構文にはif、for、whileが用意されています。switchはないのでifで代用します。繰り返し可能な連番を生成するにはrange()関数を使います。
range()
# rangeオブジェクトの生成・出力 print(range(10)) range(0, 10) # rangeオブジェクトからリストを生成 rangelist = list(range(10)) print(rangelist) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
if文
num = 1 if num in (1, 2, 3, 4): print('numは(1, 2, 3, 4)のいずれかです') elif num == 5: print('numは5です') else: print('numは(1, 2, 3, 4, 5)以外の値です') numは(1, 2, 3, 4)のいずれかです
for文
# range(3)で生成したオブジェクトの要素を # numberに1つずつ渡して繰り返し処理します for val in range(3): if val == 1: # 真であれば処理される # break が実行され、ループが終了 break else: # 偽であれば処理される # continue が処理されると以降の処理はスキップされ次のループを開始します continue else: # elseはfor文のオプション # ループが中断されなかった場合のみ実行される pass # passは何も処理しません
while文
# 無限ループ while True: print("無限ループです")
関数
関数はdefキーワードで宣言されます。オプション引数は、必須の引数の後にデフォルト値を指定して定義します。関数はタプルを返すことができます(アンパックを使用することで効率よく複数の値を返すことができます)。
def func(num, string='hoge'): return num, string print(func(1))
実行結果
(1, 'hoge')
ラムダは、単一のステートメントで構成される関数です。
''' def func(x): return x + 1 と同等なラムダ式 ''' func = lambda x: x + 1 print(func(1))
実行結果
2
引数は参照渡しですが、不変の型(tuple、int、文字列など)は、呼び出し先の値を呼び出し元で変更することはできません。
不変の型は参照先の値を変更することができないので別のオブジェクトを代入すると古いオブジェクトは破棄され、参照自体が変更されます。
そのため、引数で渡された不変の型のオブジェクトを変更しても参照先の値を変更しているわけではないので元のオブジェクトの値は書き換えられません。
n = 1 l = [1, 2, 3] print(func(n, l)) (100, [1, 2, 3, '追加要素']) # 不変(イミュータブル)の型は書き換えられない print(n) 1 # 可変(ミュータブル)の型は書き換えることができる print(l) [1, 2, 3, '追加要素']
| 関数の定義と使い方 |
| ミュータブルとイミュータブル |
クラス
Pythonのクラスは継承や多重継承をサポートします。プライベートな属性は先頭にアンダースコアを付けることで宣言できます(慣例なので言語による強制力はありません)。任意の名前をクラスインスタンスにバインドすることができます。コンストラクタなどの特殊メソッドは__メソッド名__()で使用できます。
# objectクラスを継承したMyClassクラス class MyClass(object): # クラス変数 common = 10 # コンストラクタ def __init__(self): # インスタンス変数 self.myvariable = 3 # メソッド def myfunction(self, arg1, arg2): return self.myvariable # MyClassのインスタンス化 classinstance = MyClass() classinstance.myfunction(1, 2) 3 # クラス変数は全てのインスタンスで共有される classinstance2 = MyClass() classinstance.common 10 classinstance2.common 10 # クラス変数は「クラス名.変数名」から更新します MyClass.common = 30 classinstance.common 30 classinstance2.common 30 # 以下の方法ではクラス変数を更新しません # 動的にcommonというインスタンス変数を生成します classinstance.common = 10 classinstance.common 10 classinstance2.common 30 MyClass.common = 50 # クラス変数として更新されなくなります classinstance.common 10 classinstance2.common 50 # このクラスはMyClassを継承しています # 多重継承は以下のように宣言します: # class OtherClass(MyClass1, MyClass2, MyClassN) class OtherClass(MyClass): # 「self」引数は自動的に渡され、クラスインスタンスを参照できます def __init__(self, arg1): self.myvariable = 3 print(arg1) classinstance = OtherClass("hello") hello classinstance.myfunction(1, 2) 3 # 動的にインスタンス変数を追加することもできます classinstance.test = 10 classinstance.test 10
例外処理
Pythonの例外処理はtry-except[例外名]ブロックで処理します。
def some_function(): try: # 0で割るとエラーが発生します 10 / 0 except ZeroDivisionError: print("無効です") else: # 例外が発生しなかった場合 pass finally: # ここは例外処理の最後に実行されます print("終わりです") some_function() 無効です 終わりです
インポート
外部ライブラリは、import [ライブラリ名]キーワードと共に使用されます。個別の機能はfrom [ライブラリ名] import [関数名]でインポートできます。
import random from time import sleep randomint = random.randint(1, 100) print(randomint) 64
import文を使ってモジュールやライブラリを読み込む方法を解説
File I/O
Pythonにはさまざまなライブラリが組み込まれています。
例としてファイルI/Oを使用したシリアル化(pickleライブラリ を使用してデータ構造を文字列に変換する)の使用方法を見てみましょう!
import pickle mylist = ["This", "is", 4, 13327] # C:\\binary.datファイルを書き込み用で開きます # ファイル名文字列前の「r」はバックスラッシュのエスケープを防ぐために使われます myfile = open(r"C:\\binary.dat", "wb") pickle.dump(mylist, myfile) myfile.close() myfile = open(r"C:\\text.txt", "w") myfile.write("This is a sample string") myfile.close() myfile = open(r"C:\\text.txt") print(myfile.read()) 'This is a sample string' myfile.close() # ファイルを開いて読み取る myfile = open(r"C:\\binary.dat", "rb") loadedlist = pickle.load(myfile) myfile.close() print(loadedlist) ['This', 'is', 4, 13327]
まとめ
この記事ではPythonを簡単に学んでもらいました!
このチュートリアルは完璧なものではありません。さらに詳しく学びたい方は公式ドキュメントを参照したり、参考書を使って学習しましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ


