Skip to content

Instantly share code, notes, and snippets.

@takatakamanbou
Created October 19, 2020 10:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save takatakamanbou/e7cbc9df29ecc4cbc9b25bfdd5aee833 to your computer and use it in GitHub Desktop.
Save takatakamanbou/e7cbc9df29ecc4cbc9b25bfdd5aee833 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# AProg2020 ex05 Notebook その2\n",
"\n",
"AProgのページ https://www-tlab.math.ryukoku.ac.jp/wiki/?AProg/2020"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"----\n",
"## オブジェクトとしての組み込み型 (pp.152-162)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"これからここで学ぶことを掘り下げていくと,**オブジェクト指向プログラミング**というプログラミングの考え方につながっています.ただし,この授業ではそこへは向かいません.数理情報学科のみなさんは,3年前期「**グラフィックス基礎及び実習**」を履修すると, **Java言語**プログラミングを通じてオブジェクト指向プログラミング(とマウスによるボタン操作などを実現するグラフィカルユーザインタフェイス)の世界へ入っていくことができます.お楽しみに."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"「リストの中から特定の要素を探してそれが何番目にあるか調べる」という処理を考えてみましょう.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mcz = [\"れに\", \"かなこ\", \"しおり\", \"あやか\", \"ももか\"]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"「`\"しおり\"`は `mcz` の何番目の要素ですか?」みたいな.\n",
"こういう処理を何度も繰り返すのなら,今までの経験からすると,関数を定義するのが妥当そうですで.\n",
"以下は,実際にそういう機能を実現するために作った関数です.\n",
"\n",
"<font size=\"-2\">(よだんだよん)見つからなかったときの動作が気になりますか?するどいですね.教科書でもこうなってますが,おそらく後述の `index`メソッドが見つからないと ValueError を吐く,という仕様なので,それに似せてるんだと思います.</font>"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def find_index(the_list, target):\n",
" idx = 0\n",
" for item in the_list:\n",
" if target == the_list[idx]:\n",
" return idx\n",
" idx = idx+1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"使ってみましょう."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"find_index(mcz, \"しおり\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"find_index([\"ほげ\", \"ふが\", \"へな\", 4649, 5963], 4649)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"で,がんばって関数作ってみておいてなんなんですが,実は Python のリストには最初からこの関数と同様のことをする機能が備わっています.そっちを使ってみましょう."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mcz.index(\"しおり\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"[\"ほげ\", \"ふが\", \"へな\", 4649, 5963].index(4649)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"なんだか見慣れない書き方(後の方が特に)ですが,ここで使っているのは,Pythonの組み込みデータ型である**リスト型のオブジェクトに対する `index` メソッド** です...と言ってもオブジェクトとかメソッドとか,まだわけわかめですね.ちょっとずつ理解していきましょう."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"C言語のような言語では,「データ」とそれに対する「処理の手続き」は完全に分かれています.\n",
"データは「変数」などに格納し,それに対する処理の手続きは命令を並べて表現します.処理の手続きは「関数」としてまとめることもあります."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"一方,**オブジェクト指向**と呼ばれるスタイルのプログラミング言語では,「データ」とそれに対する「処理」を関連付けて考えます.「データ」とそれに対する「処理」をひとまとめにした「もの」(**オブジェクト**, object)として扱うので,オブジェクト指向といいます. Python もオブジェクト指向のプログラミング言語です(純粋なオブジェクト指向言語とは言い難いのですが).\n",
"\n",
"上記の変数 `mcz` や `[\"ほげ\", \"ふが\", \"へな\", 4649, 5963]` は,どちらもリストを表している,「リスト型のオブジェクト」です.リスト型のオブジェクトには,単にデータが格納されているだけでなく,それ自身を扱う処理の手続きがいろいろ備わっています.オブジェクトに備わった処理の手続きを**メソッド**(method)といいます.\n",
"\n",
"メソッドは,データに対する処理の手続きを表しており,呼び出して使う,という意味では関数と似てます.\n",
"しかし,使い方がまるで違い,\n",
"```\n",
"「オブジェクト」.「メソッド名」(引数...)\n",
"```\n",
"という形をとります.\n",
"以下の例では,リスト型のデータを格納した `mcz` という「オブジェクト」の `index` という「メソッド」を,「引数」に `\"しおり\"` を渡して呼び出しています."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mcz.index(\"しおり\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"この `index` メソッドはリスト型のオブジェクトに備わったものですので,リストを変数に格納せず直接呼び出しても構いません.\n",
"だからこんな書き方もできちゃうわけです."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"[\"ほげ\", \"ふが\", \"へな\", 4649, 5963].index(4649)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"次は,リスト型オブジェクトの`reverse`メソッドの使用例です."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"mcz.reverse()\n",
"print(mcz)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"実行結果から分かるように,`mcz`の要素が逆順になっています.このメソッドはオブジェクト自身に作用して内容を変更していることがわかりますね.このセルをもう一度実行すると元に戻ります."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"このように,Python では,**リスト**,**文字列**,**ディクショナリ**などの標準で用意されたデータ型(**組み込み型**)に様々なメソッドが用意されており,それらを使うだけで複雑な処理を実現できるようになっています.\n",
"教科書の Chapter04 や Python のオンラインリファレンス( https://docs.python.jp/3/library/stdtypes.html )を見ると,そういうものが山ほどあるのがわかります.しかし,これらを全部覚えるなんてことはしなくて結構です.\n",
"必要になるたびに教科書やオンラインリファレンスを参照して,そこに記された説明をもとに使ってみる,というのが正しい姿と言ってよいでしょう."
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
},
"toc": {
"base_numbering": 1,
"nav_menu": {
"height": "146px",
"width": "258px"
},
"number_sections": false,
"sideBar": true,
"skip_h1_title": true,
"title_cell": "目次",
"title_sidebar": "Contents",
"toc_cell": true,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment