Python と C/C++
- C/C++ との比較を交えて -
ご意見・ご質問(@を半角に変換)
totomi.kuni.mahoroba.00@gmail.com
- ここでは,Windows 版の Python 3.5 に基づき,Python に対する解説を行っていきます.できる限りプログラミング言語に対する初心者でも理解できるように説明していくつもりです.また,Python のプログラムと C/C++ のプログラムとの比較も随所で行っていきます( C/C++ に対する知識がない方は適宜読み飛ばしてください).手っ取り早く Python を理解してもらうため,C/C++ との比較のため,等によって,説明が前後したり,また,同じ説明を繰り返したりする箇所も多く現れるかもしれませんが,ご容赦ください.
- Python と C/C++ の大きな違いは,Python はインタプリータ言語であり,C/C++ がコンパイラ言語である点です.インタプリータ言語においては,プログラムを 1 行ずつ解釈(機械語に翻訳)し,実行していきます.さらに,Python においては,コマンドプロンプト上で,1 行ずつキーボードから入力し,実行していくことも可能です.コンパイラ言語においては,まず,問題を解くためのアルゴリズムを考え,それを一つのまとまったプログラム(まとまった文書)として表現し,その結果をコンパイラによって機械語に翻訳し,誤りが無ければそれを実行します.例えば,「 3 + 5 」の結果を得たいような場合,Python では,コマンドプロンプト上で「 3 + 5 」と入力すれば,その結果を即座に得ることができます.つまり,電卓のような使い方も可能です.しかし,C/C++ においては,一連のプログラムを書き,コンパイルし,それを実行しなければ結果を得ることができません.いずれの言語においても,複雑な処理を必要とする場合は,そのアルゴリズムを考え,一連のプログラムを書く必要があります.Python の方が,その記述能力の高さ故に,C/C++ より簡単なプログラムで実現できる,インタプリータ言語であるが故にデバッグ(プログラムの誤りを修正すること)が容易である(?),などの利点を持っていますが,実行時間が長いという欠点があります.さらに,インタプリータ言語の一般的な特徴でもありますが,後に述べるような理由もあり,大規模なプログラムには向かないと思います.
- Python は,非常に多機能なインタプリータ言語です.「こんな事が出来れば便利だな」,「こんな機能があれば,もっと短く簡単なプログラムで実現できるのに」とかいった要求をかなり満たしてくれます.たとえ,基本的な言語仕様の中では不可能であっても,その機能を拡張することが容易であるため,多くの人が作成した機能を付加することによって,より多くのことを実現できます.
- しかし,Python の多機能性は,その長所であると共に,欠点でもあると思います.Python 自身による基本的な表現能力が他の言語と比較して大きく異なっているわけではありません.例えば,C/C++ 言語ではどうしても表現できなかったことを,Python で表現できるようになったわけではありません.しかし,Python に対する説明書を読むと,「あれもできる」「これもできる」といった多くの機能の説明が現れます.これらの説明を読んだだけで,「もう,Python とは付き合いたくない」と思う人も多いのではないでしょうか(私自身もその一人かもしれません).覚えなければならないことが多すぎます.また,マニュアル等を統一的に管理している人がいないためか,説明が分かり難すぎます.同じ名前の,同じ機能のメソッドが,場合によっては,それを利用する箇所またはモジュール毎に異なる説明が行われている点も,分かりにくさの原因の一つです.Python の設計者が(達が?),自分の好みで新しい機能を追加し,仕様を決定したと思われる箇所が多すぎます.
- また,第三者が容易に言語機能を拡張できることも問題だと思います.ある分野においては,ある拡張機能を利用しプログラムを書く,また,他の分野においては,別の拡張機能を使用してプログラムを書くといったことが起こってくるはずです.これが進展すれば,同じ分野同士の人はプログラムを通して意思疎通が可能ですが,他の分野の人とは非常に難しくなるようなことになりかねません.確かに,プログラムはコンピュータに実行させるための言語ですから,コンピュータが理解できさえすれば良いという考え方もありますが,それは間違っていると思います.少なくとも,現時点では,人間が読んで理解できることが重要だと思います.言語仕様・機能全体を,統一的に管理する必要があると思います.このまま放っておけば,異なる国の人が簡単に意思疎通をはかれない自然言語の世界のように,同じ Python で記述されていても,異なる分野の人が記述したプログラムを理解できなくなってしまいます.
- Pythn の仕様に基本的な問題があるようであれば,基本的な言語仕様を統一的に変更すべきです.例えば,拡張モジュール NumPy は,数学関係の分野で多く使用されています.配列を扱う場合,Python のリストや array モジュールを利用することができますが,実行速度や使いにくさの点から問題があります.多次元配列の処理方法を含め,NumPy の機能の一部は Python の基本的な仕様に含めるべきではないでしょうか.NumPy だけではないと思いますが,拡張モジュールと現在の Python の仕様を全体的に見直し,Python の基本仕様を統一的に再設計すべきではないでしょうか.さもないと,将来的に生き残っていくような言語にはならないと思います.
- Python の実行と基本構造
- Python の実行
- 対話モード
- ファイルの利用
- プログラム構造
- 行構造
- コメント
- 文法の基本
- データ型
- リテラル
- 文字列およびバイト列リテラル
- エスケープシーケンス
- 数値リテラル
- 変数
- 識別子(名前)
- 演算子と式
- 代入文等
- 代入文
- del 文
- import 文
- pass 文
- 数値演算
- [プログラム例 2.1] 簡単なプログラム
- [プログラム例 2.2] 複素数の計算
- 比較と論理演算
- ビット単位の演算
- 制御文
- 分岐
- 繰り返し
- [プログラム例 3.1] for 文
- with 文
- try 文
- 配列
- C/C++ における配列
- 1 次元配列
- [プログラム例 4.1] 1 次元配列(平均点以下の人数)
- 多次元配列
- [プログラム例 4.2] 2 次元配列(複数クラスの試験)
- 連想配列
- 代入と複製
- 関数
- 関数とその性質
- 定義とデフォルト引数
- 様々な引数
- [プログラム例 5.1] 様々な引数
- 引数と関数名
- [プログラム例 5.2] 引数と関数名
- 可変個の引数
- ローカル変数とグローバル変数
- ジェネレータ関数
- クラス
- クラスの定義
- 初期化
- 継承
- インスタントメソッド,クラスメソッド,スタティックメソッド
- 入出力
- 標準入出力
- ファイル入出力
- 変数の有効範囲(スコープ)
- 標準ライブラリ等
- 基本型に対する関数
- 複合データ
- シーケンス型
- 要素の参照(添え字とスライス)
- シーケンス型に共通の演算
- 変更不可能なシーケンス
- 文字列型
- タプル型( tuple 型)
- bytes 型
- 変更可能なシーケンス
- 変更可能シーケンスに固有の演算
- リスト型( list 型)
- range 型
- bytearray 型
- 集合型( set 型)
- マッピング型(辞書型)
- 組み込み関数
- 数学関係
- 数学関数
- 数学関数(複素数)
- 疑似乱数
- 数理統計関数
- 有理数
- 特殊なデータ型
- 二分法アルゴリズム
- 浅いコピーと深いコピー
- 日付と時間
- 数値配列
- NumPy( Numpy.ndarray オブジェクト )
- 配列の生成
- 配列の参照と変更
- 配列内の検索
- 配列における演算
- 配列に対するファイル入出力
- list,array,NumPy,及び,C/C++ の比較
- プログラム例 -様々な例題-
- 数値計算
- 連立線形方程式,逆行列(ガウス・ジョルダン)
- 非線形方程式(二分法)
- 非線形方程式(セカント法)
- 非線形方程式(ニュートン法)
- 代数方程式(ベアストウ)
- 行列の固有値(フレーム法+ベアストウ法)
- 実対称行列の固有値・固有ベクトル(ヤコビ法)
- 最大固有値と固有ベクトル(べき乗法)
- 数値積分(台形則)
- 数値積分(シンプソン則)
- 微分方程式(ルンゲ・クッタ)
- 補間法(ラグランジュ)
- 補間法(スプライン)
- 補間法(ベジエ曲線)
- 最適化
- 最適化(線形計画法)
- 最適化(黄金分割法)
- 最適化(多項式近似法)
- 最適化(最急降下法)
- 最適化(共役勾配法)
- 最適化( Newton 法)
- 最適化(準 Newton 法)
- 最適化(シンプレックス法)
- 最適化(動的計画法)
- 分割法( TSP )
- 逐次改善法( TSP )
- 遺伝的アルゴリズム( TSP,関数の最大値)
- 確率と統計
- ガンマ関数
- 二項分布
- ポアソン分布
- 一様分布
- 指数分布
- 正規分布
- χ2 分布
- t 分布
- F 分布
- 待ち行列
- 簡単な例
- 複雑な例
- 多変量解析
- 最小二乗法
- 重回帰分析
- 正準相関分析
- 主成分分析
- 因子分析
- クラスター分析
- 分散分析
- ニューラルネットワーク
- Hopfield ネットワーク
- パーセプトロン
- Winner-Take-All
- 競合学習
- バックプロパゲーション
- その他
- ボード線図
- ファジイ推論
- ソートと探索