Pythonの基礎知識

ビデオチュートリアル付録1 - Python構文: https://singtown.com/learn/50061/

Pythonを使うメリット

OpenMVでは二次開発にPythonを使用できます。これにはいくつかのメリットがあります。

  • 始めやすい
  • メモリの確保や解放を意識する必要がない
  • すぐに使える多くのMicroPythonライブラリがある(PC上のPythonモジュールとは 互換性がありません)
  • 開発チームがOpenMVから呼び出せる各種アルゴリズムやモジュールを開発している

Pythonは非常によく使われる言語で、画像処理、機械学習、ネットワークプログラミングなど 幅広く使われています。また、Pythonは非常に使いやすい言語です。もし他の言語(C、C++、Java など)でのプログラミング経験があれば、より簡単に習得できるでしょう。

REPLとシリアルポート

OpenMVのIDEにはOpenMVに接続するためのシリアルポートアシスタントが付属しており、 Arduino、pyboard、esp8266などの他のシリアルポートに接続することもできます。

まず、OpenMVをIDEから切断してください。そうしないとシリアルポートが競合してしまいます!

OpenMVで Tools → Open Terminal → New Terminal を開きます

ターミナルに入力します

print("hello OpenMV!")

すると次のように表示されます

hello OpenMV!

Python構文

出力

括弧内に文字列を記述して print() を使うことで、指定したテキストを画面に出力できます。 例えば「hello, world」を出力するコードは次のようになります。

   print('hello, world')
hello, world

print() 関数は複数の文字列をカンマ「,」で区切って受け取ることもでき、その場合は それらを連結した文字列として出力されます。

  print('The quick brown fox', 'jumps over', 'the lazy dog')
The quick brown fox jumps over the lazy dog

print() は各文字列を順番に出力し、カンマ「,」に出会うとスペースが出力されるため、 出力される文字列は次のようにつなぎ合わされます。

The quick brown fox jumps over the lazy dog

print() は整数や計算結果を出力することもできます。

  print(300)
300
  print(100 + 200)
300

そのため、100 + 200 の計算結果をより見やすく出力することもできます。

   print('100 + 200 =', 100 + 200)
100 + 200 = 300

100 + 200 についてはPythonインタプリタが自動的に計算して結果300を出しますが、 '100 + 200 =' は数式ではなく文字列であり、Pythonはこれを文字列として扱うことに 注意してください。

変数

Pythonでは、イコール記号 = は代入文であり、任意のデータ型を変数に代入できます。 同じ変数に繰り返し値を代入することができ、その際に異なる型の値を代入することも できます。例えば次の通りです。

  a = 123 # aは整数
  print(a)
  a = 'ABC' # aは文字列になる
  print(a)

