Python研修会
2022.9 済美高校
Python事例紹介
2022.6 出前講義 佐屋高校 Python入門
実行環境 IDLE 内容 ガチャガチャのシミュレーション タートルグラフィックス
名古屋文理大学 2020年度 1年次開講科目 プログラミング入門 第9回
実行環境 Blender bpy Script 内容 3DCG
卒業研究
実行環境 Google Colaboratory 内容 テキスト処理・情報の可視化
実行環境 Anaconda 内容 物体識別の機械学習
Webシステム開発(七夕短冊投稿 , 動画配信サービス)
実行環境 Django
SNS(Discord)のBot制作
実行環境 ideone.com 内容 総当りで解を検索
Picthonの演習(1/4)
ポーズとアニメーションの作成
ポーズをマウスでピクトを動かしてプログラムする。
pic はピクトのオブジェクト名
RW は ローテイト&ウエイトでRWのメソッド。メソッドでオブジェクトに指示を出す。指示の内容はメソッドの引数(パラメータ)として与える。
RUA ライト・アッパー・アーム 右肩を動かして腕を操作する際に指定するキーワード
日本語で 右肩 と指示することもできる。
pic.RW("RUA", 60, 0)
pic.RW("RLA", 72, 0)
pic.RW("LLA", -39, 0)
pic.RW("LUA", -34, 0)
pic.RW("LUL", -34, 0)
pic.RW("LLL", -45, 0)
ショートカットによるコード編集
行選択 と コピペ
Shift + 矢印
Ctrl + C
Ctrl +X
Ctrl +V
各関節の動きにランダムの条件を加える
if random.random() < 0.5:
pic.RW("RUA", 60, 0)
if random.random() < 0.5:
pic.RW("RLA", 72, 0)
if random.random() < 0.5:
pic.RW("LLA", -39, 0)
if random.random() < 0.5:
pic.RW("LUA", -34, 0)
if random.random() < 0.5:
pic.RW("LUL", -34, 0)
if random.random() < 0.5:
pic.RW("LLL", -45, 0)
アニメーションの確認
RW と R
次を待たせる回転 と 回転の指示して即座に次の指示に移る回転
pic.RW("右肩", 90, 1)
pic.RW("右肩", 90, 1)
pic.RW("左肩", -45, 2)
pic.R("左股", 90, 1.5)
pic.R("右股", 90, 0.5)
往復するアクションをfor で繰り返す
W系のコマンドで待たされるコマンドの範囲を確認する
for _ in range(4):
pic.R("左肩", 90, 1)
pic.RW("左肘", 90, 1)
pic.R("左肩", -90, 1)
pic.RW("左肘", -90, 1)
for _ in range(4):
pic.R("左肩", 90, 1)
pic.RW("左肘", 90, 1)
pic.R("左肩", -90, 1)
pic.RW("左肘", -90, 1)
pic.R("右肩", 90, 1)
移動しながらのアクションをforの2重ループで表現する
for _ in range(3):
pic.M(50, 100, 1)
for _ in range(4):
pic.R("左肩", 90, 1)
pic.RW("左肘", 90, 1)
pic.R("左肩", -90, 1)
pic.RW("左肘", -90, 1)
pic.R("右肩", 90, 1)
往復しながら(元の位置に戻らず)ズレる左手 と 左手が往復する度に回転する右手
for _ in range(3):
pic.RW("右肘", 44, 0)
for _ in range(3):
pic.RW("左肘", -48, 0.2)
pic.RW("左肘", 40, 0.2)
幾つかポーズをプログラムして、関数として登録する。
リストの番号に従ってポーズを選択して踊る例。
ポーズによっては pic.C() コマンドで初期姿勢(棒立ち)に戻してからポーズを取らせるとよい。
def pose1():
pic.C()
pic.RW("LUA", -19, 0)
pic.RW("RUA", 33, 0)
def pose2():
pic.C()
pic.RW("RUA", 125, 0)
pic.RW("RUL", 35, 0)
pic.RW("RLL", -27, 0)
def pose3():
pic.SD()
def pose4():
pic.FR()
pic.RW("右股", -33, 0)
pic.RW("右膝", 23, 0)
for p in [1,2,1,2,3,1,2,1,4]:
if p == 1:
pose1()
elif p == 2:
pose2()
elif p == 3:
pose3()
else:
pose4()
pic.W(1)
Picthonの演習(2/4)
数値計算と表示
数値計算
整数型 Int 多倍長整数
浮動小数点数型 float
print(111111111*111111111)
print(111111111.0*111111111)
Picthonの演習(3/4)
randomパッケージのchoices関数によるガチャガチャのシミュレーション
choicesの引数の意味
['a','b','c'] ランダムに選択されるアイテム(文字や数値や文字列)
weights=[1,5,94] アイテムのウエイト(この例では合計100になるので、数値がそのまま選択される確率(%)になる
weights= の表記はキーワード引数というPythonの引数指定方法
k=100 アイテムのランダム選択の試行回数(復元抽出)。kはキーワード
print関数による変数の値の表示
sorted はリストを並べ替える関数
countは リスト(ここではans)に含まれる引数のアイテム(ここで文字'a')の個数を数えるメソッド(関数)
from random import choices
ans = choices(['a','b','c'],weights=[1,5,94],k=100)
print(ans)
print(sorted(ans))
print(ans.count('a'))
Picthonの演習(4/4)
リストの集計とグラフ表示
リスト処理の例
空のリスト [] に appendメソッドで forループの制御変数 i の値を加えていき、 sum関数で合計を求めて表示している。
picthonのグラフィックコマンド L で棒グラフ(太さ 4)の直線 を描画している。
太さの指示は PENWコマンドで行う。
直線は 始点(Xs,Ys)と終点(Xe,Ye)の座標を引数に与えて描画する。
pic.PENW(4)
list = []
for i in range(20):
list.append(i)
print(i,list,':',sum(list))
pic.L(-260,i*5+200, sum(list)*3-260,i*5+200)
実行環境 IDLE
Windowsパソコンでは winsoundモジュールで手軽にビープ音の出力が可能。
Beep関数の引数に
周波数 Hz 整数値
長さ ms 整数値
を与える。
以下のコードでは / で数値を割った結果( 浮動小数点数 の float型となる)をBeep関数で使うために int関数 で整数値に変換している。
import winsound
winsound.Beep(220, 500)
winsound.Beep(440, 500)
winsound.Beep(880, 500)
winsound.Beep(440*2, 500)
#winsound.Beep(440/2, 500)
winsound.Beep(int(440/2), 500)
winsound.Beep(int(440/2), 500)
winsound.Beep(440, 500)
winsound.Beep(440*2, 500)
winsound.Beep(440*4, 500)
winsound.Beep(440*8, 500)
winsound.Beep(440*16, 500)
winsound.Beep(440, 500)
winsound.Beep(440*1, 500)
winsound.Beep(440*2, 500)
winsound.Beep(440*3, 500)
winsound.Beep(440*4, 500)
winsound.Beep(440*5, 500)
for n in [220,440,880]:
winsound.Beep(n, 500)
for n in [1,2,4]:
winsound.Beep(220*n, 500)
for n in [1,2,3,4,5,6,7,8]:
winsound.Beep(220*n, 500)
12平均律
220Hz と 440Hz、440Hzと880Hzの様に周波数が2倍となる音程を1オクターブとする。
1オクターブを12個に分けてピアノ鍵盤に番号を付けると以下のようになる。
低い音の番号に+12すると1オクターブ高い音の番号となる。
各音程の周波数は
A(ラ)の周波数を440Hzとすると、p =2の12乗根 = 2^(1/12) = 1.05946309436 として
A 440 = 440*pの0乗
A# 440*p
B 440*p*p
C 440*p*p*p
C# 440*p*p*p*p
D 440*p*p*p*p*p ≒ 440*1.33 ≒ 440*4/3
D# 440*p*p*p*p*p*p
E 440*p*p*p*p*p*p*p ≒ 440*1.5 ≒ 440*3/2
F 440*p*p*p*p*p*p*p*p
F# 440*p*p*p*p*p*p*p*p*p
G 440*p*p*p*p*p*p*p*p*p*p
G# 440*p*p*p*p*p*p*p*p*p*p*p
A 440*p*p*p*p*p*p*p*p*p*p*p*p = 440*2
2の12乗根
2の2乗の様に整数の整数乗を求める場合、pythonでは pow関数や ** 演算子により
pow(2,2)
2**2
で計算できる。
ルートの計算はsqrt関数
import math
print(math.sqrt(2))
またはpow関数により
print(pow(2,1/2))
で計算できる。
2の12乗根は pow(2,1/12)となり、
pow(2,1/12)*pow(2,1/12) = pow(2,2/12)
の関係を使うと12平均律の各音程の周波数は以下の様に計算できる。
import winsound
for n in [1,2,3,4,5,6,7,8,9,10,11,12]:
winsound.Beep(int(440*pow(2,(n-1)/12)), 500)
for n in [1,3,5,6,8,10,12,13]:
winsound.Beep(int(440*pow(2,(n-1)/12)), 300)
for _ in range(3):
for n in [1,3,5]:
winsound.Beep(int(440*pow(2,(n-1)/12)), 300)
for m in range(9):
for n in [1,3,5]:
winsound.Beep(int(440*pow(2,(m+n-1)/12)), 300)
tone関数の定義
上記の計算式を利用して定義する。
import winsound
def tone(p,t):
winsound.Beep(int(440*pow(2,(p-1)/12)), t)
for p in [1,3,5]:
tone(p,300)
音符の表現
入れ子のリストを利用する。
ビープ音の ピッチ(音程)と時間 をペアにして、この順で並べたリストを音符として処理する。
例)
[1, 300]
音符を並べたリストは2重の入れ子のリストになる。
[[1,300],[3,600],[5,150]]
import winsound
def tone(p,t):
winsound.Beep(int(440*pow(2,(p-1)/12)), t)
for pt in [[1,300],[3,600],[5,150]]:
p,t = pt
tone(p,t)
for pt in [[1,300],[3,600],[5,150]]:
tone(pt[0],pt[1])
BPMの導入
BPMで演奏のテンポを指定する。
音符の長さを1秒単位にする。
音符の長さをBPMに応じて調整する。
import winsound
def tone(p,t):
winsound.Beep(int(440*pow(2,(p-1)/12)), t)
BPM = 120
for pt in [[1,2],[3,4],[5,1]]:
p,t = pt
tone(p,t*int(60/BPM*1000))
Tone関数
音程と音長を番号と秒数で指定するTone関数を定義する。
tone関数を利用して定義する。
import winsound
def tone(p,t):
winsound.Beep(int(440*pow(2,(p-1)/12)), t)
def Tone(p,t):
tone(p, t*int(60/BPM*1000))
BPM = 240
for pt in [[1,2],[3,4],[5,1]]:
p,t = pt
Tone(p,t)
休符の処理
音程の番号 0 を休符として扱うことにする。
休符の処理は、一定時間pythonの処理を止めるsleep関数をtimeモジュールをimportして利用する。
import winsound
import time
def tone(p,t):
winsound.Beep(int(440*pow(2,(p-1)/12)), t)
def Tone(p,t):
if p == 0:
time.sleep(t*60/BPM)
else:
tone(p, t*int(60/BPM*1000))
BPM = 240
for pt in [[1,2],[0,1],[3,4],[0,2],[5,1]]:
p,t = pt
Tone(p,t)
2の12乗根の別の求め方
pow関数を利用せずに指数関数 exp と対数関数 log を組み合わせてべき乗根を求める例
expとlogにはmathモジュールが必要。
以下のコードでは モジュールのimportで関数名 exp と log を指定して
モジュール名mathを省略したコードになっている。
from math import exp,log
def tone(p,t):
winsound.Beep(int(440*exp(log(2)/12*(p-1))), t)