基本の文法¶
Pythonプログラムの書き方をここでは説明していきます。
Pythonを対話モードで起動し、例に挙げるコードを入力、実行してみてください。
入力する文字¶
コードを入力する際、日本語の文字列部分以外の文字は、次の点に注意してください。
- スペースは半角スペースを使う(全角は使えません)
- コメントや文字列以外の部分の命令の入力には半角の文字を使う(全角は使えません)
- 変数名、関数名などの大文字と小文字に気をつける(Pythonでは大文字と小文字は区別されます)
コメント¶
コメント文はプログラムコードを説明したり、プログラム中にメモを書く際に使います。コメント部分はPythonからは実行されず、解釈もされません。
コメントはプログラム中で #
の後に書きます。 #
の文字から行末までがコメントとして扱われます。
>>> # これはコメントです
>>> print(u"これは実行されます")
これは実行されます
>>> #print(u"これは実行されません")
計算する¶
対話モードを計算機として使ってみます。
Pythonでは数字の入力は数値として扱われます。小数点などを指定しなければ、整数として扱われます。
>>> 12345
12345
四則演算を行う場合、加算は +
、減算は -
、乗算は *
、除算は /
の記号をそれぞれ使います。
>>> 5 + 3 # 5と3を足す
8
>>> 5 - 3 # 5から3を引く
2
>>> 5 * 3 # 5に3を掛ける
15
>>> 5 / 3 # 5を3で割る
1
整数同士の割り算の結果は整数に丸められてしまうことに注意してください。いずれか片方が小数であれば、小数として計算されます。 [1]
>>> 5.0 / 3
1.6666666666666667
計算の優先順位を示すための括弧 ()
も使えます。入れ子になる場合でも同じ括弧の文字 ()
を使います。
>>> 2 * (5 * (2 + 3) + 1)
52
また、四則演算の他にもべき乗 **
や、余剰 %
の計算もできます。
>>> 2 ** 4 # 2の4乗
16
>>> 10 % 3 # 10を3で割った余り
1
[1] | Python3では整数への丸めは行われず、割り算の結果は小数になります。 |
変数¶
データを保持しておくために、 変数 を使うことができます。
変数に値を代入するには、等号 =
を使います。左辺に変数名、右辺に値を指定します。
>>> width = 20
>>> height = 5 * 9
>>> width * height
900
また、複数の変数に一度に値を代入することもできます。
>>> x = y = z = 0
>>> x
0
>>> y
0
>>> z
0
定義していない変数は使えません。使おうとするとエラーが発生します。
>>> hoge # hogeは未定義
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'hoge' is not defined
>>> hoge = 100
>>> hoge
100
変数の定義は、値を代入すればできます。事前の宣言文等は必要ありません。
Note
対話モードで定義した変数は、対話モードを終了するまでは保持されたままになります。
論理演算¶
論理演算には and
or
not
を使います。真は True
、偽は False
で表します。
>>> True and True
True
>>> True and False
False
>>> False and True
False
>>> False and False
False
>>> True or True
True
>>> True or False
True
>>> False or True
True
>>> False or False
False
>>> not True
False
>>> not False
True
また、数値の 0
や空の値 None
、空の文字列 ""
、空のリスト []
、空の辞書 {}
は偽の値として扱われます。それ以外は真の値として扱われます。
and演算は結果が真になる場合、「左から順に見て一番最後の値」を値として使います。結果が偽になる場合、「左から順に見て、最初に偽になる値」を値として使います。
>>> True and 123 and "abc" # 真
'abc'
>>> True and 0 and "abc" # 偽
0
or演算は結果が真になる場合、「左から順に見て一番最初に真になる値」を値として使います。結果が偽になる場合、「左から順に見て一番最後の値」を値として使います。
>>> False or 123 or "abc" # 真
123
>>> False or 0 or [] # 偽
[]
値の比較¶
値の比較には ==
>
>=
<
<=
!=
などの記号を使います。比較結果はTrueまたはFalseで返されます。
>>> x = 10 # xに10を代入
>>> x == 10 # xと10は等しい
True
>>> x != 5 # xは5ではない
True
>>> 5 > 2 # 5は2より大きい
True
>>> 5 < 2 # 5は2より小さい
False
データ構造¶
整数, 小数¶
>>> 1234
1234
>>> 3.14
3.14
真偽値¶
>>> True
True
>>> False
False
文字列¶
文字列は '
か "
で囲みます。二つに差はありません。
>>> 'Good morning, Feiz!'
'Good morning, Feiz!'
文字列に改行を含めるには、 改行文字 \n
を使うか、三連の(ダブル)クォーテーションで囲みます。
>>> print('Feiz!\nGood Bye!!')
Feiz!
Good Bye!!
>>> print("""Azuma
... Kenta""")
Azuma
Kenta
エスケープシーケンス(\
)をそのまま表示するには、 \\
とニ連続で書くか、raw文字列を使います。
raw文字列は、クォーテーションの前に r
をつけて表します。
>>> print('Feiz!\nFeeeeeeiz!!') # 何もしない場合改行して表示される
Feiz!
Feeeeeeiz!!
>>> print('Feiz!\\nFeeeeeiz!!') # 2連続で書く場合
Feiz!\nFeeeeeiz!!
>>> print(r'Feiz!\nGood Bye!!') # raw文字列を使う場合
Feiz!\nGood Bye!!
クォーテーションの前にuをつけるとUnicode文字列になります。
>>> u"あずま"
u'\u3042\u305a\u307e'
リスト¶
リストは順序を持った値の集合です。リスト内に複数のデータ型の値が混在しても問題ありません。
>>> mylist = [1, 'abc', True]
>>> mylist
[1, 'abc', True]
リスト内の各値は、リストの左側に []
の括弧で添字(インデックス)を指定することで参照できます。添字は0から始まる整数です。
>>> mylist = [1, 'abc', True]
>>> mylist[0]
1
>>> mylist[1]
'abc'
>>> mylist[2]
True
添字に負の値を指定すると、リストの終端から値が取り出せます。
>>> mylist = [1, 'abc', True]
>>> mylist[-1]
True
in
演算子を使うと、ある値がリストの中に存在しているか調べられます。
>>> mylist = [1, 'abc', True]
>>> 'abc' in mylist
True
>>> 4 in mylist
False
range
関数を使うと数値のリストを簡単に作れます。
>>> range(5)
[0, 1, 2, 3, 4]
>>> range(3, 10, 2) # 3から10より小さい値まで,2ずつ増加
[3, 5, 7, 9]
タプル¶
値を変更できない集合です。値を変更できない以外の特性はリストと同様です。
>>> mytuple = (1, 2)
>>> mytuple
(1, 2)
>>> mytuple = (1, 2)
>>> mytuple[0] = 3 # エラー
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
1要素のタプルを作るときは、末尾にカンマを入れるのを忘れないようにしましょう。
>>> (1) # ただの「1」になってしまう
1
>>> (1,) # 1要素のタプル
(1,)
リストやタプルや文字列の特定の範囲を切り出すことができます。
>>> [1,2,3,4,5][:3] # 先頭から添字3の一つ前まで
[1, 2, 3]
>>> 'Azuma Kenta'[3:] # 添字3から末尾まで
'ma Kenta'
>>> [1,2,3,4,5,6,7,8,9,10][1:-1:2] # スライスの3つ目を指定するとN個飛びで値を取り出せます。
[2, 4, 6, 8]
辞書¶
添字に文字列や数値、オブジェクトを使用できる集合です。
>>> {'a': 10, 'b': 20}
{'a': 10, 'b': 20}
>>> {'a': 10, 'b': 20}['a']
10
>>> {'a': 10, 'b': 20}['b']
20
>>> {1: 10, 2: 20}[1]
10
文字列のフォーマット¶
Pythonには現在2種類の文字列のフォーマット操作があります。現状ではまだ両方とも使われることが多いため、古いほうから順に説明します。
%を使ったフォーマット¶
%
を使った文字列のフォーマット操作は古い方法です。現在は推奨されていません。
C言語のsprintf()のようなフォーマット文字列に、 %
の右側の値を入れ込みます。複数の値を入れる場合は、リストやタプルを指定します。
>>> print("Hello, %s!" % "World")
Hello, World!
>>> print("%03d, %.3f" % (1, 2.5))
001, 2.500
また、リストやタプルの代わりに辞書を使うことも出来ます。渡した辞書のキーに対応する部分に値が入ります。
>>> print("a = %(a_value)d, b = %(b_value)s" % {'b_value': 'test', 'a_value': 10})
a = 10, b = test
formatメソッドを使ったフォーマット¶
formatメソッドを使ったフォーマット操作は新しい方法です。
{}
の括弧を指定して値を当てはめます。括弧内に数値の桁数や文字列の変換処理などを指定することができます。
>>> print("Hello, {}!".format("World"))
Hello, World!
>>> print("{:03d}, {:.3f}".format(1, 2.5))
001, 2.500
また、キーワード引数を指定することで、キーワードに対応する位置に値を入れられます。
>>> print("a = {a_value:d}, b = {b_value:s}".format(b_value='test', a_value=10))
a = 10, b = test
制御構文¶
インデント¶
コードの説明中には、インデント(字下げ)を使用する部分が出てきますが、これの文字に注意して下さい。
Pythonではインデントが構文に含まれて意味を持っているため、インデントはコード例と同様にしないと、動かないことがあります。
例を示します。
>>> for i in range(3):
... print(i)
...
0
1
2
このコードは0、1、2と数字を順に画面に出力するものですが、繰り返しの構文 for in
を使っています。2行目のprintは行頭で半角スペース4文字分をインデント(字下げ)しています。例えばこれをインデントしないで入力すると、エラーになります。
>>> for i in range(3):
... print(i)
File "<stdin>", line 2
print(i)
^
IndentationError: expected an indented block
対話モードでは、次の行に入力可能な場合 ...
と表示されます。入力の必要がない場合はそのままEnterキーをもう一度押せば、コードが実行されます。
Note
インデントの文字数については、議論がありますが、PEP8の文書では半角スペース4個を推奨しています。そのため、サードパーティの各種モジュールでもこれに従っている場合が多いです。タブ文字 \t
(ハードタブ)は、使わないことがほとんどです。特にこだわりがないのであれば、半角スペース4個のインデントを使用すると良いでしょう。
条件分岐(if else)¶
条件によって処理を分岐する場合は、 if
文を使います。
if文の書式:
if 条件式:
条件式が真の場合
else:
条件式が偽の場合
>>> x = 20
>>> if x == 20:
... print('x equals 20!')
... elif x > 20:
... print('x larger than 20!')
... else:
... print('x smaller than 20!')
x equals 20!
ifの条件式部分には、カッコはあってもなくても構いません。不要な場合は書かないのがPythonらしい書き方です:)
繰り返し(for)¶
Pythonの for
文はリストやタプルの要素を順番に反復処理します。
for文の書式:
for 変数 in シーケンス:
反復処理
シーケンス部分にはリストやタプルなどのイテレータを指定できます。要素は変数に格納され、反復処理の記述で使用できます。
>>> for x in range(3):
... print('x = %d' % x)
...
x = 0
x = 1
x = 2
反復を途中で終了するには break
を使います。
>>> for x in range(3):
... break
... print(x) # ここは実行されない
for
文に else
節を付けると、反復が終了した後に実行される処理を書くことができます。
ただしbreakなどでループを途中で抜けた場合、else節は実行されません。
>>> for x in range(3):
... print 'x = %d' % x
... else:
... print 'done'
...
x = 0
x = 1
x = 2
done
繰り返し(while)¶
Pythonの while
文は条件を満たす間はずっと反復処理を行います。
while文の書式:
while 条件式:
反復処理
>>> x = 0
>>> while x < 10: # xの値が10未満の間は繰り返す
... print(x),
... x += 1 # xの値を1増加
0 1 2 3 4 5 6 7 8 9
関数¶
同じ処理を何度も記述するのを避けるために、複数の処理を関数でまとめることができます。
関数では引数(パラメータ)を受け取って処理を行い、結果を返します。
関数の書式:
def 関数名(パラメータ1, パラメータ2, ...):
関数の処理
return 処理の結果
処理の結果を返す必要がない場合は、 return
は省略できます。returnを省略すると、Noneが返されます。
>>> def hello(): # hello関数の定義
... print("Hello, World!")
...
>>> hello() # hello関数の使用
Hello, World!
>>> def add(x, y): # add関数の定義
... return x + y
...
>>> add(1, 2)
3
デフォルト引数¶
Pythonでは引数のデフォルトの値を決められます。該当の引数が与えられない場合にデフォルトの値が関数に渡されます。
>>> def ian(word='black'):
... print '%s ian' % word
...
>>> ian()
black ian
>>> ian('white')
white ian
可変長引数¶
*
からはじまる引数で可変長の引数をリストとして取得できます。
>>> def sum(*args):
... result = 0
... for x in args:
... result += x
... return result
...
>>> sum(1,2,3,4,5,6,7,8,9,10)
55
>>> sum(1, 2, 3)
6
可変長キーワード引数¶
**
からはじまる引数で可変長のキーワード引数を辞書として取得できます。
>>> def f(**kwargs):
... return kwargs
>>> f(a=1, b=2, c=3)
{'a': 1, 'c': 3, 'b': 2}
>>> def g(**kwargs):
... for key, value in kwargs.items():
... print("{} {}".format(key, value))
>>> g(a=1, b=2, c=3)
a 1
c 3
b 2
特殊な引数指定方法¶
リストや辞書の各要素を引数として渡すこともできます。
引数が複雑な関数を呼び出すときや、条件によって引数が細かく変化するような場合に有用です。
>>> def func_a(x, y, z):
... print(x + y + z)
...
>>> args = [1, 3, 5]
>>> func_a(*args) # func_a(1, 3, 5)という呼び出しと等価
9
>>> def func_b(name="bucho", age=36):
... print("{} {}".format(name, age))
...
>>> kwargs = {'name': "feiz", 'age': 24}
>>> func_b(**kwargs) # func_b(name="feiz", age=24)という呼び出しと等価
feiz 24
クラス¶
自分でデータ型を作成したい場合、Pythonではクラスを作ります。
>>> class Person(object):
... def __init__(self, name, words):
... self.name = name
... self.words = words
... def say(self):
... print(u'「{}」と{}さん'.format(self.words, self.name))
...
>>> feiz = Person('feiz', u'ふぇ')
>>> feiz.say()
「ふぇ」とfeizさん
>>> tokibito = Person('tokibito', u'ぬるぽ')
>>> tokibito.say()
「ぬるぽ」とtokibitoさん
外部モジュールのインポート¶
import
文で外部モジュールが読み込めます。
標準ライブラリの os
を読み込んでみましょう。
import os
とすると os
モジュール内のオブジェクトにアクセスする事ができます。
>>> import os # グローバルネームスペースにosが追加される
>>> os.path.join('/usr/', 'home/bucho/')
'/usr/home/bucho/'
from os import path
とすると os.path
を path
として使うことができます。
>>> from os import path # グローバルネームスペースにpathが追加される
>>> path.join('/usr/', 'home/bucho/')
'/usr/home/bucho/'
次は¶
ここまでは、対話モードでコードを入力していたため、対話モードを終了してしまうと入力したものは消えてしまい、再利用できませんでした。
次は、ファイルにコードを記述して、再利用可能なスクリプトファイル、Pythonモジュールを作成していきます。