Python

▼Python開発環境インストール

▼Pythonコードのexe化


Pythonプログラミング

●基本的な文法と特徴

●変数

命名ルールについて、先頭に数字は使えない、大文字と小文字は区別される、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を削除

●データ型

数値、文字列、タプルは不変性のデータ型となり、値を変更することはできません。
ただし、数値など値が1つの場合はメモリ領域が入れ替わるため変更したのと同じような動作になる。
リストやディクショナリは可変性のデータ型にて、各要素の値を変更することができます。
あるリストを保持する変数を別の変数に代入すると、それら2つの変数は同じリストを共有することになり、一方の変数でリストの要素を変更すると、もう一方のリストの要素も変更されます。
このようなことを回避する場合は、代入ではなくコピーを使います。
a = L[:] #リストのコピー
b = d.copy() #ディクショナリのコピー

下記の関数を使ってデータ型を知ることができます。
type(a)#データ型
id(a)#識別値

●スコープ

変数や関数などの有効範囲になり、大きく3種類に分けられます。
変数は原則として、関数の内部で定義された場合は関数の外部からアクセスすることはできません。
また、関数の外側にある変数へアクセスする場合、参照のみ可能になります。
ただし、global 宣言や nonlocal 宣言をすることでスコープの制限を変更できます。

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アプリが作成でき、標準で高度な機能が使える。
streamlitPythonコードのみで簡単に動的なページが作成でき、ウェジットも豊富に用意されている。
その他にpyramid、bottleなどがあります。

●Webスクレイピング

Weブラウザを自動で操作して情報の取得等を行うことができます。
RequestsやSeleniumなどが有名です。

●操作の自動化

PyAutoGUIマウス・キーボード入力自動化します。
openpyxl、xlwt/xlrdExcelファイルを読み書きしたり操作できます。標準ライブラリのPandasなどもあります。
SeleniumWebブラウザを操作できます。別途、ブラウザに対応するドライバーソフトのインストールが必要。

●シリアル通信 pyserial

pip install pyserialにてライブラリをインストールします。

import serial
ser = serial.Serial('COM1', 9600)  #シリアルポートオープン
ser.write(b'Hello World')  #データ出力
c = ser.read(11)  #データ入力
print(c)
ser.close()  #シリアルポートクローズ


ページトップへ戻る