Categories: Python

【Python入門】基本文法

目次

目次へ

JupiterLab

  • Google Colaboratory

  • プログラムを入力する枠のことをセルと呼ぶ。

  • セルごとにプログラムを実行可能。

  • あるセルで実行した結果は他のセルで引き継ぐことができる。

  • セルはドラッグ・アンド・ドロップで順序を入れ替えることが可能。

  • セルをまとめたファイルのことをノートブック(.ipnbファイル)と呼ぶ。

  • .ipnbファイルは.pyとは異なるため、ノートブックを直接Pythonインタプリタで実行することは出来ない。

  • Jupiter NotebookJupiterLabの前身。既に開発が終了していて今は使われていないのでJupiterLabを使ったほうが良い。

Anaconda

  • Anacondaは、Pythonでのプログラム開発に必要な便利な環境を提供してくれるソフトウェアのこと。
  • AnacondaをインストールするとPythonインタプリタやJupiterLabのような統合開発環境、外部ライブラリをまとめてインストールしてくれる。

Vscodeで始めるPython

  • PCにPythonをインストールする。公式DL
  • VScodeに拡張機能「Pylance」をインストールする。

Python知識

  • Pythonファイルの拡張子は「.py」
  • 「.py」ファイルは、Pythonインタプリタでマシン語に変換して実行する。

Hello world

print('Hello World!')

コーディング規約

  • 英数字は半角で入力すること。
  • 大文字小文字は区別される。
  • カッコと引用符は必ず閉じる必要がある。

コメントの書き方

一行コメントの場合

コメントアウトしたい行の先頭に#をつける。

# print('Hello World!')

docStringと複数行コメントの場合

  • """から"""までの間の行がすべてコメントとして解釈される。
  • docStringにする場合は、メソッド直下またはクラス直下に書く必要がある。ここ以外に書くと単なるコメントであってdocStringとはみなされない。

メソッドの場合のdocString

def abc():
    """ abcメソッドは〇〇の機能を提供します。 """

クラスの場合のdocString

class abc():
    """ abcクラスは〇〇の機能を提供します。 """

以下はdocStringではなくコメントアウト

"""
print('Hello World!')
print('Hello World!2')
print('Hello World!3')
"""

または、シングルクォートを用いても可能。

'''
print('Hello World!')
print('Hello World!2')
print('Hello World!3')
'''

以下のように記述した場合、

print('Hello World!0')
"""
print('Hello World!')
print('Hello World!2')
print('Hello World!3')
"""
print('Hello World!4')

実行結果は以下のようになる。

Hello World!0
Hello World!4

数値型

説明
int型 pythonでは整数の制度に制限がないため、メモリが許す限り何桁でも扱える。
float型 float同士の演算結果はfloat型になる。<br>pythonでは無限大もfloat型として扱う。正の無限大はfloat(inf)と記述し、負の無限大はfloat(-inf)と記述する。<br>数値として扱えないNaNもfloat型として扱い、float(nan)と記述する。数値同士の演算にNaNが含まれる場合は、演算結果もNaNになる。
complex型 複素数を扱う型で、数値リテラルにjまたはJを付けるとcomplex型になる。

桁区切り

_を用いることで桁区切りをすることができる。

num = 1_000_000_000
print(num)

実行結果は以下のとおり

1000000000

型変換

組み込み変数のint()float()complex()を使うことで、数値型を変換することができる。

# int型
num = int(100)
print(num)

# float型
print(float(num))

# complex型
print(complex(num))

実行結果は以下のとおり

100
100.0
(100+0j)

四則演算

