Python

基礎文法・基本仕様

当ページではPythonの基礎となる文法や基本的な仕様についてまとめています。

コメントアウト

コメントアウトは「#」から改行するまでの1行が対象です。複数行にまたがってのコメントアウトはできません。

# ここがコメントアウトされます

文字コード

標準文字コードはUTF-8です。これを変更するときは、ソースコードの1行目か2行目で文字コードを指定する必要があります。文字コードの指定には以下のようにコメントアウト内に特定の文字列を記述します。

# -*- coding: 文字コード -*-

オフサイドルール

Pythonはオフサイドルールを採用しています。オフサイドルールとはインデントによってブロックを定義する文法のことです。Pythonでは基本的に半角空白4つで1インデントとします。

# オフサイドルールの例(for文)for each in [1, 2, 3]:print(each)# これはエラーfor each in [1, 2, 3]:print(each)

リテラル

数値・文字列・論理値の取り扱いは他のプログラミング言語と大きく変わりません。一部面白い演算子があるのと論理値の判定基準が特徴的かもしれません。

数値

数値の取り扱いは他のプログラミング言語と基本的に同じです。。

# 整数・浮動小数点数・負の値12.3-4# 計算もできる5 + 67 + (8 * 9)

整数の接頭辞に「0b」「0B」を付けると2進数、「0o」「0O」を付けると8進数、「0x」「0X」を付けると16進数になるところも他の言語と似ています。

ただ、面白い演算子として「//」と「**」があります。前者は除算したうえで小数部を捨てて整数にする演算子、後者は累乗を表す演算子です。

# //演算子5 // 2 # 2と出力# **演算子3 ** 2 # 9と出力

文字列

文字列はシングルクォート、およびダブルクォートで囲んで表現します。一般的(?)にはシングルクォートのほうが使われている印象です。また、それぞれ3連にして挟むと複数行の文字列を表現することができます。

'abc'"ABC"# 複数行表現print('''firstsecond''')

文字列の連結には「+」を用います。また、「*」の左辺に文字列、右辺に数値を指定すると、左辺に指定した文字列を右辺に指定した数値の回数分繰り返します。

print('abc' + 'def') # abcdefと出力print('!' * 2) # !!と出力

エスケープシーケンスは「\」です。また、文字列の接頭辞として「r」「R」を付けると文字列がそのまま出力されます。この機能をraw文字列と言います。

# エスケープシーケンス(以下は改行を表す)\n# raw文字列r'\a\b\c\d'

文字列のなかに変数等の値を組み込むには「%」を用います。演算子の左辺は組み込み先となる文字列、右辺には組み込む値・式を指定します。文字列のなかには変換指定子というものを組み込む必要があります。右辺に指定したデータは変換指定子の位置に代入されます。変換指定子は6種類あり、「%d」は整数、「%o」は8進数、「%x」は16進数、「%f」は浮動小数点数、「%s」は文字列、そして「%%」と記すことで%という文字が入ります。

# 例文1quantity = 3print('在庫数は%d個です' % quantity) # 在庫数は3個です# 例文2state = '待機'print('現在の状態は「%s」です' % state) # 現在の状態は「待機」です

あるいは文字列リテラルの接頭辞に「f」あるいは「F」を付けることでフォーマット済み文字列リテラルとなります。フォーマット済み文字列リテラルのなかに中括弧を組み込み、中括弧のなかに処理を記述することで処理の内容が文字列に組み込まれます。

a = 1b = 2print(f'12{a + b}45') # 12345

論理値

偽はFalse、真はTrueで表します。また、数値の0や0.0、空文字、空の配列、Noneなどが偽と判定されます。それ以外の値は全て真と判定されます。

シーケンス

シーケンスとは複数の値を内包するためのデータ型です。他のプログラミング言語でいうコレクションのことです。シーケンスに属するのは、文字列リテラル・list・tuple・set・dictionaryです。

インデックスの指定によるシーケンス型データの操作方法は以下の通りです。例として文字列リテラルの操作を行っています。

var = 'Hello world.'# 特定の要素を参照print(var[0]) # Hと出力print(var[1]) # eと出力print(var[-1]) # .と出力# 範囲指定で要素を参照print(var[0: 1]) # Hと出力print(var[0: 2]) # Heと出力print(var[0: -1]) # Hello worldと出力print(var[-2: -1]) # dと出力print(var[0: 0]) # 何も出力されないprint(var[1: 0]) # 何も出力されないprint(var[0:]) # Hello world.と出力print(var[1:]) # ello world.と出力print(var[: 1]) # Hと出力print(var[: 2]) # Heと出力print(var[: -1]) # Hello worldと出力print(var[: 0]) # 何も出力されない# 要素を取得する間隔を指定print(var[:: 1]) # Hello world.と出力print(var[:: 2]) # Hlowrdと出力print(var[:: -1]) # .dlrow olleHprint(var[1: 2: 3]) # eと出力print(var[:: 0]) # ValueErrorがスローされる

list

listはいわゆる配列のように機能するシーケンスです。tupleとは違い、要素を変更することができます。

# 定義var = [1, '2', '3 knock out!']# 参照print(var) # [1, '2', '3 knock out!']と出力print(var[0]) # 1と出力

tuple

tupleはlistと似ていますが変更不可であるという点で異なります。基本的にはtupleを使い、変更する必要があるときはlistを使うという風に使い分けるのが良いでしょう。

