Python
公式サイトから最新のインストーラーをダウンロードして実行します。
Webサイトのメニュー「Download」からダウンロードします。
インストール時に環境変数へパスを追加するため「Add python.ext to PATH」にチェックしてから「Install Now」をクリックします。
インストール後にコマンドプロンプトにて「python --version」と入力し、バージョン情報が表示されればOKです。
Python開発環境をインストールしていないPCでもexe化を行うことで実行することができます。
様々なライブラリがあり、以下がメジャーなものになります。
exe化する際は、現在のPython環境をそのまま圧縮して作成されるため、不要なライブラリなども含まれ肥大化する。
仮想環境などから必要なライブラリのみをインストールして作成したほうがよい。
PyInstaller
一般的に使用されるツールだが、ファイルサイズが大きくexe実行時も起動が遅い。(圧縮データを展開しているため)
- コマンドプロンプトから下記コマンドを実行しインストールします。
pip install pyinstaller
※ウィルス脅威でブロックされるためDefenderでの許可が必要です。
- Pythonファイルをexeファイルに変換する際は、下記コマンドのように入力します。
pyinstaller --onefile ファイル名.py
buildフォルダ、distフォルダ、.specというファイルが作成されます。
distフォルダ内にexeファイルが作成されています。
- PyInstallerオプション
--onedir(-Dでも可) 出力を1ディレクトリにまとめる。起動が高速になる。
--onefile(-Fでも可) 出力ファイルを圧縮して1つにまとめる。起動が遅い。ウイルス判定されやすい。
--noconsole(-wでも可) コンソール画面を表示しない。
--clean ビルド前に前回のキャッシュ、出力ディレクトリを削除します。
--icon=ファイル名.ico アイコンを変更します。
Nuitka
生成されるexeファイルが PyInstaller に比べ小さくなり、C言語に変換するため実行速度も高速である。
- コマンドプロンプトから下記コマンドを実行しインストールします。
pip install nuitka zstandard
- Pythonファイルをexeファイルに変換する際は、下記コマンドのように入力します。
nuitka --follow-imports --onefile ファイル名.py
ビルド時に作業フォルダとexeファイルが作成されます。
初回実行時は必要なファイルをダウンロードするか聞かれるためYesを入力する。
- nuitkaオプション
--follow-imports インポートしているファイルを解析してビルド対象に入れる。
--onefile 圧縮してまとめます。standaloneオプションも実行されます。ウイルス判定されやすい。
--standalone Python実行環境もあわせて出力されインストールが不要になります。
--enable-plugin=tk-inter Tkinterなど実行時にDLLファイルが必要なパッケージを指定します。
--windows-icon-from-ico="*.ico” アイコンファイルを指定する。
--windows-disable-console コンソール画面を出さない。
--include-data-files 任意のファイルを取り込むことが可能です。
その他ライブラリ
py2exe、cx_Freezeなどがあります。
exe化したファイルに引数を与えるには
コードの中に以下を加えると可能になる。
import sys
image_path = ' '.join(sys.argv[1:])
Pythonプログラミング
- マルチステートメント
1行に複数処理を記述する場合は「:」で区切る。
処理を複数行に跨いで記述する場合は、行末に「\」(バックスラッシュ)を付ける。
- コメント、ヒアドキュメント
#1行コメント
'''複数行コメント''' """複数行コメント"""
複数行の文字列を扱う場合も'''複数行文字''' """複数行文字"""
- 条件処理およびループ処理の範囲(ブロック)
インデント(字下げ)した範囲となり、一般的には4個のスペースで行う。
変数名は、アンダーバーを含む英数字、先頭に数字は使えない、大文字と小文字は区別される、2バイト文字も使用が可能です。
定数の場合は、慣例として全て大文字で定義します。
データ型は代入された値により決定されます。型宣言する場合は、変数名の後ろに: strなどと型を指定します。
str、int、float、bool、list[int]、tuple[int]、dict[str, int]、
None、any任意の型、Unionいずれかの型、Optionalなどがある。
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を削除
val: int = 10 #型宣言して代入
- 数値
整数:扱える数値の範囲に制限がなく、メモリが許す限りの桁数を扱うことができる。
実数:倍精度(double)変数と同じ、±2.3E-308~±1.7E+308の範囲で有効桁数は約15桁。
複素数:数値に添え字「j」を付けると複素数リテラルとして扱われます。
abs() 数の絶対値を返します。
int() 数値または文字列から作成された整数オブジェクトを返します。
float() 数または文字列から生成された浮動小数点数を返します。
complex() 文字列や数を複素数に変換します。
floor()、ceil()、round() 切り捨て、切り上げ、四捨五入します。
- 真偽値
Falseは「0」、True は「1」として定義されています。
先頭を大文字にしないと真偽値として認識されないので注意してください。
bool() 真理値判定手続きに基づいてTrueかFalseを返します。
- バイト
先頭にbまたはBを付けます。
bytes = b'ABC' #b'\x41\x42\x43'
val = 1024
print(val.to_bytes(3, byteorder='big')) #3バイト、リトルエンディアンで変換 b'\x00\x04\x00'
print(int.from_bytes(bytes_data, byteorder='big')) #ビッグエンディアンで整数化
bytes() byte配列を返します。
下記の関数を使ってデータ型を知ることができます。
type(a)#データ型
id(a)#識別値
'abc'や"abc"のようにシングルクオート「'」または、ダブルクオート「"」で囲って指定する。
エスケープシーケンス \'、\"、\t、\\、\n、\r、\0、\f、\o(8進数文字)、\x(16進数文字)、\u(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になる
・主なメソッド
.upper() 大文字に変換
.lower() 小文字に変換
.find(文字列) 文字列の位置を返す
.join(文字列) 文字列を追加
.replace(検索文字列, 置換文字列) 文字列を置き換え
.split(区切り文字) 区切り文字にてリスト出力します
・主な関数
str() 引数の文字列を返します
len() 文字数を取得する
chr() Unicode値から文字を返します
ord() 文字のUnicode値を返します
bin() 整数を2進数文字列に変換します
oct() 整数を8進数文字列に変換します
hex() 整数を16進数文字列に変換します
format() 第一引数の文字列を、第二引数のテンプレートでフォーマットした文字列を返します
- リスト
一般的な配列と同様で値や要素数を変えることができます。また、リスト内のデータ型は一致している必要はありません。
リストを別のリストへ代入すると値の領域を共有することになり、一方のリストで値を変更すると、もう一方のリストの値も変更されます。
ary = ['A','B','C','D','E','F','G']
print(ary[0]) #A
for i in ary[2:5]:
print(i) #C、D、E ※最後5番の要素は含まれない
ary = ['a', 'b', 'c'] + [1, 2, 3] #結合が可能
l = len(ary) #要素数
ary = [['a', 'b'], ['c', 'd'], ['e', 'f']] #多次元 ary[0][1] はb
ary2 = ary1[:] #別のリストとしてコピーします。
a, b, c = [1, 2, 3] #複数の変数にアンパック
・主なメソッド
.append()要素追加
.insert()指定位置に要素挿入
.extend()リストを追加
.remove()指定値の要素削除
.pop()指定位置の要素削除
.clear()全ての要素削除、
.index()指定値の要素インデックス
.count()指定値の要素個数
.sort()要素を昇順に
.reverse()要素を降順に
.copy()リストをコピー
・主な関数
len() 要素数を取得する。
max() 最大の要素、または2つ以上の引数の中で最大のものを返します。
min() 最小の要素、または2つ以上の引数の中で最小のものを返します。
sorted() 要素を並べ替えた新たなリストを返します。
sum() 要素の総和を返します。
range([開始値,] 終了値 [, 増減量]) 連続した数値が含まれるリスト
- タプル
要素を変更されたくない場合に使用します。要素の値や順序、追加や削除などはできません。
tuple1 = (0,1,2)
tuple2 = (1,) #値が一つの場合はカンマを追加
メソッドには、count()、index()が使用できます。
- ディクショナリ
連想配列に似た型でキーと値を指定する。キーには連続でない整数値や文字列を使用できます。
d = {'key1':0,'key2':1,'key3':2,}
print(d['key2']) #1
dic = dict(one=1, two=2, three=3) #dict関数の場合、 キー名をクォートで括らない。
b = d.copy() #別のディクショナリとしてコピーします。
メソッドには、keys()キーのリストを返す、values()値のリストを返す、items(): 辞書のキーと値のペアをタプルで返す、
get()、pop()、popitem()、update()、copy()、fromkeys()、setdefault()、clear()などがあります。
- 集合
重複した値を持たず順番がないデータの集まりです。
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'}
変数や関数などの有効範囲で大きく3種類に分けられます。
変数は原則として、関数の内部で定義された場合は関数の外部からアクセスすることはできません。
また、関数の外側にある変数へアクセスする場合、参照のみ可能になります。
ただし、global 宣言や nonlocal 宣言をすることでスコープの制限を変更できます。
- グローバルスコープ
モジュール内での最上位のスコープです。ファイル内全体で使用することができます。
ローカルスコープ内では参照のみ可能で、値を代入する場合はglobal宣言をしてから使用します。
- ローカルスコープ
定義した関数内のスコープです。他のスコープから参照はできません。
なお、if文やfor文などの制御文ではローカルスコープは作られません。
- ビルトインスコープ
Pythonに用意された組み込み変数や関数のスコープです。特に意識せず常に使用することができます。
var1 = 1
var2 = 2
def add(a):
global var1
var1 += a
var2 = 3
print (var1, var2) # 4,3
add(3)
print (var1, var2) # 4,2
●算術演算子
+ - * /(小数点) //(小数点切り捨て) %(余り) **(べき乗)
++aやa++などの記述はできませんが、a += 1 は可能です。
+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
str = 'de'
f"abc{str}fg" #f文字列 abcdefg
インデントされた部分が処理ブロックの範囲となります。
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 #何も処理しない
breakpoint() #python標準のデバッガを呼び出します。
例外のハンドリングは「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
●入力 input
引数があれば、標準出力にそれを出力します。その後、入力から1行を読み込んで返します。
str = input('何か入力してください: ')
●出力 print
print(1,2) #1 2を表示
print(f'計算{a}+{b}={a+b}') #書式指定
print(a,b,sep=',') #カンマ区切りで表示(デフォルトは空白)
print(a,b,end='--') #末尾に--を表示(デフォルトは改行)
ファイルの操作には「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 を使用することで様々な操作ができます。
関数の定義には「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
asyncio をインポートします。
非同期処理の関数(コルーチン)を定義するには、def の前に「async」を付けます。
エントリーポイントである main() 関数を asyncio.run にて実行します。
コルーチンが終了するまで待つ場合(一時停止など)は、await を使用します。
タスク オブジェトとして並行して実行する場合は、asyncio.create_task() を使用します。
import asyncio
async def main():
print('Hello')
await asyncio.sleep(1) # 1秒停止
print('World')
asyncio.run(main()) # 'Hello' 1秒後に 'World'
その他の asyncio が提供する主な機能には以下があります。
・asyncio.create_task() コルーチンの Task オブジェクトを返し実行します。
.cancel() タスクをキャンセルします。
.cancelled() キャンセルされた場合に True を返します。
.done() 完了していれば True を返します。
.result() 結果を返します。
.exception() 例外を返します。
・asyncio.gather() コルーチンを複数並行して実行します。
・asyncio.wait_for() 完了するかタイムアウトになるのを待ちます。
クラスとは、処理を一纏めにしたもので必要な都度インスタンス化(実体化)して使用します。
インスタンス化をすることでコンピュータのメモリ上に展開されて処理を実行できるようになります。
クラスの作り方は、"class"の後にクラス名を書き、その下に処理を記述します。
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 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 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
Pythonでの共同開発や作成したプログラムを配布したりする際、環境を分けて開発することでバージョン違いなどの依存関係によるトラブルを防げます。
仮想環境を構築するには、.venv、poetry、virtualenv などを使用します。
・.venv
- 開発用のプロジェクトフォルダー作成
任意フォルダーを作成して、カレントフォルダとして移動します。
cd C:\Users\user\development\[フォルダ名]
- フォルダに仮想環境を作成
python -m venv .venv
- 仮想環境の有効化
作成した仮想環境をアクティベート(有効化)します。※OSによってコマンドに違いがあります。
Windowsの場合、.venv\Scripts\activate
macOS/Linuxの場合、.venv/bin/activate
有効化が成功すると、コマンドラインの先頭に(venv)が表示されます。
Windowsでエラーメッセージが表示される場合、PowerShellスクリプト実行ポリシーが制限されている可能性があっります。
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
- pipなどでライブラリをインストールし環境構築
インストールしたファイル等は仮想環境内でのみ有効になります。
依存関係を記録するには、pip freeze > requirements.txt
- 仮想環境を抜けるとき
deactivate
- 仮想環境を削除するには
rm -rf venv
各種モジュールは、importで読み込みをしてから使用します。
Pythonでは、様々な外部ライブラリが有志によって公開されており、一からプログラムを作成するよりも効率的です。
ただし、外部ライブラリにはPythonのバージョンによって動作がしないものも多く注意が必要です。
・代表的な標準ライブラリ
tkinter GUIアプリケーション作成
pathlib ファイルやフォルダの操作
datetime 日時を扱う
random 乱数を作成
json Webで用いられるJSON形式データを扱う
math 三角関数や数値計算用の関数群
・pip 外部ライブラリをWeb上のPyPIからダウンロードしてインストールします。
pip install モジュール 名 #インストール
pip uninstall モジュール 名 #アン インストール
pip show モジュール 名 #詳細確認
pip list #インストール済みモジュールの確認
・import 標準モジュールや外部ライブラリをインポートする際にプログラムの最初に指定します。
import モジュール名1
import モジュール名2 as 読み替え文字
from モジュール名 import 関数名
モジュール名1.関数()
読み替え文字.関数()
関数名()
import glob #globモジュールの機能を使う
import time #timeモジュールの機能を使う
files = glob.glob('*') #現在のディレクトリのファイルとディレクトリをすべて取得
for f in files:
print(f)
time.sleep(1) #1秒待機
代表的なライブラリは下記になります。用途によって使い分けができます。
・tkinter
Python標準のGUIツールキットでインストールする必要がなく、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コードを別々に記述をすることもできます。
・TkEasyGUI
PySimpleGui(商用利用が有料化)とも互換性があり直感的にGUIを作成できます。
MITラインセンスで商用利用や再配付も可能です。
スマホ用 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() #シリアルポートクローズ