この記事は、他の言語を習得済みの方に向けた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を簡単に学んでもらいました!
このチュートリアルは完璧なものではありません。さらに詳しく学びたい方は公式ドキュメントを参照したり、参考書を使って学習しましょう!
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