# 定義var1 = 1, '2', '3 knock out!'var2 = (1, '2', '3 knock out!')# 参照print(var1) # (1, '2', '3 knock out!')と出力print(var2) # (1, '2', '3 knock out!')と出力print(var1[0]) # 1と出力print(var2[0]) # 1と出力

set

setは集合を表すデータ型です。集合を表すデータ型ですから、重複した値を保持することはできません。既に保持している値を代入してもエラーにはなりませんが1つに省略されます。保持できる値はイミュータブルなものに限られます。リテラルやtupleなどは格納できますがlistなどは保持できません。

# 定義var1 = {1, '2', '3 knock out!'}var2 = set([1, '2', '3 knock out!'])var3 = set((1, '2', '3 knock out!'))

dictionary

dictionaryはキーとバリューが1セットとし、これを複数保持できるデータ型です。他のプログラミング言語では連想配列、オブジェクトリテラル、ハッシュなどと呼ばれることがあります。

# 定義var = {1: 123, 2: 'abc', '3': 123, '4': 'abc'}# 参照var[1] # 123と出力var[2] # abcと出力var['3'] # 123と出力var['4'] # abcと出力

if文

if文の書き方は以下の通りです。ifブロック・elifブロック・elseブロックから成り、elifブロックは複数記述することができます。また、elifブロック・elseブロックは省略することができます。各ブロックの記述順はifブロック・elifブロック・elseブロックとなります。

# 文法if 条件式:処理elif 条件式:処理else:処理# 例文if state == 0:print("A")elif state == 1:print("B")else:print("Z")

条件式の書き方にはシーケンスのなかに特定の値が含まれているとき実行するという書き方があります。

# 文法if シーケンス in (判定値1, 判定値2, 判定値n):処理

while文

while文は以下のように記述します。whileブロックとelseブロックの2つのブロックで構成され、elseブロックは省略することができます。elseブロックの処理はwhile文のループから正常に抜けたときに実行されます。break文で強制的に抜けたり、エラーによって処理が中断されたときは実行されません。

while 条件式:処理else:while文から抜けたときに実行する処理

for文

Pythonのfor文は以下のように記述します。elseブロックの記述は省略することができます。elseブロックは省略することができます。elseブロックの処理はfor文のループから正常に抜けたときに実行されます。break文で強制的に抜けたり、エラーによって処理が中断されたときは実行されません。

for ループ変数 in 配列:処理else:for文から抜けたときに実行する処理

break文とcontinue文

while文とfor文のなかではbreak文・continue文が使用できます。break文はそれぞれの制御文から強制的に抜けるための処理です。continue文はcontinue文が実行されたところで処理が中断されて、それぞれの制御文が最後まで実行した扱いとなる処理です。つまり、continue文を実行すると強制的にループ判定に戻ってくるわけです。

なお、Pythonにラベルという概念はありませんので多重ループから抜けるときは少し工夫が必要となります。

pass文

pass文は何も処理が行われないという、ちょっと変わった制御文です。何も処理を実行させたくないが文法上、処理を走らせる必要があるときに使います。

return文

return文は処理を中断し、呼び出し元に指定した値を返します。

return 戻り値

変数

Pythonの変数の仕様は以下の通りです。

第1に、変数宣言キーワードがありません。そのため初期化に際しては、いきなり変数に値を代入することになります。変数宣言を省略しても良いという言語はそれなりにありますが、変数宣言がないというのは面白い仕様と思われます。ただし、初期化されていない変数を参照するとNameErrorがスローされます。

第2に、データ型の指定が不要であり、指定することもできません。これは動的型付けらしい特徴ですね。

第3に、定数の概念がなく、変数への再代入を禁じる仕組みがありません。これはかなり珍しい仕様の1つかと思われます。

# 宣言と初期化var1 = 1# 再代入var1 = 2# 1度も代入されていない変数を参照するとエラーprint(var2) # NameErrorがスローされる# 変数は代入するときか、参照するときしか記述できないvar2 # NameError# そのため使用する変数をソース先頭でまとめて宣言しておきたいというときは何らかの値を代入する必要があるvar2 = 0var3 = ''var4 = Falsevar5 = NaN

del文

del文を使うことで変数を削除することができます。

del 変数名

関数

関数の定義にはdef文を用います。引数はカンマ区切りで指定することができ、初期値を設定することもできます。また、引数の接頭辞として「*」を付けるとtuple型の可変長引数、「**」を付けるとdictionary型の可変長引数として機能します。

# 文法def 関数名(引数1, 引数2 = 初期値, *引数n):処理# 例文def check_moth(month = 0):if date < 1 or date > 12:return Truereturn False

関数を呼び出す際は位置引数とキーワード引数の2通りの仮引数を定義することができます。これらを併用する際は位置引数を先に指定してください。

# 呼び出す関数def check_date(year, month, day):# 処理# 位置引数で呼び出すときは仮引数の指定順に注意check_date(2019, 1, 23)# キーワード引数で呼び出すときは関数の引数名を間違えないように注意check_date(month = 1, day = 23, year = 2019)# 位置引数とキーワード引数を併用するときは位置引数が先check_date(2019, day = 23, month = 1)

lambda関数

lambda式を用いて定義された無名関数をlambda関数といいます。

# 文法変数 = lambda 引数1, 引数2, 引数n: 処理# 例文lf = lambda a, b: a * blf(3, 5) # 15と出力

クラス

class文を使うことでクラスを定義することができます。

class クラス名(引数1, 引数2, 引数n):処理

インポート

モジュールをインポートするにはimport文を利用します。

import モジュール