if 文や for 文などの制御では複合文の記載が必要になります。JavaScript や PHP では { から } までが複合文が書かれる「ブロック」となりますが、Pythonでは、囲み記号を使わず、同じインデント(字下げ)がなされている文をブロックとして扱います。
if 条件式: ブロック内の処理1 ブロック内の処理2
インデントの位置をさらにずらすことでブロックの「入れ子」が実現します。
if 条件式: ブロック内の処理1 ブロック内の処理2 if 条件式: ブロック内の処理1 ブロック内の処理2
Python でよく用いる比較演算子は以下。結果は True または False です。
演算子 | 意味 |
x == y | x と y が等しい |
x != y | x と y が等しくない |
x > y | x は y よりも大きい |
x < y | x は y よりも小さい |
x >= y | x は y と等しいか大きい |
x <= y | x は y と等しいか小さい |
if 条件式1: 条件式1が真の時に実行する文 ... elif 条件式2: 条件式1が偽で条件式2が真の時に実行する文 ... else: すべての条件式が偽のときに実行する文 ...
for 変数 in イテラブルオブジェクト: 実行する文 1 実行する文 2 実行する文 3
x = [ "Orange", "Apple", "Lemon" ] for val in x: print( val ) Orange Apple Lemon
for i in range(10): print( i ) 0 1 :
while 条件式: 条件式が真の時に実行する文1 条件式が真の時に実行する文2 条件式が真の時に実行する文3
n = 0 while n < 6: print( "n = " + str( n ) ) n += 1 n = 1 n = 2 n = 3 n = 4 n = 5
Python には、様々な既存の機能が「ライブラリ」というかたちで用意されています。例えば、乱数を発生する機能もその一つで、みなさんがその機能を実現させるためのコードを一から書く必要はありません。
import math # 数学関数を利用する場合に読み込みます。 import random # 乱数を利用する場合に読み込みます。
計算機を使った数値計算手法の一つで、乱数を用いた試行を繰り返すことによって確率論的に近似的に求める解を得る手法です。名称の由来はカジノで有名なモナコ公国のモンテカルロ地区・・と言われています。
Wikimediacommons File:Montecarlo pi2.PNG
Q = π*r*r / 4 S = r*r よって、Q / S = ( π*r*r / 4 ) / ( r*r ) = π/4
π = Q / S * 4
正方形全体に降る雨粒の数:4分円の中に降る雨粒の数 ≒ S:Qとなり、雨粒の数が多くなれば、S:Q の比率に一致します。
π = 4分円の中に降る雨粒の数 / 正方形全体に降る雨粒の数 * 4というかたちで、π の近似値を求めることができます。
以下のコードをまるごとコードセルにコピー&ペーストして下さい。
# ライブラリの読み込み 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)
「モンテカルロ法で π の近似値を求める」プログラムのノートを、学科サイトの個人ページからリンクして下さい。以下、手順です。
このリンクを知っているインターネット上の全員が閲覧できます。
-[[MonteCarloMethod>https://colab.research.go・・=sharing]]
プログラムの基本は 入力 > 処理 > 出力 です。プログラムのことを関数と呼ぶことがありますが、関数は英語で 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)とは、このオブジェクトを要素単位として、それらの関係を記述するプログラミング手法です。
プロパティやメソッドを利用する際は、以下のように [ . ] 接続で記述します。
人間と道具は「共進化」するものです。今日の社会は、オブジェクト指向でプログラミングされたアプリケーションがその基盤を支えていることから、私たち自身、日常の様々な手続きや情報交換を通して、無意識のうちに、その思考的枠組の影響を受けていると言えます。逆に言えば、それを意識化することができれば、我々をとりまく社会システムをクリアに捉えることができます。
コンピュータの設計と人間の活動は、共に進化しなければならない
Apple Computer, 1987, Human Interface Guidelines
道具の使い方を学ぶことが私たち自身を変える・・ という点に人間と道具の関係の本質がある。
アラン・ケイ, 1994, 人間のためのコンピュータ, Addison Wesley Publisher JP
従来の「手続き型プログラミング」では、「データ」と「処理」はバラバラに捉えられていて、プログラマーは、処理を担う「関数(引数>処理>戻り値)」を、いかに独立性の高いものに仕立てるか・・ということに関心を集中させていましたが、機能、手続きを中心に構成されたプログラムには、以下のような問題がありました。
オブジェクト指向プログラミングでは「データ(プロパティ)」と「処理(メソッド)」をセットにした「オブジェクト」を構成単位と見なすとともに「オブジェクトのデータは、オブジェクトが持つメソッドによって処理される」と考えることで、プログラマーは、それがいかに単品としてうまく動くかということに専念できるようになりました。これは、画期的な意識改革です。
オブジェクトを具体的な「モノ・コト」に例えみましょう。例えば「車」は以下のようなデータと処理機能を持ったオブジェクトであると言えます。
我々が使っている自然言語で例えると・・・