2022.6 出前講義 佐屋高校 Python入門
実行環境 IDLE 内容 ガチャガチャのシミュレーション タートルグラフィックス
名古屋文理大学 2020年度 1年次開講科目 プログラミング入門 第9回
実行環境 Blender bpy Script 内容 3DCG
卒業研究
実行環境 Google Colaboratory 内容 テキスト処理・情報の可視化
実行環境 Anaconda 内容 物体識別の機械学習
Webシステム開発(七夕短冊投稿 , 動画配信サービス)
実行環境 Django
SNS(Discord)のBot制作
実行環境 ideone.com 内容 総当りで解を検索
ポーズとアニメーションの作成
ポーズをマウスでピクトを動かしてプログラムする。
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)
数値計算と表示
数値計算
整数型 Int 多倍長整数
浮動小数点数型 float
print(111111111*111111111)
print(111111111.0*111111111)
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'))
リストの集計とグラフ表示
リスト処理の例
空のリスト [] に 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)
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)