LogoMark.png

データサイエンス/06 のバックアップ(No.15)


第6回 Python プログラミング2

データサイエンス/2024受講生一覧汎用シート

CONTENTS




はじめに

前回の復習

Total_ChatGPT.jpg

前回、コードの書き方の事例として挙げた「1から100までの整数の総和を求めるプログラム」について、ChatGPTにも聞いてみました。解説つきで回答してくれました。


プログラミングスキルの向上に向けて

ChatGPT等の生成系AIの登場によって、Web上の参考事例を探す手間は大幅に削減されましたが、AI の登場でプログラマが不要になるわけではありません。何がしたいのかを正確に指示すること、また、生成されたコードが正しいかどうかを見極めるだけのスキルがなければ、結局そのコードは利用できません。AI によって生産性を上げられるのは、結局(マニュアルを見ながら)コードが書ける人だけです。プログラミングには大きな学習コストがかかりますが、少しづつでいいので、逃げずに取り組むことを推奨します。




Pythonプログラミングの具体例

モジュールの import について

Python には、様々な既存の機能が「ライブラリ」というかたちで用意されています。例えば、乱数を発生する機能もその一つで、みなさんがその機能を実現させるためのコードを一から書く必要はありません。

import math        # 数学関数を利用する場合に読み込みます。
import random    # 乱数を利用する場合に読み込みます。




演習6:MonteCarloMethod

モンテカルロ法とは

計算機を使った数値計算手法の一つで、乱数を用いた試行を繰り返すことによって確率論的に近似的に求める解を得る手法です。名称の由来はカジノで有名なモナコ公国のモンテカルロ地区・・と言われています。

円周率 π の値を求めるプログラム

大量の乱数データから、円周率 π の近似値を統計的に求める手法・・・

Montecarlo_pi2.PNG

Wikimediacommons File:Montecarlo pi2.PNG

開発準備

ソースコード

以下のコードをまるごとコードセルにコピー&ペーストして下さい。

# ライブラリの読み込み
import math
import random 

# 初期化
n = 1000
cnt_in = 0
cnt_out = 0

# シミュレーション
for i in range(n):
  # 0.0 - 1.0 のランダムな「雨粒」
  x = random.random()
  y = random.random()
  # 4分円の中に落ちた数をカウント
  r = math.sqrt(x**2 + y**2)
  if r <= 1.0:
      cnt_in += 1
  else:
      cnt_out += 1

# 円周率の近似値
Pi = cnt_in / n * 4 

# 結果の表示
print("Num:", n)
print("IN:", cnt_in)
print("OUT:", cnt_out)
print("Pi:", Pi)


実行

学科サイトにリンク掲載

「モンテカルロ法で π の近似値を求める」プログラムのノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。

関数について

プログラムの基本は 入力 > 処理 > 出力 です。プログラムのことを関数と呼ぶことがありますが、関数は英語で function つまり「何らかの機能を持ったもの」という意味で、世の中のあらゆるアプリケーションは、function の集合体と捉えることができます。

中学・高校の数学で登場する「関数」を思い出して下さい。例えば・・

y = 2x + 1 ・・・ y = f ( x ) と書いたりします  

は、入力データ x を受け入れて、これに処理 f ( ) つまり「2倍して1加える」を施して、その結果を y として返す・・・つまり、入力>処理>出力の機能を数式で表現したものと言えます。

データサイエンスの演習では、その大半理を、各種ライブラリーに定義された関数を利用するだけで実現させていますが、自分自身でオリジナルの関数を作って利用することもできます。以下のように記述します。

# 自作関数の定義
def myFunc(x):  # 入力:引数(ひきすう)として x を受け取る
  y = 2*x+1        # 処理
  return y           # 出力:戻り値として y を返す

# 自作関数を利用したプログラム
s = input("数を入力して下さい >>>")   # 入力
x = float(s)                                             # 処理(文字列を数値に変換)
y = myFunc(x)                                       # 処理(計算)
print("計算結果:", y)                            # 出力

--- 実行結果 ---
数字を入力して下さい >>> 2.5
計算結果: 6

この事例は、演習の最初に作成した PythonBasics.ipnbに追記しておくことをおすすめします。
def は define(定義)という意味の英語の略です。

付記
プログラマーは、世界のあらゆる現象を関数(入力・処理・出力)として捉える思考を身につけることで、問題を効率的に解決しています。プログラミング教育の目的は、特定の言語によるコーディングの技術を身につけることではなく、プログラマー的思考を身につけることにあります。




オブジェクト指向プログラミングについて

データの集合体(プロパティ)と、それを操作する手続き(メソッド)を、ひとまとめにしたものをオブジェクトと言います。オブジェクト指向プログラミング(OOP)とは、このオブジェクトを要素単位として、それらの関係を記述するプログラミング手法です。

プロパティやメソッドを利用する際は、以下のように [ . ] 接続で記述します。

ObjectOrientedProgramming



APPENDIX|プログラミングとデザイン思考

オブジェクト指向と現代社会

人間と道具は「共進化」するものです。今日の社会は、オブジェクト指向でプログラミングされたアプリケーションがその基盤を支えていることから、私たち自身、日常の様々な手続きや情報交換を通して、無意識のうちに、その思考的枠組の影響を受けていると言えます。逆に言えば、それを意識化することができれば、我々をとりまく社会システムをクリアに捉えることができます。
 

コンピュータの設計と人間の活動は、共に進化しなければならない

Apple Computer, 1987, Human Interface Guidelines
 

道具の使い方を学ぶことが私たち自身を変える・・
という点に人間と道具の関係の本質がある。

アラン・ケイ, 1994, 人間のためのコンピュータ, Addison Wesley Publisher JP

従来型のプログラミングとオブジェクト指向の違い

従来の「手続き型プログラミング」では、「データ」と「処理」はバラバラに捉えられていて、プログラマーは、処理を担う「関数(引数>処理>戻り値)」を、いかに独立性の高いものに仕立てるか・・ということに関心を集中させていましたが、機能、手続きを中心に構成されたプログラムには、以下のような問題がありました。

オブジェクト指向プログラミングでは「データ(プロパティ)」と「処理(メソッド)」をセットにした「オブジェクト」を構成単位と見なすとともに「オブジェクトのデータは、オブジェクトが持つメソッドによって処理される」と考えることで、プログラマーは、それがいかに単品としてうまく動くかということに専念できるようになりました。これは、画期的な意識改革です。

オブジェクトを具体的な「モノ・コト」に例えみましょう。例えば「車」は以下のようなデータと処理機能を持ったオブジェクトであると言えます。

我々が使っている自然言語で例えると・・・

身近な事例をオブジェクト指向で記述すると・・

ObjectOrientedProgramming