このように変数の型自体が固定されない言語は動的言語と呼ばれ、これに対応するものが 静的言語です。静的言語では変数を定義する際に型を指定する必要があります。代入時に型が 一致しない場合はエラーが報告されます。例えばJavaは静的言語で、代入文は次のようになります (// はコメントを示します)。

  int a = 123; // aは整数型の変数
  a = "ABC"; // エラー:文字列を整数型の変数に代入できません

静的言語と比べると、動的言語はより柔軟です。これがその理由です。

リスト

Pythonの組み込みデータ型の1つがリスト(list)です。リストは要素をいつでも追加・削除 できる順序付きのコレクションです。\ 例えば、クラス内の全生徒の名前を並べるには、リストを使って表現できます。

 classmates = ['Michael', 'Bob', 'Tracy']
 classmates
['Michael', 'Bob', 'Tracy']

変数 classmates はリストです。len() 関数を使うとリストの要素数を取得できます。

  len(classmates)
3

インデックスを使ってリスト内の各位置の要素にアクセスできます。インデックスは0から 始まることに注意してください。

 classmates[0]
'Michael'
 classmates[1]
'Bob'
 classmates[2]
'Tracy'
 classmates[3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range

インデックスが範囲外の場合、PythonはIndexErrorを報告するため、インデックスが範囲を 超えないようにする必要があります。最後の要素のインデックスは len(classmates) - 1 であることを覚えておいてください。

インデックスを計算する代わりに、最後の要素を取得したい場合は、インデックスとして -1 を使うことで直接取得できます。

  classmates[-1]
'Tracy'

同様に、後ろから2番目、3番目の要素も取得できます。

   classmates[-2]
'Bob'
   classmates[-3]
'Michael'
   classmates[-4]
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
  IndexError: list index out of range

もちろん、後ろから4番目は範囲外です。

リストは変更可能な順序付きリストなので、リストの末尾に要素を追加できます。

  classmates.append('Adam')
  classmates
  ['Michael', 'Bob', 'Tracy', 'Adam']

インデックス1のような指定した位置に要素を挿入することもできます。

  classmates.insert(1, 'Jack')
  classmates
  ['Michael', 'Jack', 'Bob', 'Tracy', 'Adam']

リストの末尾の要素を削除するには、pop() メソッドを使用します。

  classmates.pop()
  'Adam'
  classmates
  ['Michael', 'Jack', 'Bob', 'Tracy']

ある要素を別の要素に置き換えるには、対応するインデックス位置に値を直接代入します。

   classmates[1] = 'Sarah'
 classmates
  ['Michael', 'Sarah', 'Tracy']

リスト内の要素のデータ型は異なっていても構いません。例えば次の通りです。

   L = ['Apple', 123, True]

リストに要素がない場合、それは長さ0の空リストです。

 L = []

 len(L)

 0

タプル

もう1つの順序付きリストはタプル(tuple)と呼ばれます。タプルはリストによく似ていますが、 一度初期化されたタプルは変更できません。例えば、これもクラスメートの名前を並べたものです。

  classmates = ('Michael', 'Bob', 'Tracy')

このタプル classmates は変更できず、append() や insert() のようなメソッドも 持ちません。要素を取得する他の方法はリストと同じです。classmates[0] や classmates[-1] は通常通り使用できますが、他の要素に代入することはできません。

不変のタプルにはどんな意味があるのでしょうか?タプルが不変であるため、コードがより 安全になります。可能であれば、リストの代わりにタプルを使用してください。

タプルの落とし穴: タプルを定義する際、タプルの要素は定義時に確定させる必要があります。 例えば次の通りです。

  t = (1, 2)

  t

  (1, 2)

しかし、要素が1つだけのタプルを定義する場合、次のように定義すると

   t = (1)

   t

   1

これはタプルの定義にはなりません。t は整数型の変数となり、その値は1になります! これは、括弧 () が数式における括弧とタプルの両方を表すことができるため、曖昧さが 生じるためです。そのためPythonでは、この場合、数式の括弧として計算が行われ、 結果は当然1になると規定されています。

したがって、要素が1つだけのタプルを定義する際には、曖昧さを解消するためにカンマ 「,」を付ける必要があります。

   t = (1,)

   t

  (1,)

Pythonも、要素が1つだけのタプルを表示する際にカンマ「,」を付けます。これにより、 数式の意味での括弧と誤解されないようにしています。

条件判断

if文の完全な形式は次の通りです。

if <条件判断1>:
    <執行1>
elif <条件判断2>:
    <執行2>
elif <条件判断3>:
    <執行3>
else:
    <執行4>

例えば次の通りです。

age = 20
if age >= 6:
    print('teenager')
elif age >= 18:
    print('adult')
else:
    print('kid')

ループ

Pythonには2種類のループがあります。1つは for...in ループで、リストやタプル内の 各要素を順に処理します。次の例を見てください。

names = ['Michael', 'Bob', 'Tracy']
for name in names:
    print(name)

このコードを実行すると、names の各要素が順に出力されます。

  Michael
  Bob
  Tracy

このように、for x in ... ループは各要素を変数 x に代入し、インデントされたブロック内の 文を実行します。

1から100までの整数の合計を計算したい場合、1から100まで書き出すのは少し面倒です。 幸いなことにPythonには整数列を生成できる range() 関数が用意されており、list() 関数を 使ってリストに変換できます。例えば range(5) は0から始まる5未満の整数列を生成します。

  list(range(5))

  [0, 1, 2, 3, 4]

range(101) は0から100までの整数列を生成でき、計算は次のようになります。

sum = 0
for x in range(101):
    sum = sum + x
print(sum)

2つ目のループは while ループです。例えば、100以内のすべての奇数の合計を計算したい 場合、while ループを使って実装できます。

sum = 0
n = 99
while n > 0:
    sum = sum + n
    n = n - 2
print(sum)

===== データ型の変換 =====

Pythonに組み込まれている一般的な関数には、データ型を変換する関数も含まれています。 例えば int() 関数は、他のデータ型を整数に変換できます。

>>> int('123')
123
>>> int(12.34)
12
>>> float('12.34')
12.34
>>> str(1.23)
'1.23'
>>> str(100)
'100'
>>> bool(1)
True
>>> bool('')
False

===== 関数 =====

Pythonで関数を定義するには、def文を使い、関数名、括弧、括弧内の引数、コロンの順に 記述し、続いてインデントされたブロックに関数本体を記述し、return文で関数の結果を 返します。

まず、x2 を計算する関数を書いてみましょう。

def power(x):
    return x * x

power(x) 関数では、引数 x は位置引数です。

power 関数を呼び出す際は、引数 x を1つだけ渡す必要があります。

power(5)\ 25\ power(15)\ 225

では、x3 を計算したい場合はどうすればよいでしょうか?別の power3 関数を定義することも できますが、x4、x5 なども計算したい場合はどうすればよいでしょうか?無限に関数を 定義することはできません。

power(x) を power(x, n) に修正して xn を計算できるようにすることを思いついたかも しれません。早速やってみましょう。

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

この修正版の power(x, n) 関数により、n乗の任意の値を計算できます。

power(5, 2)\ 25\ power(5, 3)\ 125

修正版の power(x, n) 関数には x と n の2つの引数があります。どちらも位置引数です。 関数を呼び出す際、渡された2つの値は位置の順に引数 x と n に代入されます。

スライス

リストやタプルの一部を取り出すのは非常によく使われる操作です。例えば、次のような リストがあるとします。

L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

最初の3つの要素を1行のコードでスライスして取り出します。

L[0:3]\ ['Michael', 'Sarah', 'Tracy']

L[0:3] は、インデックス0から開始してインデックス3で終わる(ただしインデックス3自体は 含まない)ことを意味します。つまり、インデックス0、1、2のちょうど3つの要素です。

最初のインデックスが0の場合は省略できます。

L[:3]\ ['Michael', 'Sarah', 'Tracy']

インデックス1から始めて2つの要素を取り出すこともできます。

L[1:3]\ ['Sarah', 'Tracy']

タプルもリストの一種で、唯一の違いはタプルが不変であることです。そのため、タプルも スライス操作ができますが、操作結果は依然としてタプルになります。

(0, 1, 2, 3, 4, 5)[:3]\ (0, 1, 2)

文字列 'xxx' もリストとみなすことができ、各要素は1文字になります。そのため、文字列も スライス操作ができますが、操作結果は依然として文字列になります。

'ABCDEFG'[:3]\ 'ABC'

オブジェクト

Pythonはオブジェクト指向プログラミングであり、例えばLEDライトの場合は次のように なります。

from pyb import LED

red_led = LED(1)
red_led.on()

LED はクラスで、red_led はオブジェクトです。このオブジェクトに対して、点灯、消灯、 値の確認などの操作を行うことができます。

モジュール

モジュールの使い方

results matching ""

    No results matching ""