2020-05-10 課題

自分用メモ

オブジェクトについて

今日は具体的なプログラムというより、今日のメインの話とも少し関係する形でオブジェクトについて少し眺める機会にする。

第一級のオブジェクト

第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。

問題になる例:言語によっては関数が第一級のオブジェクトになる。(最近の言語は割とこの傾向があるように思う。) 関数が第一級のオブジェクトの言語では「関数の関数」みたいな概念が考えられる。 高階関数と呼ばれる。

「関数の関数」として python の map を紹介しておく。

1
2
3
4
5
6
#リスト `lst1` の要素を二倍する
lst1 = [1, 2, 3, 4]
lst2 = []
for a in lst1:
    lst2.append(a*2)
print(lst2)
1
[2, 4, 6, 8]
1
2
3
4
5
6
7
#次のように map で書ける
def prod2(a):
    return a*2

lst1 = [1, 2, 3, 4]
lst2 = list(map(prod2, lst1)) #map はイテレーターを返すので list() でリスト化する
print(lst2)
1
[2, 4, 6, 8]
1
2
3
4
#参考:ラムダ式
lst1 = [1,2,3,4]
lst2 = list(map(lambda x: x*2, lst1))
print(lst2)
1
[2, 4, 6, 8]
1
2
3
4
#参考:リスト内法表記
lst1 = [1,2,3,4]
lst2 = [a*2 for a in lst1]
print(lst2)
1
[2, 4, 6, 8]
1
2
3
4
5
6
7
lst1 = [1,2,3,4]
lst2 = []

lst3 = [1,2,3,4]
for a in lst3:
    lst2.append(a*2)
print(lst2)
1
[2, 4, 6, 8]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
lst1 = [1,2,3,4]
lst2 = []

lst3 = [1,2,3,4]

for a in lst3:
    lst2.append(a*2)
    print("")
    print("")

print(lst2)
1
2
3
4
  File "<ipython-input-9-2e52d339fe66>", line 6
    lst2.append(a*2)
       ^
IndentationError: expected an indented block

なぜ(Python で)map の返り値がイテレーターか

オブジェクトとインスタンス

オブジェクト

だいたい次のような性質を持っています。 - 何らかの型がある。 - 変数に代入できる。 - 関数(メソッド)の引数にできる。 - 関数(メソッド)の戻り値にできる。 - それ自体が式であり、任意の式の一部になる。

インスタンス

これはオブジェクト指向だけの概念です。クラス(プロトタイプベースの場合はプロトタイプとなるオブジェクトになりますが、以下クラスとまとめて考えます)はオブジェクトの雛形です。その雛形から実際のデータをもつオブジェクトにすることを実体化(インスタンス化)と言い、そのオブジェクトはそのクラスのインスタンスと言われます。

1
2
3
import matplotlib.pyplot as plt
fig = plt.figure()
#a = A.new()

関数とメソッド

言語によっていろいろありはする。

第一級関数(だいいっきゅうかんすう、英: first-class function、ファーストクラスファンクション)とは、関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のことである。

1
2
3
4
5
6
7
8
#値を返す「関数」
def f():
    return 1

#値を返さない「関数」
def g():
    print(1)
g()
1
1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class TestClass:
    x = "変数1"

    def __init__(self, y):
        self.y = y

    def test_method1(self):
        print(self.x)

    def test_method2(self, arg1):
        print("引数1:" + arg1)

    def gety(self):
        return self.y

a = TestClass("y")
print(a.gety())

b = TestClass("b")
print(b.gety())

a.test_method1()
b.test_method1()
1
2
3
4
y
b
変数1
変数1

解答例

matplotlib

TeX でいろいろな式を書こう

1
2
3
def f():
    return {"a": "a"}
print(f().keys())
1
dict_keys(['a'])

いろいろなプログラムを書こう

numpy でのグラフ

sympy

1
2
3
4
5
#colab の場合
from IPython.display import Math, HTML
def load_mathjax_in_cell_output():
    display(HTML("<script src='https://www.gstatic.com/external_hosted/mathjax/latest/MathJax.js?config=default'></script>"))
get_ipython().events.register('pre_run_cell', load_mathjax_in_cell_output)

微分方程式