Python研修会

2022.9 済美高校


Python事例紹介


2022.6 出前講義 佐屋高校 Python入門

実行環境 IDLE 内容 ガチャガチャのシミュレーション タートルグラフィックス

インストール参考記事


名古屋文理大学 2020年度 1年次開講科目 プログラミング入門 第9回

実行環境 Blender bpy Script 内容 3DCG


卒業研究

WordCloud

実行環境 Google Colaboratory 内容 テキスト処理・情報の可視化


 機械学習メモ

実行環境 Anaconda 内容 物体識別の機械学習


Webシステム開発(七夕短冊投稿 , 動画配信サービス)

実行環境  Django


SNS(Discord)のBot制作


パズルを解く

実行環境 ideone.com 内容 総当りで解を検索

Pythonドキュメント

ガチャガチャのシミュレーションで利用するモジュールのドキュメント

randomモジュール

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)

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)