print(100 + 100)#200 加算
print(100 - 10)#90  減算
print(100 * 10)#1000 乗算
print(100 / 10)#10.0 割り算。結果は小数点で返ってくる。
print(100 // 10)#0 割り算。結果は整数で返ってくる。
print(4 // 3)# 1 割り算のあまり。
print(4 ** 3)#64 べき乗

演算子の優先順位

優先順位 演算子
**
*/%
+-

式の一部を()で囲むことで優先順位を最上位にすることができる。

文字リテラル

文字リテラルを使うときは"'を使う。

文字列の結合

print('100' + '100')#100100

文字列の反復

文字列 * 数値または数値 * 文字列で文字列を反復することができる。

文字列 * 数値の場合

print('123' * 2)#123123

数値 * 文字列の場合

print(2 * '456')#456456

1行を改行して記述する。

()内の複数の連続する文字は1つの文字として解釈されます。

str = ('aaaaa'
       'bbbbb'
       'ccccc')
print(str)

実行結果は以下のとおり

aaaaabbbbbccccc

出力結果が改行された状態の文字を入力する。

3つの"で括ると改行も含む文字列を生成できます。

str = """aaa
bbb
ccc"""
print(str)

実行結果は以下のとおり

aaa
bbb
ccc

エスケープシーケンス

バックスラッシュ\とその後ろに続く文字からなる表記。

表記 意味
\n 改行
\\ バックスラッシュ\の記号文字
\' シングルクォーテーション'の記号文字
\" ダブルクォーテーション"の記号文字

※バックスラッシュと円マークはコンピュータ内部では同じ文字として解釈される。 Linuxの場合は区別している場合があるがあるのでうまくいかない場合は適宜修正する。

改行の使用例

print('あいうえお\nかきくけこ\nさしすせそ')

結果は以下のとおり

あいうえお
かきくけこ
さしすせそ

バックスラッシュの使用例

print('あいうえお\\かきくけこ\\さしすせそ')

結果は以下のとおり

あいうえお\かきくけこ\さしすせそ

シングルクォーテーションの使用例

print('あいうえお\'かきくけこ\'さしすせそ')

結果は以下のとおり

あいうえお'かきくけこ'さしすせそ

ダブルクォーテーションの使用例

print('あいうえお\"かきくけこ\"さしすせそ')

結果は以下のとおり

あいうえお"かきくけこ"さしすせそ

変数とデータ型

変数の定義は以下のように変数名=値の形で記述する。
Pythonには定数が存在しないため、すべての変数は上書き可能です。

name='taro'

使用例は以下のとおり。

name='taro'
print(name)#taro

アンパック代入

複数の変数定義を1行で記述する方法。
変数名1, 変数名2 = 値1, 値2の形で記述する。

name, age = 'jiro', 20

使用例は以下のとおり。

name, age = 'jiro', 20
print(name)#jiro
print(age)#20

複合代入演算子

演算子 意味
+= 左辺と右辺を加算して、結果を左辺に代入
-= 左辺と右辺を減算して、結果を左辺に代入
*= 左辺と右辺を乗算して、結果を左辺に代入
/= 左辺と右辺を除算して、結果を左辺に代入

input関数

キーボード入力待ち受ける関数。
入力された値は文字列で受け取れる。

str = input('何か入力してください。')
print('入力された文字は' + str + 'です。')

結果は以下のとおり。

何か入力してください。111
入力された文字は111です。

データ型

Pythonのデータ型には以下の種類がある。

データ型 説明
int 整数型
float 小数型
str 文字列型
bool 真偽値

<mark>変数自体はデータ型を持たないが、値はデータ型を持つ。</mark>

type関数

変数に格納されている値が、何の型なのかを調べるための関数。

var1 = 1
var2 = '2'
var3 = 'あいうえお'
var4 = True
var5 = 'True'

print(type(var1))
print(type(var2))
print(type(var3))
print(type(var4))
print(type(var5))

結果は以下のとおり

<class 'int'>
<class 'str'>
<class 'str'>
<class 'bool'>
<class 'str'>

bool型の書き方

TrueもしくはFalseと記述する必要がある。
trueもしくはfalseと記述するとコンパイルエラーになる。

var1 = True
var2 = true    #コンパイルエラー
var3 = False
var4 = false   # コンパイルエラー

データ型の変換

関数 説明
int(x) 変数xをint型に変換する。<br>xが少数の場合は、切り捨てられて整数になる。<br>xが数値として解釈できない文字列の場合はエラーになる。
float(x) 変数xをfloat型に変換する。<br>xが数値として解釈できない文字列の場合はエラーになる。
str(x) 変数xをstr型に変換する。
bool(x) 変数xをbool型に変換する。

値が1.00の場合

var1 = 1.00
var2 = '1.00'

floatVar1 = float(var1)
floatVar2 = float(var2)

print(floatVar1)
print(floatVar2)

print(type(floatVar1))
print(type(floatVar2))

実行結果は以下のとおり。

1.0
1.0
<class 'float'>
<class 'float'>

値が1.09の場合

var1 = 1.09
var2 = '1.09'

floatVar1 = float(var1)
floatVar2 = float(var2)

print(floatVar1)
print(floatVar2)

print(type(floatVar1))
print(type(floatVar2))

実行結果は以下のとおり。

1.09
1.09
<class 'float'>
<class 'float'>

format関数

各データ型をstr型に変換して出力する関数。

渡した順に出力する

name = 'ドラえもん'
age = 10
height = 129.3
boolVar = True

moji = 'ぼく{}です。年齢は{}歳です。身長は{}cmです。〇〇は{}です。'.format(name, age, height, boolVar)
print(moji)

結果は以下のとおり。

ぼくドラえもんです。年齢は10歳です。身長は129.3cmです。〇〇はTrueです。

引数の位置を指定して出力する

name = 'ドラえもん'
age = 10
height = 129.3
boolVar = True

moji = 'ぼく{2}です。年齢は{1}歳です。身長は{3}cmです。〇〇は{0}です。'.format(boolVar,age,name,height)
print(moji)

結果は以下のとおり。

ぼくドラえもんです。年齢は10歳です。身長は129.3cmです。〇〇はTrueです。

キーワードを指定して出力する

name = 'ドラえもん'
age = 10
height = 129.3
boolVar = True

moji = 'ぼく{n}です。年齢は{a}歳です。身長は{h}cmです。〇〇は{b}です。'.format(n=name, a=age, h=height, b=boolVar)
print(moji)

結果は以下のとおり。

ぼくドラえもんです。年齢は10歳です。身長は129.3cmです。〇〇はTrueです。

辞書からキーを取得して置換

dora = {'name':'ドラえもん','age':'10','height':'129.3'}

moji = "ぼく{name}です。年齢は{age}歳です。身長は{height}cmです。".format(**dora)
print(moji)

結果は以下のとおり。

ぼくドラえもんです。年齢は10歳です。身長は129.3cmです。〇〇はTrueです。

以下のように書いても同じ結果になる。

dora = {'name':'ドラえもん','age':'10','height':'129.3'}

moji = "ぼく{name}です。年齢は{age}歳です。身長は{height}cmです。"
result = moji.format(**dora)
print(result)

f-string

format関数を使わずにもっと直感的に書けるようにしたもの。
Python3.6以降で利用可能な機能。

name = 'ドラえもん'
age = 10
height = 129.3
boolVar = True

moji = f'ぼく{name}です。年齢は{age}歳です。身長は{height}cmです。〇〇は{boolVar}です。'
print(moji)

結果は以下のとおり。

ぼくドラえもんです。年齢は10歳です。身長は129.3cmです。〇〇はTrueです。

コレクション

データの集合をPythonでは「コレクション」または「コンテナ」と呼び、以下の種類がある。

  • リスト(list
  • ディクショナリ(dictionaly
  • タプル(tuple
  • セット(set

リスト(list

  • リスト(list)は、複数の値を1列に並べて管理するためのコレクション。
  • Javaでいう配列。
  • 角括弧[]を使って宣言する。
  • 各要素はカンマ,で区切る。
  • リストに格納されているそれぞれの値を<mark>要素</mark>と呼ぶ。
  • 添字は<mark>0</mark>から始まる。(最後の要素の添字は、要素数-1になる。)
  • リストにはデータ型は存在しない。そのため、1つのリストに異なるデータ型の値を格納することが可能。

リストを宣言するには以下のように記述する。

リスト名 = [要素1, 要素2, 要素3]

リストの作成

初期値を設定する場合は以下のように記述する。

nameList = ['taro', 'jiro', 'saburo']

空のリストを作成するには以下のようにlist関数を呼び出す。

nameList = list()

また、以下の記述でも空のリストを作成可能。

nameList = []

リストの参照

nameList = ['taro', 'jiro', 'saburo']

print(nameList) #{'taro', 'jiro', 'saburo'}
print(nameList[1]) #jiro

実行結果は以下のとおり。

['taro', 'jiro', 'saburo']
jiro

リストの要素を追加

  • appendメソッドで追加する。
nameList = ['taro', 'jiro', 'saburo']

print(nameList) #追加前を出力
nameList.append('shiro')
nameList.append('goro')
print(nameList) #追加後を出力

実行結果は以下のとおり。

['taro', 'jiro', 'saburo']
['taro', 'jiro', 'saburo', 'shiro', 'goro']

リストの要素を変更

特にメソッドは存在せず、=で再代入する。

nameList = ['taro', 'jiro', 'saburo']

print(nameList[0]) #変更前を出力
nameList[0] = 'ichiro' #←ここで変更
print(nameList[0]) #変更後を出力

実行結果は以下のとおり。

taro
ichiro

リストの要素を削除

  • removeメソッドを用いる。
  • 削除した要素の後ろに存在する要素は手前の添字に置き換わる。
nameList = ['taro', 'jiro', 'saburo']

print(nameList) #削除前を出力
nameList.remove('jiro')
print(nameList) #削除後を出力

実行結果は以下のとおり。

['taro', 'jiro', 'saburo']
['taro', 'saburo']

リストの合計を求める(sum関数)

  • リスト内のすべての要素の合計を求めることができる。
  • 文字列を格納している場合には使えない。
使用例
num = [10, 20, 30]

print(sum(num))    #60
リストに文字列が含まれている場合は実行時エラー。

コンパイルは通るが実行時エラーになる。

num = ['10', '20', '30']

print(sum(num))

以下のエラーが出力される。

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-75-ce5b7b2cd510> in <module>()
      1 num = ['10', '20', '30']
      2 
----> 3 print(sum(num))

TypeError: unsupported operand type(s) for +: 'int' and 'str'

リストの要素数を求める(len関数)

  • リストの要素数を求めることができる。
使用例
num = [10, 20, 30]

print(len(num))    #3

リストの範囲指定

  • すべての添字を参照したい場合は[:]と記述する。
  • n以上の添字を参照したい場合は[n:]と記述する。
  • n未満の添字を参照したい場合は[:n]と記述する。
  • x以上y未満を参照したい場合は[x:y]と記述する。

※添字を指定しているわけではないので、適当な数値でもエラーになったりはしない。

num = [10, 20, 30, 40, 50]

print(num[:]) #すべての添字を参照
print(num[2:]) #添字2以降を参照
print(num[:3]) #添字3未満を参照
print(num[1:4]) #添字1以上4未満を参照
print(num[0:5]) #添字0以上5未満を参照

実行結果は以下のとおり。

[10, 20, 30, 40, 50]
[30, 40, 50]
[10, 20, 30]
[20, 30, 40]
[10, 20, 30, 40, 50]

リストの後ろから参照する

負の数を指定することで、リストの末尾から参照することが可能。

num = [10, 20, 30, 40, 50]

print(num[-1]) 
print(num[-2]) 
print(num[-3]) 
print(num[-4]) 
print(num[-5]) 

実行結果は以下のとおり。

50
40
30
20
10

以下のように存在しない添字を指定すると実行時エラーになる。

num = [10, 20, 30, 40, 50]

print(num[-6]) 

以下、エラーの内容。

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-83-0acb11719e5d> in <module>()
      1 num = [10, 20, 30, 40, 50]
      2 
----> 3 print(num[-6])

IndexError: list index out of range

ディクショナリ

  • JavaでいうMap
  • 波括弧{}で宣言する。
  • 各要素はカンマ,で区切る。
  • 要素に対してキー(key)を持つ。「キー:値」の形式で値を管理する。
  • キーのデータ型は要素ごとに異なっていても問題ない。
  • キーは大文字と小文字を区別する。
  • キーの重複は許されるが、後勝ちになる。(最後に格納した値が有効になる。)
  • Pytyon3.7以降であれば、データが追加した順になっている。(Pytyon3.6以下の場合、ディクショナリの順番は保証されない。)

ディクショナリの作成

yasai = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

ディクショナリの参照

参照するには波括弧{}ではなく角括弧[]を使うことに注意。

yasai = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

print(yasai)           #全部指定
print(yasai['ninjin']) #個別指定

実行結果は以下のとおり。

{'kyabetsu': 50, 'ninjin': 80, 'tamanegi': 30}
80
存在しないキーを参照した場合

存在しないキーを参照した場合は実行時エラーになります。

yasai = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

print(yasai['apple'])

実行結果は以下のとおり。

KeyError                                  Traceback (most recent call last)
<ipython-input-94-eb0b01918080> in <module>()
      1 yasai = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}
      2 
----> 3 print(yasai['apple'])

KeyError: 'apple'

ディクショナリの要素を追加

存在しないキーに対して値を代入すると追加になります。

yasai = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

yasai['hakusai'] = 300

print(yasai['hakusai'])

実行結果は以下のとおり。

300

ディクショナリの要素を変更

存在するキーに対して値を代入すると更新になります。

yasai = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

print(yasai['ninjin'])    #更新前の出力
yasai['ninjin'] = 70       #値の更新
print(yasai['ninjin'])    #更新後の出力

実行結果は以下のとおり。

80
70

ディクショナリの要素を削除

削除するにはdel構文を使用する。

yasai = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

print(yasai)    #削除前の出力
del yasai['ninjin']
print(yasai)    #削除後の出力

実行結果は以下のとおり。

{'kyabetsu': 50, 'ninjin': 80, 'tamanegi': 30}
{'kyabetsu': 50, 'tamanegi': 30}

ディクショナリの合計を求める

.values()メソッドを用いると、キーを除いた値だけの集合を取得することができる。

yasai = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

gokei = sum(yasai.values()) #合計を取得

print(gokei)

実行結果は以下のとおり。

160

ディクショナリのキーが存在するかどうかを調べる

in演算子を使うことでキーが存在するかどうかを調べることができる。

yasaiDict = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

key = 'ninjin'
if key in yasaiDict:
    print('指定したキーは存在します。')
else:
    print('指定したキーは存在しません。')

キーが存在しない場合のみ追加したい場合は、以下のように記述する。

yasaiDict = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

key = 'hakusai'
if (key in yasaiDict) != True:
    print('指定したキーは存在しません。')
    yasaiDict[key] = '100'
print(yasaiDict)

実行結果は以下のとおり

指定したキーは存在しません。
{'kyabetsu': 50, 'ninjin': 80, 'tamanegi': 30, 'hakusai': '100'}

not演算子を使って以下のように記述しても同じ結果に成る。

yasaiDict = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30}

key = 'hakusai'
if not(key in yasaiDict):
    print('指定したキーは存在しません。')
    yasaiDict[key] = '100'
print(yasaiDict)

タプル

  • リストとほぼ同じ特徴を持つコレクション。
  • リストとは違い、追加・変更・削除ができない。
  • つまり、中身を変更できないリストのこと。
  • 丸括弧()で宣言する。
  • 各要素はカンマ,で区切る。
  • Python言語仕様としてはタプルを生成するのはカンマ,であるとされている。
  • 添字はリストと同様、0から始まる。

タプルの作成

yasaiTuple = ('daikon', 'piman', 'tomato')

タプルの参照

yasaiTuple = ('daikon', 'piman', 'tomato')

print(yasaiTuple[1])

実行結果は以下のとおり。

piman

タプルの合計を求める。

  • sumメソッドで合計を求めることができる。
  • 値が文字列の場合は実行時エラーになるので注意。
numTuple = (100, 50, 120)

print(sum(numTuple))

実行結果は以下のとおり。

270

タプルの要素数を求める。

lenメソッドで要素数を求めることができる。

yasaiTuple = ('daikon', 'piman', 'tomato')

print(len(yasaiTuple))

実行結果は以下のとおり。

3

要素数が1のタプルの作り方

以下のように記述すると実行結果はstr型と判定されてしまう。

yasaiTuple = ('daikon')

print(type(yasaiTuple))

実行結果は以下のとおり。

<class 'str'>

なぜstr型になってしまうかというと、('daikon')と記述すると、文字列を()で括って優先順位を引き上げているように解釈されるため。
要素数1のタプルを生成するには、'daikon', のように後ろにカンマをつけて記述する必要がある。

yasaiTuple = ('daikon', )

print(type(yasaiTuple))

実行結果は以下のとおり。

<class 'tuple'>

セット

  • 重複した値を格納することが出来ない。
  • 添字やキーの概念はない。
  • 特定の要素に対して代入・参照する方法は存在しない。
  • 添字がないため、要素は順序を持たない。
  • appendの代わりにaddで要素の追加を行う。
  • 波括弧{}で宣言する。
  • 各要素はカンマ,で区切る。

yasaiSet = {'daikon', 'piman', 'tomato'}

print(yasaiSet)
print(len(yasaiSet))

yasaiSet.add('jagaimo')
print(yasaiSet)

実行結果は以下のとおり。

{'piman', 'daikon', 'tomato'}
3
{'piman', 'jagaimo', 'daikon', 'tomato'}

積集合&

2つのセットの中から共通の要素を見つけ出し、それだけのセットを作成する。

carrySet = {'jagaimo', 'ninjin', 'tamnegi','currySauce'}

nikujagaSet = {'jagaimo', 'ninjin', 'tamnegi','kinoko'}

resultSet = carrySet & nikujagaSet

print(resultSet)

実行結果は以下のとおり。

{'tamnegi', 'jagaimo', 'ninjin'}

和集合|

2つのセットの内容をすべて含めたセットを作成する。

carrySet = {'jagaimo', 'ninjin', 'tamnegi','currySauce'}

nikujagaSet = {'jagaimo', 'ninjin', 'tamnegi','kinoko'}

resultSet = carrySet | nikujagaSet

print(resultSet)

実行結果は以下のとおり。

{'jagaimo', 'currySauce', 'tamnegi', 'ninjin', 'kinoko'}

差集合-

セットAに存在して、セットBには存在しない要素から成るセットを作成する。

carrySet = {'jagaimo', 'ninjin', 'tamnegi','currySauce'}

nikujagaSet = {'jagaimo', 'ninjin', 'tamnegi','kinoko'}

resultSet = carrySet - nikujagaSet

print(resultSet)

実行結果は以下のとおり。

{'currySauce'}

対称差^

セットAにしか存在しない要素、セットBにしか存在しない要素から成るセットを作成する。

carrySet = {'jagaimo', 'ninjin', 'tamnegi','currySauce'}

nikujagaSet = {'jagaimo', 'ninjin', 'tamnegi','kinoko'}

resultSet = carrySet ^ nikujagaSet

print(resultSet)

実行結果は以下のとおり。

{'currySauce', 'kinoko'}

コレクションの相互変換

list関数

  • ディクショナリ、タプル、セットをリストに変換するにはlist関数を用います。
  • ディクショナリやセットは元々順序が保証されていないため、list関数でリストに変換する際もどのような順番で変換されるかは保証されない。
yasaiDict = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30} #ディクショナリ

yasaiTuple = ('daikon', 'piman', 'tomato') #タプル

yasaiSet = {'daikon', 'piman', 'tomato'}   #セット

print(list(yasaiDict))
print(type(list(yasaiDict)))

print(list(yasaiTuple))
print(type(list(yasaiTuple)))

print(list(yasaiSet))
print(type(list(yasaiSet)))

実行結果は以下のとおり

['kyabetsu', 'ninjin', 'tamanegi']
<class 'list'>
['daikon', 'piman', 'tomato']
<class 'list'>
['piman', 'daikon', 'tomato']
<class 'list'>

tuple関数

  • リスト、ディクショナリ、セットをタプルに変換するにはtuple関数を用います。
  • ディクショナリやセットは元々順序が保証されていないため、tuple関数でタプルに変換する際もどのような順番で変換されるかは保証されない。
yasaiList = ['daikon', 'piman', 'tomato'] #リスト

yasaiDict = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30} #ディクショナリ

yasaiSet = {'daikon', 'piman', 'tomato'}   #セット

print(tuple(yasaiList))
print(type(tuple(yasaiList)))

print(tuple(yasaiDict))
print(type(tuple(yasaiDict)))

print(tuple(yasaiSet))
print(type(tuple(yasaiSet)))

実行結果は以下のとおり

('daikon', 'piman', 'tomato')
<class 'tuple'>
('kyabetsu', 'ninjin', 'tamanegi')
<class 'tuple'>
('piman', 'daikon', 'tomato')
<class 'tuple'>

set関数

  • リスト、ディクショナリ、タプルをセットに変換するにはset関数を用いる。
  • 元々重複の値が許されているリストやタプルなどをセットに変換すると、重複分は削除され、一意になる。
yasaiList = ['daikon', 'piman', 'tomato'] #リスト

yasaiDict = {'kyabetsu':50, 'ninjin':80, 'tamanegi':30} #ディクショナリ

yasaiTuple = ('daikon', 'piman', 'tomato') #タプル

print(set(yasaiList))
print(type(set(yasaiList)))

print(set(yasaiDict))
print(type(set(yasaiDict)))

print(set(yasaiTuple))
print(type(set(yasaiTuple)))

実行結果は以下のとおり

{'piman', 'daikon', 'tomato'}
<class 'set'>
{'ninjin', 'kyabetsu', 'tamanegi'}
<class 'set'>
{'piman', 'daikon', 'tomato'}
<class 'set'>

dict関数

「キーを保持したリスト」と「値を保持したリスト」の2つを用意することで、dict(zip(keyList,valueList))の形でディクショナリに変換することができる。

vegetableKeyList = ['daikon','hakusai','tamanegi']

vegetableValueList = ['大根','白菜','玉ねぎ']

resultDict = dict(zip(vegetableKeyList, vegetableValueList)) #ディクショナリに変換

print(resultDict)
print(type(resultDict))

実行結果は以下のとおり

{'daikon': '大根', 'hakusai': '白菜', 'tamanegi': '玉ねぎ'}
<class 'dict'>

if文

  • ブロックはインデントで表記する。
  • 1つのブロックの中でインデントを揃える必要があり、揃っていない場合はIndentationErrorが発生する。
  • Tabとスペースが混在する場合はTabErrorが発生する。
num = int(input('値を入力してください→'))

if(num >=50):
    print('入力された値は50以上です')
else:
    print('入力された値は49以下です')
print('この文はifブロックを抜けています')

else-if

elif構文で記述する。

num = int(input('値を入力してください→'))

if(num >=50):
    print('入力された値は50以上です')
elif(num >=30):
    print('入力された値は30以上です')
else:
    pass
print('この文はifブロックを抜けています')

空ブロック(pass構文)

「何もしない」を表現したい場合はpassを用いる。
passと明示的に記述しないとコンパイルエラーになる。

num = int(input('値を入力してください→'))

if(num >=50):
    print('入力された値は50以上です')
else:
    pass
print('この文はifブロックを抜けています')

使える演算子

演算子 意味 使用例
and かつ if num >=50 and num <=100<br>50以上100以下の場合True
or または if num1 <=30 or num2 <=50<br>num1が30以下もしくはnm2が50以下の場合True
not 否定 if not(key in yasaiDict):<br>キーが野菜dictに含まれていない場合True

Falseとして解釈される値

Falseの他にFalseとして解釈される値として以下があります。
NoneはJavaでいうNullと同義です。

num = int(0)
f_num = float(0.0)
nonStr = None
tmpStr = ''
tmpList = []
tmpDict = {}
tmpTuple = ()

print(bool(num))
print(bool(f_num))
print(bool(nonStr))
print(bool(tmpStr))
print(bool(tmpList))
print(bool(tmpDict))
print(bool(tmpTuple))

実行結果は以下のとおり

False
False
False
False
False
False
False

while文

while文は何回繰り返すかわからないときに使う。
以下のようにも記述できるが、繰り返す数が決まっているときはfor文を使う。

cnt = 0
limit = 5

while cnt < limit:
    print(f'cntの値は{cnt}です')
    cnt += 1

実行結果は以下のとおり

cntの値は0です
cntの値は1です
cntの値は2です
cntの値は3です
cntの値は4です

while文は以下のように、いつかフラグを変えてループを終了するようなときに使う。

flag = True
while flag:
    num = int(input('数値を入力してください>'))
    if num == 100:
        print('100が入力されました。ループを終了します。')
        flag = False
    else:
        print(f'入力された値は{num}です。ループを続けます。')
print('ここはwhile文を抜けてます。')

実行結果は以下のとおり

数値を入力してください>1
入力された値は1です。ループを続けます。
数値を入力してください>10
入力された値は10です。ループを続けます。
数値を入力してください>50
入力された値は50です。ループを続けます。
数値を入力してください>100
100が入力されました。ループを終了します。
ここはwhile文を抜けてます。

while文でのelse句

pythonではwhile文にelse句を使うことができます。
else句には、while文が終了したときに一度だけ実行させたい処理を記述することができます。
なお、break文でwhile文を抜けた際にはelse句の処理は実行されません。

flg = True

while flg:
  print(flg)
  flg = False
else:
  print('ループを抜けています。')

実行結果は以下のとおり

True
ループを抜けています。

以下のようにbreak文がある場合はelse句の処理は実行されません。

flg = True

while flg:
  print(flg)
  break
else:
  print('ループを抜けています。')

実行結果は以下のとおり

True

for文

リストなどデータの集合に対して繰り返し処理をしたい場合はfor文がおすすめ。

num = [10, 20, 30, 40, 50]

for n in num:
    print(n)
print('ここはもうfor文が終了してます。')

実行結果は以下のとおり

10
20
30
40
50
ここはもうfor文が終了してます。

range関数

range関数は、指定した数より1小さい整数列を生成することができる。
range(5)とした場合は、0,1,2,3,4の整列を生成することができる。

for n in range(5):
    print(n)
print('ここはもうfor文が終了してます。')

実行結果は以下のとおり

0
1
2
3
4
ここはもうfor文が終了してます。

breakcontinue

繰り返し処理を抜けるにはbreak、次のループに行くにはcontinueを用いる。

以下の処理は10以上の値を抽出してリストに詰める処理のサンプル

targetList = [0, '100' ,80 , '晴れ', 30, 60, '曇り',20]
resultList = list() #結果リスト

for data in targetList:
    # 結果リストが3以上の場合、ループを抜ける。
    if len(resultList) >=3:
        print(f'要素を3個取得したのでループを抜けます。')
        break;

    # int型以外を弾く。
    if not(isinstance(data, int)):
        print(f'この値はint型でないためスキップされました。{data}')
        continue

    # 10以上の場合、結果リストに格納する。
    if data >= 10:
        resultList.append(data)
print(resultList)

実行結果は以下のとおり

この値はint型でないためスキップされました。100
この値はint型でないためスキップされました。晴れ
要素を3個取得したのでループを抜けます。
[80, 30, 60]

組み込み関数enumerate

組み込み関数enumerateを用いると、リストのインデックスも一緒に取得することができます。

animals = ['dog', 'cat', 'cow', 'bear', 'pig']

for cnt, animal in enumerate(animals):
  print(f'{cnt}番目の動物は{animal}')

実行結果は以下のとおり

0番目の動物はdog
1番目の動物はcat
2番目の動物はcow
3番目の動物はbear
4番目の動物はpig

for文でのelse句

pythonではfor文にelse句を使うことができます。
else句には、for文が終了したときに一度だけ実行させたい処理を記述することができます。
なお、break文でfor文を抜けた際にはelse句の処理は実行されません。

animals = ['dog', 'cat', 'cow']

for cnt, animal in enumerate(animals):
  print(f'{cnt}番目の動物は{animal}')
else:
  print('これで処理を終了します。')

実行結果は以下のとおり

0番目の動物はdog
1番目の動物はcat
2番目の動物はcow
これで処理を終了します。

以下のようにbreak文がある場合はelse句の処理は実行されません。

animals = ['dog', 'cat', 'cow']

for cnt, animal in enumerate(animals):
  print(f'{cnt}番目の動物は{animal}')
  if cnt == 1:
    break
else:
  print('これで処理を終了します。')

実行結果は以下のとおり

0番目の動物はdog
1番目の動物はcat

例外処理try-except-finally

キーワード 説明
try句 例外が発生する可能性のある処理を記述する。
except句 try句の中で例外が発生した場合に、どんな処理を実行したいかを記述する。
else句 except句が存在する場合のみelse句は記述できる。<br>try句で例外が発生しなかった場合の処理を記述する。
finally句 例外が発生したかに関わらず必ず最後に実行したい処理を記述する。<br>finally句はexcept句が無くても利用可能
as 例外オブジェクトをexcept句ブロック内で利用できる。

以下のコードは、実際に例外を発生させた例です。

animals = ['dog', 'cat', 'cow']

try:
  print('ここはtry句です。')
  print(animals[3]) #あえて存在しないindexを指定する。
except IndexError as e:
  print('ここはexcept句です。')
  print(f'例外をキャッチしました。→{e}')
finally:
  print('ここはfinally句です。')

実行結果は以下のとおり

ここはtry句です。
ここはexcept句です。
例外をキャッチしました。→list index out of range
ここはfinally句です。

else句の使用例は以下のとおりです。

animals = ['dog', 'cat', 'cow']

try:
  print('ここはtry句です。')
  str = animals[2]
except IndexError as e:
  print('ここはexcept句です。')
  print(f'例外をキャッチしました。→{e}')
else:
  print('ここはelse句です。')
  print(str)
finally:
  print('ここはfinally句です。')

実行結果は以下のとおり

ここはtry句です。
ここはelse句です。
cow
ここはfinally句です。

例外を意図的に発生させるraise

raise文を用いると、意図的に例外を発生させることができます。

try:
  print('ここはtry句です。')
  raise TypeError('型エラーです。')
except IndexError as e:
  print('ここはexcept句です。')
  print(f'例外をキャッチしました。→{e}')
except TypeError as e2:
  print(f'例外をキャッチしました。→{e2}')
else:
  print('ここはelse句です。')
finally:
  print('ここはfinally句です。')

実行結果は以下のとおり。

ここはtry句です。
例外をキャッチしました。→型エラーです。
ここはfinally句です。

except句にraise文を用いると例外のログを出力することが出来ます。

try:
  print('ここはtry句です。')
  raise TypeError('型エラーです。')
except IndexError as e:
  print('ここはexcept句です。')
  print(f'例外をキャッチしました。→{e}')
except TypeError as e2:
  print(f'例外をキャッチしました。→{e2}')
  raise
else:
  print('ここはelse句です。')
finally:
  print('ここはfinally句です。')

実行結果は以下のとおり

ここはtry句です。
例外をキャッチしました。→型エラーです。
ここはfinally句です。
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-ead17b6739b8> in <module>
      3 try:
      4   print('ここはtry句です。')
----> 5   raise TypeError('型エラーです。')
      6 except IndexError as e:
      7   print('ここはexcept句です。')

TypeError: 型エラーです。

独自関数の定義と呼び出し

関数の定義

独自関数を定義するには以下のように記述する。
defは「定義する」という英単語のdefineに由来する。

def 関数名():
    処理

関数の呼び出し

呼び出すには、呼び出したい箇所で以下のように記述する。

関数名()

名前の衝突

例えばPythonが標準で用意しているinput関数と同じ名前で自分でinputという名前の関数を作ってしまうと、Python標準のinput関数は使えなくなってしまう。

引数なしの関数定義と呼び出し

def tashizan():
    return 10 + 20

# 関数の呼び出し
result = tashizan()
print(result)   # 30

引数ありの関数定義と呼び出し

def tashizan(x, y):
    return x + y


# 関数の呼び出し
result = tashizan(5,5)
print(result)    # 10

戻り値なしの関数定義

return文が書かれていない関数は、return Noneという記述が省略されたものとみなされる。

def tashizan(x, y):
    print(x + y)

# 関数の呼び出し
result = tashizan(10, 30)
print(result)   # None

複数の戻り値を返すには

resultをカンマ区切りで記述することによってタプルでreturnすることができる。

def calc(x, y):
    tasizan = x + y
    hikizan = x - y
    kakezan = x * y
    warizan = x / y

    return tasizan, hikizan, kakezan, warizan

result = calc(30,10)
print(result)   #(40, 20, 300, 3.0)

以下のように受け取ることも出来る。

tasizan, hikizan, kakezan, warizan = calc(30,10)
print(tasizan)  # 40
print(hikizan)  # 20
print(kakezan)  # 300
print(warizan)  # 3.0

引数にデフォルト値を設定する。

def calc(x=10, y=20):
    return x + y

# 引数を渡して実行
result = calc(30, 40)
print(result)   # 70

# 引数を渡さずに実行
result2 = calc()
print(result2)  # 30

ただし、以下のような関数定義はエラーになる。デフォルト引数を設定したい場合は、最後の引数から順にデフォルト値を設定する必要がある。

def calc(x=10, y, z):

引数のキーワード指定

キーワード指定をすると、関数に渡した順番とは関係なく、値を渡すことが出来る。

def calc(x,y,z):
    print(f'引数xには{x}が渡されました。')
    print(f'引数yには{y}が渡されました。')
    print(f'引数zには{z}が渡されました。')

    return x + y + z
result = calc(z=50, x=10, y=30)
print(result)

実行結果は以下のとおり。

引数xには10が渡されました。
引数yには30が渡されました。
引数zには50が渡されました。
90

作成した関数の型を調べる

typeで方を調べることが可能。

def calc(x, y, z):
    return x + y + z

print(type(calc))

実行結果は以下のとおり

<class 'function'>

作成した関数を変数に代入して実行

作成した関数は、変数に代入して実行することが可能です。

def calc(x, y, z):
    return x + y + z

keisan = calc

print(keisan(10, 15, 20))

実行結果は以下のとおり

45

可変長引数

  • 要素数0のタプルをデフォルト引数として指定することで実質的な可変長引数として使用することができる。
  • 呼び出し側もタプルを渡す必要がある。

タプルを使用した可変長引数

def calc(x,y,z, other=()):

    i = 0;
    for tmp in other:
        print(tmp)
        i = i + tmp
    return x + y + z + i

result = calc(10,20,30,(1,3,5))
print(result)

実行結果は以下のとおり。

1
3
5
69

*を使用した可変長引数(タプル編)

  • アスタリスク*を用いることでタプルを使用して明示的に可変長引数だと表すことが出来る。
  • 可変長引数は引数の最後にしか指定できない。
  • 可変長引数の値はタプルとして受け取る。(呼び出し側はタプルで記述する必要はない。)
  • 可変長引数に引数を渡さなかった場合は、空のタプルが生成される。
  • 可変長引数がタプルの場合は*argsと記述する慣習がある。
def calc(x,y,z, *other):

    i = 0;
    for tmp in other:
        print(tmp)
        i = i + tmp
    return x + y + z + i

result = calc(100,200,300,10,30,50)
print(result)
10
30
50
690

**を使用した可変長引数(ディクショナリ編)

  • **とすることで可変長引数にディクショナリを使用することが出来る。
  • 可変長引数がディクショナリの場合は**kwargsと記述する慣習がある。
def calc(**kwagrs):

    num = 0
    for key in kwagrs:
        num = num + kwagrs[key]
    return num

result = calc(aaa=10, bbb=20, ccc=30)
print(result)   # 60

グローバル変数

  • グローバル変数名と関数内のローカル変数名が同名の場合は、関数内ではローカル変数が優先される。
  • global文を使うことで、関数内でグローバル変数を使うことを表明することが出来る。(グローバル変数の値を書き換えることが出来る。)
num = 100

def aaa():
    print(num)

def changeGlobal():
    global num
    num = 10

aaa()
print(f'変更前のnumは{num}')
changeGlobal()
aaa()
print(f'変更後のnumは{num}')

実行結果は以下のとおり

変更前のnumは100
変更後のnumは10

identity

  • identityとは、すべてのオブジェクトに振られる管理番号のこと。
  • オブジェクトが作成されると、他のオブジェクトとは重複しないユニークな番号が割り振られる。
  • この番号は、オブジェクトが消滅するまで変わることはない。
  • identity値は、id関数を使って調べることが可能。
  • <mark>変数に格納されているのは値ではなくidentity値。</mark>
  • identity値が同じものを<mark>等値</mark>、identity値が違っても中身が同じものを<mark>等価</mark>という。
  • 等値判定を行うにはid(obj1) == id(obj2)を使う。
  • 等価判定を行うにはobj1 == obj2を使う。
# int型
num1 = int(10)
num2 = int(10)
print(id(num1) == id(num2))

# str型
moji1 = str('taro')
moji2 = str('taro')
print(id(moji1) == id(moji2))

# list
obj1 = list([10 ,20, 30])
obj2 = list([10 ,20, 30])
print(id(obj1) == id(obj2))
print(obj1 == obj2)

実行結果は以下のとおり

True
True
False
True

不変オブジェクト

Pythonでは、以下は不変オブジェクトとされている。

  • int型、str型、bool型など
  • tuple型

不変オブジェクトの内容を書き換えようとすると、別のオブジェクトとして生まれ変わる。代入前のオブジェクトは捨てられる。

ファイルへの書き込み

text = input('何か入力してください>')

file = open('sample.txt','a')   # 指定したファイルが存在しない場合は自動的に作成する。

file.write(text +  '\n')
file.close()

with文を用いると、withブロック終了時に自動的にファイルを閉じてくれる。

text = input('何か入力してください>')

with open('sample.txt','a') as file:   # 指定したファイルが存在しない場合は自動的に作成する。

    file.write(text +  '\n')

import文

import文はどこにでも記述することができるが、散らばっていると、何のライブラリを取り込んだのかが分かり辛くなってしまうので、ファイルの先頭にまとめて記述することが推奨されている。

ライブラリを取り込む

import math    # mathモジュールを使うことを宣言

print(math.pi)  # mathモジュールの変数piを使用

取り込んだライブラリに別名をつける

長すぎる名前などには、自分がわかりやすいように別名を付けておくことができる。

import math as m   # mathモジュールを使うことを宣言

print(m.pi)  # mathモジュールの変数piを使用

ライブラリから特定の変数や関数だけを取り込む

取り込むときに変数名や関数名だけ取り込んでおけば使用するときにライブラリ名.変数名の形ではなく単に変数名で参照可能になる。

from math import pi

print(pi)  # mathモジュールの変数piを使用

ライブラリから特定の変数や関数だけを取り込み、別名をつける

from math import floor as shisyagonyu

print(shisyagonyu(3.3)) 

ワイルドカードインポート

  • 指定したライブラリのすべての変数と関数を取り込む
  • 取り込んだ変数名や関数は名前だけで使用可能
  • この使い方はおすすめしない。
from math import *

print(floor(pi)) 
関数呼び出しのときはimportの右側に注目する。

import 〇〇と宣言した場合は呼び出し時に〇〇で使用可能になる。

外部ライブラリのインポート

以下のコマンドでインストール可能。

pip install ライブラリ名

ただし、anacondaを利用している場合はpipコマンドだと環境が壊れてしまうため、以下のコマンドを使用した方がいい。

conda install パッケージ名
issiki_wp