Python
公式サイトから最新のインストーラーをダウンロードして実行します。
Webサイトのメニュー「Download」からダウンロードします。
インストール時に環境変数へパスを追加するため「Add python.ext to PATH」にチェックしてから「Install Now」をクリックします。
インストール後にコマンドプロンプトにて「python --version」と入力し、バージョン情報が表示されればOKです。
Python開発環境をインストールしていないPCでもexe化を行うことで実行することができます。
様々なライブラリが用意されており、中でもメジャーな「PyInstaller」を使った方法になります。
- コマンドプロンプトから下記コマンドを実行しインストールします。
pip install pyinstaller
※ウィルス脅威でブロックされるためDefenderでの許可が必要です。
- Pythonファイルをexeファイルに変換する際は、下記コマンドのように入力します。
pyinstaller test.py --onefile
buildフォルダ、distフォルダ、.specというファイルが作成されます。
distフォルダ内にexeファイルが作成されています。
- PyInstallerオプション
--onedir(-Dでも可) 出力を1ディレクトリにまとめる
--onefile(-Fでも可) 出力ファイルを1つにまとめる
--noconsole(-wでも可) コンソールを表示しない
--clean ビルド前に前回のキャッシュ、出力ディレクトリを削除
オプションは下記のように指定します。
pyinstaller test.py --onefile --onedir --noconsole --clean
Nuitka
・メリット
生成されるexeファイルが PyInstaller に比べかなり小さくなる。
スクリプトをCに変換してからexeファイルにするため実行速度が高速になる。
・デメリット
別途Cコンパイラをインストールする必要がある。
配布時はexeファイル以外に、同時に生成される pythonxx.dll とCコンパイラで必要なランタイムファイルを同じフォルダに入れて実行する必要がある。
Pythonプログラミング
●基本的な文法と特徴
- マルチステートメント
1行に複数処理を記述する場合は「:」で区切る。
処理を複数行に跨いで記述する場合は、行末に「\」(バックスラッシュ)を付ける。
- コメント、ヒアドキュメント
#1行コメント
'''複数行コメント''' """複数行コメント"""
複数行の文字列を扱う場合も'''複数行文字''' """複数行文字"""
- 条件処理およびループ処理の範囲(ブロック)
インデント(字下げ)した範囲となり、通常は4個のスペースで行う。
●変数
命名ルールについて、先頭に数字は使えない、大文字と小文字は区別される、2バイト文字も使用可能。
慣例として、アンダーバーを含む英数字を使用し、定数として定義する場合は全て大文字を使用します。
変数は値を保管しているメモリ領域の場所を指しており、代入した際も同じ領域を参照するため注意が必要です。
代入された値によりデータ型が決まるため、変数に型を指定することはありません。
変数名 = オブジェクト(値)
a = 1
b = a * 2 + 3
a += 1 #代入演算 2
c = 'Test'
print(c[2]) #s
d = c #変数cと同じメモリ領域を変数dに割り当て
str = c + 'Data' #TestData
l = len(c) #cに代入された文字数
print('cの値は', c)
val1 = val2 = 100
c1,c2 = 'a','b'
del a #変数aを削除
●データ型
- 数値
整数 扱える数値の範囲に制限がなく、メモリが許す限りの桁数を扱うことができる。
実数 倍精度(double)変数と同じ、±2.3E-308~±1.7E+308の範囲で有効桁数は約15桁。
複素数 数値に添え字「j」を付けると複素数リテラルとして扱われます。
- 真偽値
Falseは「0」、True は「1」として定義されています。
先頭を大文字にしないと真偽値として認識されないので注意してください。
- 文字列
'abc'や"abc"のようにシングルクオート「'」または、ダブルクオート「"」で囲って指定する。
エスケープシーケンス \'、\"、\t、\\、\n、\r、\0、\f、\ooo(8進数文字)、\xhh(16進数文字)、\uxxxx(Unicode文字)など
raw文字列 生の文字を表し先頭にrまたはRを付ける。
filePath = r'C:\Users\deepinsider\Documents\work\data.txt' \も\\と記述しなくて良い。
フォーマット済み文字列(f文字列) 文字列の中に変数の値や計算式の値を埋め込む。先頭にfまたはFを付け、変数や式は{}で囲みます。
a=1:b=2:result=f'{a}+{b}={a+b}' 文字列結果は1+2=3になる
- リスト
配列に似た型でデータが並んだ集まり。内容や要素数を変えることができます。また、リスト内のデータ型は一致している必要はありません。
c = ['A','B','C','D','E','F','G']
print(c[0]) #A
for i in c[2:5]:
print(i) #CDE ※最後5番の要素は含まれない
c = ['a', 'b', 'c'] + [1, 2, 3] #結合が可能
l = len(c) #要素数
c = [['a', 'b'], ['c', 'd'], ['e', 'f']] #多次元 c[0][1] はb
- タプル
データが順に並んだ集まりで、内容や要素数を変えることができない。
tuple1 = (0,1,2) #数式の括弧と区別するため値の後にカンマを付けます
tuple2 = (1,) #値が一つの場合
- ディクショナリ
連想配列に似た型でキーと値のペアのデータでキーを指定して値を取得できる。
リストでは要素は0から始まる続き番号で指定するのに対し、ディクショナリのキーは連続でない整数値や文字列も使用できます。
d = {'key1':0,'key2':1,'key3':2,}
print(d['key2']) #1
dic = dict(one=1, two=2, three=3) #dict関数の場合、 キー名をクォートで括らない
- 集合
重複した値を持たず順番がないデータの集まりです。
sets1 = {'hoge', 999, True} #True, 'hoge', 999
sets2 = set(['fuga', 100, False]) #False, 'fuga', 100
sets3 = set('hogehoge') #'e', 'h', 'o', 'g' 重複は排除される
#集合の演算
sets1 = {'A', 'B', 'C', 'D'}
sets2 = {'A', 'C'}
print(sets1 - sets2) #{'B', 'D'}
print(sets1 & sets2) #{'A', 'C'}
数値、文字列、タプルは不変性のデータ型となり、値を変更することはできません。
ただし、数値など値が1つの場合はメモリ領域が入れ替わるため変更したのと同じような動作になる。
リストやディクショナリは可変性のデータ型にて、各要素の値を変更することができます。
あるリストを保持する変数を別の変数に代入すると、それら2つの変数は同じリストを共有することになり、一方の変数でリストの要素を変更すると、もう一方のリストの要素も変更されます。
このようなことを回避する場合は、代入ではなくコピーを使います。
a = L[:] #リストのコピー
b = d.copy() #ディクショナリのコピー
下記の関数を使ってデータ型を知ることができます。
type(a)#データ型
id(a)#識別値
●スコープ
変数や関数などの有効範囲になり、大きく3種類に分けられます。
変数は原則として、関数の内部で定義された場合は関数の外部からアクセスすることはできません。
また、関数の外側にある変数へアクセスする場合、参照のみ可能になります。
ただし、global 宣言や nonlocal 宣言をすることでスコープの制限を変更できます。
- グローバルスコープ
モジュール内での最上位のスコープです。ファイル内全体で使用することができます。
- ローカルスコープ
定義した関数内のスコープです。他のスコープから参照はできません。
なお、if文やfor文などの制御文ではローカルスコープは作られません。
また、グローバルスコープの変数や関数を参照することはできますが、値を代入(上書き)することはできません。
- ビルトインスコープ
Pythonに用意された組み込み変数や関数のスコープです。特に意識せず常に使用することができます。
val1 = 100 #モジュールスコープの変数宣言
def fnc():
print(val1) #100
val2 = 1 #ローカルスコープの変数宣言
print(val2) #1
●算術演算子
+ - * /(小数点) //(小数点切り捨て) %(余り) **(べき乗)
++aやa++などの記述はできませんが、+a、-aはプラス値、マイナス値として扱います。
●比較演算子
== != > < >= <=
in not in 要素内に含まれるか含まれないか
is not is オブジェクトの比較
1 < val < 3 のような記述も可能
●論理演算子
and or not
●ビット演算子
& | ^ << >> ~(ビット反転)
●三項演算(条件演算)
(条件が真のときの値) if (条件) else (条件が偽のときの値)
val = 1
print('OK' if val > 0 else 'NG') #OK
●文字列演算
'abc' + 'def' #abcdef
'ab' * 3 #ababab
'abcdef'[2] #c
'abcdef'[2:4] #cd
'abcdef'[2:] #cdef
'abcdef'[:5] #abcde
'abcdef'[2:5:2] #ce
●制御構文
インデント範囲が処理ブロックとなる。
if 条件式:
条件式が真の時処理
if 条件式:
条件式が真の時処理
else:
条件式が偽の時処理
if 条件式1:
条件式1が真の時処理
elif 条件式2:
条件式1が偽で条件式2が真の時処理
else:
すべての条件式が偽の時処理
if 値 in リストなど:
値が含まれる時処理
while 条件式:
条件式が真の時処理
while True: #無限ループ
for 変数 in オブジェクト:
処理
for 変数 in オブジェクト:
処理
break
else:
ループが終わりまで実行された後処理
for i in range(5): #iに0~4まで値を代入しながら、以下を5回実行する
for i in range(2,10): #iに2~9まで代入する
for i in range(2,10,2): #iに2~9まで+2ずつ代入する
for s in 'abc': #sに'a'、'b'、'c'を順に代入する
break #ループ処理終了
continue #現在のループを中断し次のループ処理を開始
●パス pass
「何もしない」ことを明示します。 条件分岐、例外処理、関数やクラスの実装が明確でないような場合に使用します。
if i == 0:
print(i)
else:
pass #何も処理しない
def hogehoge(): #関数の名前のみが決まっている場合
pass
●組み込み関数
abs() 数の絶対値を返します。
bin() 整数を2進数文字列に変換します。
oct() 整数を8進数文字列に変換します。
hex() 整数を16進数文字列に変換します。
bool() 真理値判定手続きに基づいてTrueかFalseを返します。
breakpoint() 該当の箇所からpython標準のデバッガを呼び出します。
bytes() byte配列を返します。
chr() Unicode値から文字を返します。
ord() 文字のUnicode値を返します。
int() 数値または文字列から作成された整数オブジェクトを返します。
float() 数または文字列から生成された浮動小数点数を返します。
complex() 文字列や数を複素数に変換します。
format() 第一引数の文字列を、第二引数のテンプレートでフォーマットした文字列を返却します。
max() 最大の要素、または2つ以上の引数の中で最大のものを返します。
min() 最小の要素、または2つ以上の引数の中で最小のものを返します。
sorted() 要素を並べ替えた新たなリストを返します。
str() 引数の文字列を返します。
sum() 要素の総和を返します。
range([開始値,] 終了値 [, 増減量]) 連続した数値が含まれるリスト
len() オブジェクトの要素数を取得する。文字数もこの関数を使います。
floor()、ceil()、round() 切り捨て、切り上げ、四捨五入します。
●関数定義 def
関数の定義には「def」を使用します。
def fnc(a,b=2): #引数bはデフォルト値付き
result = a + b
return result
fnc(1): #3
fnc(b=3, a=1): #4
#複数の戻り値を返却する関数
def getABC():
return('A', 'B', 'C')
(a, b, c) = getABC()
print(a) #A
print(b) #B
print(c) #C
関数の引数には4つの種類が存在します。
・通常の引数
・デフォルト値付きの引数
・可変長の引数
1つ以上の値を受け取る引数のことです。 引数名の前にアスタリスク(*)を付けます。
関数側では受け取った可変長引数はタプルとして扱います。
def fnc(a, b, *args):
・キーワード付きの可変長引数
引数を指定する際に、キーワードを付ける必要がある可変長の引数です。引数名の前にアスタリスク(*)を二つ付けます。
関数側では定義時に付けた名前を持つ辞書型のデータとして扱い ます。
def fnc(a, b, **args):
print(a, b, args)
fnc('a', 'b', arg1='c', arg2='d', arg3='e') #a b {'arg1':'c', 'arg3':'e', 'arg2': 'd'}
●クロージャ
関数のローカル変数を参照するような関数をクロージャと言います。
「nonlocal」と言うキーワードを変数に付けると一つ外側のスコープに属する変数への代入が可能となるため、これを利用します。
def counter():
count = 0
def inner_counter():
nonlocal count
count += 1
return count
return inner_counter
cnt = counter()
print(cnt()) #1
print(cnt()) #2
print(cnt()) #3
●モジュール追加(機能拡張) import
標準ライブラリや外部ライブラリをインポートする際に使用します。
import モジュール名 as 読み替え文字
モジュール名.関数名()
from モジュール名 import 関数名
関数名()
import glob #globモジュールの機能を使う
import time #timeモジュールの機能を使う
files = glob.glob('*') #現在のディレクトリのファイルとディレクトリをすべて取得
for f in files:
print(f)
time.sleep(1) #1秒待機
・メジャーな標準ライブラリ
tkinter GUIアプリケーション作成
pathlib ファイルやフォルダの操作
datetime 日時を扱う
random 乱数を作成
json Webで用いられるJSON形式データを扱う
math 三角関数や数値計算用の関数群
・外部ライブラリをWeb上のPyPIからダウンロードして使う場合は、pipコマンドで簡単にインストールができます。
pip install モジュール 名 #インストール
pip uninstall モジュール 名 #アン インストール
pip show モジュール 名 #詳細確認
pip list #インストール済みモジュールの確認
●メソッド
変数または値.メソッド名(引数1, 引数2, 引数3, ...)
メソッドの種類はデータ型で異なります。
リスト型 append()、pop()、extend()、sort()など
ディクショナリ型 get()、pop()、update()、items()など
'abcd'.upper() #大文字ABCD変換
'ABCD'.lower() #小文字abcd変換
'abcd'.find("bc") #bcの位置1を返す
'ab'join('cd') #cd追加
'abcgef'.replace('g', 'd') #gをdに置き換え
'abc,def'.split(',') #,で区切りリスト出力します
●入力 input
引数があれば、標準出力にそれを出力します。その後、入力から1行を読み込んで返します。
str = input('何か入力してください: ')
●出力 print
print(1,2) #1 2を表示
print(a,b,sep=',') #カンマ区切りで表示(デフォルトは空白)
print(a,b,end='--') #末尾に--を表示(デフォルトは改行)
●書式指定 format
'{置換フィールド:書式}'.format(引数)
置換フィールドは引数の要素番号か変数名を指定し、書式では表示桁数などの書式を指定します。
・書式
s 文字列の表示(省略時)
b 2進数表示
c 文字コードによる1文字表示
d 10進数表示(省略時)
x 16進数表示
, カンマで3桁区切り
f 小数点数表記(デフォルト精度6桁)
e 指数表記(デフォルト精度6桁)
g 桁に応じてfもしくはe
% fで100倍したパーセント表記
print('{:5}'.format('abc')) #表示幅5の左詰めでabc
print('{1:6.2f} {0:}'.format(123,12.345)) #12.34 123
●ファイル操作
ファイルの操作には「open」関数を使用します。引数にはファイルパス、モード、エンコード種類を指定します。
r | 読み込みモード(デフォルト) |
w | 書き込みモード(既にファイルがあるときは内容が全て削除される) |
x | 排他生成モード(既にファイルがあるときにはエラーとなる) |
a | 追記モード(ファイルがなければ新規に作成する) |
b | バイナリモード |
t | テキストモード(デフォルト) |
+ | 更新用にオープン。'r'、'w'、'a'と一緒に指定する必要がある |
モードの値は「rt」や「r+」 のように続けて記述可能です。
f = open('sample.txt', 'r', encoding='utf-8')
print(f.readlines()) #1行読み込み
f.close()
f = open('sample.txt', 'w', encoding='utf-8')
f.write('abcdef\n') #書き込み
print('hogefuga', file=f) #printでも書き込み可
f.close() #クローズするとファイルに内容が書き込まれる
.read() #すべての内容を読み込みむ
.readlines #ファイルの内容を全て読み込んで、各行を要素とするリストを作成する
os.getcwd() #カレントディレクトリの取得
os.chdir() #カレントディレクトリの移動
__file__ #実行中スクリプトのファイルパス
os.path.basename(__file__) #実行中スクリプトのファイル名
os.path.dirname(__file__) #実行中スクリプトのディレクトリ名
さらに標準モジュール pathlib を使用することで様々な操作ができます。
●例外処理
例外のハンドリングは「try ~ except ~ else ~ finally」と言う構文で行います。
また、明示的に例外を発生させるには「raise」を使用します。
try:
x = 10 / 0
except Exception as e:
print(e) #division by zero
else:
#例外が発生しなかっ た場合の処理
print('hoge')
finally:
#例外発生有無に関係なく最後に実行する処理
print(' fuga') #fuga
●クラス class
クラスとは、オブジェクトを生成するうえで使われる"型"のようなものです。
このクラス(型)からインスタンスを生成し処理を行います。
クラスの作り方は、"class"キーワードの後に任意のクラス名を書き、その下にメソッドや変数を書いていくことで作られます。
メソッドとは、ある処理のまとまりに名前をつけたものの事です。"def"キーワードの後に任意のメソッド名を入れ、そこに引数を与えます。
コンストラクタとは、インスタンスを生成した際にまず自動的に呼び出すメソッドの事です。クラスの初期設定などを行うためのメソッドになります。
インスタンスとは、型となるクラスを元に生成した実体を言います。よく「クラスは設計図、インスタンスは設計図から作られた物」と例えられています。
実際の処理では、インスタンスを生成する事によってそのクラス内の処理を実行できるようになります。
class Member:
LANG = 'JP' #プロパティとして値をセット
def __init__(self): #コンストラクタ
self.name = ''
def __del__(self): #デストラクタ (インスタンスを破棄した場合に処理)
print(self.name + 'を削除しました')
def setName(self, name): #セッタ
self.name = name
def getName(self): #ゲッタ
return self.name
taro = Member() #インスタンス生成
taro.setName('太郎') #データセット
print(taro.getName(), taro.LANG) #太郎 JP
john = Member()
john.setName('ジョン')
john.LANG = 'US'
print(john.getName(), john.LANG) #ジョン US
taro = None #太郎を削除しました
class myprint():
def print(self):
print("Hello World!")
hello = myprint() #インスタンス生成
hello.print() #Hello World!
class calc:
def __init__(self): #引数ない場合に処理
self.a = 0
self.b = 0
def __init__(self, a, b): #引数ある場合に処理
self.a = a
self.b = b
def sum(self):
self.sum = self.a + self.b
return self.sum
ins = calc(2,3) #インスタンスを生成し、コンストラクタに引数を渡します
print(ins.sum()) #5
●継承
継承とは、既存のクラスからメソッドを追加・削除したり一部だけを上書き(オーバーライド)して、新たなクラスを定義します。
継承を活用する事で、よりコンパクトなプログラムが書けるようになります。
class calc():
def __init__(self, a, b):
self.a = a
self.b = b
def sum(self):
return self.a + self.b
class totalCalc(calc): #calcから継承
def __init__(self):
super().__init__(0, 0) #calcコンストラクタを呼び出す
self.c = 0
def set(self, a, b): #セッタ追加
self.a = a
self.b = b
def sum(self): #sumを上書き
self.c += super().sum() #calcメソッド実行し計算
return self.c
data = totalCalc() #インスタンス生成
data.set(1, 2) #データセット
print(data.sum()) #3
print(data.sum()) #6
●GUIアプリケーション作成
代表的なライブラリは下記になります。用途によって使い分けができます。
・tkinter
標準モジュールにて環境構築が楽でWeb上にも多くの情報やサンプルがあります。
import tkinter as tk
from tkinter import ttk #機能拡張時
tkとttkで使用可 | tkで使用可 | ttkで使用可 |
Button Checkbutton Entry Frame Label LabelFrame Menubutton PanedWindow RadioButton Scale Scrollbar Spinbox |
Canvas Listbox Menu Message |
Combobox Notebook Progressbar Separator SizeGrip Treeview |
・kivy
Android、iOSなどにも対応した画面を生成できます。
機能も豊富でopenGLを使った3Dグラフィクスライブラリなどを使って簡単なゲームなどを作成することも可能です。
また、画面レイアウトファイル(.kv)とPythonコードを別々に記述をすることもできます。
・PySimpleGui
名前の通りもっとも簡単に画面作成ができる。150種類以上もの画面テーマを選択でき、行単位にコンポーネントを配置していくイメージです。
スマホ用 Pydroid3 にも対応しています。
・Flet
モダンなデザインをデフォルトで使用でき記述も簡素化されているため、初心者でも見栄えのいい画面を作成できます。
また、Webアプリとしてブラウザでも起動ができます。
●APKファイルの生成 Buildozer
kivy等で作成したPythonプログラムをAndroidスマホアプリにするライブラリです。
また、iOSアプリを作成する場合には、Xcodeを使用します。
●Webアプリケーション
Flask | 小規模Webアプリに適し比較的簡単に記述できる。 |
Djnago | 大規模Webアプリが作成でき、標準で高度な機能が使える。 |
streamlit | Pythonコードのみで簡単に動的なページが作成でき、ウェジットも豊富に用意されている。 |
その他にpyramid、bottleなどがあります。
●Webスクレイピング
Weブラウザを自動で操作して情報の取得等を行うことができます。
RequestsやSeleniumなどが有名です。
●操作の自動化
PyAutoGUI | マウス・キーボード入力自動化します。 |
openpyxl、xlwt/xlrd | Excelファイルを読み書きしたり操作できます。標準ライブラリのPandasなどもあります。 |
Selenium | Webブラウザを操作できます。別途、ブラウザに対応するドライバーソフトのインストールが必要。 |
●シリアル通信 pyserial
pip install pyserialにてライブラリをインストールします。
import serial
ser = serial.Serial('COM1', 9600) #シリアルポートオープン
ser.write(b'Hello World') #データ出力
c = ser.read(11) #データ入力
print(c)
ser.close() #シリアルポートクローズ