トップページへ戻る

わかるまで教えます パイソン講座 コツコツと一歩ずつ

健太郎先生が本気でお教えします!

訪問者数

Pythonとは?

Pythonは、1991年にオランダ出身グイド・ヴァン・ロッサム氏によって開発されたプログラミング言語です。Pythonは、人間にとって読みやすく、それでいて
効率よくコードをなるべく簡単に書けるようにという設計思想があり、Javaと同様にオブジェクト指向プログラミングをサポートしており、プログラマーが
小規模から大規模な開発プロジェクトまで、幅広く明瞭で簡潔なコードを書くことを支援するのを目的としています。
オブジェクト指向に限らず、c言語のような構造化プログラミング、PrologやLISP、Schemeといった関数型プログラミング・論理型プログラミングといった
複数のプログラミングパラダイムにも対応しています。

あと、Pythonはインタープリタ型言語に属しています。C言語やJavaやVBは、ソースコードを打ち込めば、そのままでは実行できません。
コンパイルという作業が必要になります。しかし、Pythonにはその必要はないのです。コードを打ち込んでエンターキーを押すと、コンピュータが その場で解釈して実行してくれます。

具体的にどんなものを開発できるのか?

Pythonは、AI(人工知能)開発が得意だと言われています。実際に画像認識プログラムなどは主にPythonによって開発されていることが多く、
機械学習のライブラリ、計算用のライブラリも豊富にあります。Pythonが計算機言語の一種といわれる所以の一つだと思います。
Pythonは計算したりするのが主なので、数学の知識もある程度あった方が良いと個人的には思います。あと言い忘れましたが、Pythonは
スクリプト言語とも呼ばれることがあります。あとは、人間の言葉を理解するなどしてチャットしたりといったプログラムの開発にもPythonは使われています。
言うなれば、自然言語処理技術です。 他には、ゲームの開発にもPythonは使われているようです。しかしここでは、パイソンの文法や、プログラム開発技術などに
焦点を当てるので、ゲームの開発はそれほど登場しません。プログラミングは、忍耐強さが常に付きまといます。
 そういうことをできれば皆さんに意識していただいてほしく、プログラミングを行っていただけたらと思います。当方も、
わかりやすく楽しい授業にしていきたいと考えておりますので、宜しくお願い致します。

Pythonの実行環境は?

Pythonは、ソフトウェアをインストールすることで実行できるようになります。
ここでは、詳しいインストール方法は割愛させていただきます。
※新しくインストールの説明を載せましたので御覧ください⇒説明

Pythonは、コマンドプロンプトを起動して対話的にコマンドを入力していって、逐次命令を実行させる方法と、スクリプト(コマンド定義など集まり)
ファイルをあらかじめ作っておいてそれを一括で実行させる方法があります。 まず、前者の方法ですが、Windowsコマンドプロンプトを起動して、
> Python
と打ち込みます。そうすると、Pythonのインタープリタが起動し、「>>>」というコマンドプロンプトが起動します。これがいわゆる対話モードです。
この対話モード(インタープリタ)を終了させるときには、ctrl-z、または、quit() を入力して終了します。例を示します。

入力例:コマンドプロンプトから Python と打ち込んでからの処理です

	 00 cmd> python		# プロンプト画面にて「Python」と打ち込んでエンターキー
	 01	Python 3.11.1 (tags/v3.11.1:a7a450f, Dec  6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)] on win32
	 02	Type "help", "copyright", "credits" or "license" for more information.

	 03  >>> print(3 + 5)	# 3 + 5 の計算結果の表示
	 04  8
	 05  >>> 36 + 17
	 06  53
	 07  >>> 10 + _			# 前の計算結果(_)を用いた表記
	 08  63
	 09  >>> 27 * 6 
	 10  162
	 11  >>> 66 // 7		# 66÷7の商の計算
	 12  9
	 13  >>> 50 % 7			# 50を7で割った余りを計算
	 14  1
	 15  >>> a = 13			 # a に 13 を代入
	 16  >>> if a == 13:		# 条件分岐処理
	 17  ...	print(a)		# a が 13 と等しいならば、aの表示
	 18  ...	
	 19  13
	 20  >>> 'abcde'		# 文字列 abcde を表示
	 21  'abcde'
	 22 >>> "fghij" + "klmno"	#文字列の連結(リテラルの場合は+代用で空白でも可)
	 23 'fghijklmno'
	
以上が入力例でした。電卓にように簡単に計算しているのがわかります。このようにPythonは簡単に計算ができるというのが特徴の一つです。
しかしPythonは結構多機能な言語なので、他にもまだあります。数学計算や科学技術用に特化した計算などいろいろとできます。 

Pythonのプログラムの書き方について

ここからがPythonの大事なポイントとなりますが。プログラムの書き方なのですが、Cやc++言語と異なり、フリーフォーマットで記述できません。
pythonプログラムは行単位(行頭から改行まで)で処理されます。しかし、一つの文を1行で記述できないケースもあると思います。
その場合は次のようにして、

	a = rst + uvw + xyz \
	    + aaa - bbb / ccc * ddd \
	    + xxx / yyy + zzz - vvv / 50  # ~に関する計算処理
	
とバックスラッシュ文字(\)を使用して、継続させることが可能です。(ただしコメント記号#は1,2行目には挿入できません。)
また、以下に示すように、丸括弧(),各括弧[],および波括弧{}内の式は,バックスラッシュを使用せずに複数行にわたって
記述することが可能です。この場合、各行ごとにコメント記述することも可能です。
	aaa = [1, 2, 3,    # ~コメント1
	          4, 5, 6,   # ~コメント2
	          7, 8, 9]   # ~コメント3
	
PythonにもJavaと同様に、制御構文があり、if文/while文などが存在します。
ただしPythonの制御構文は、Javaやc/c++言語のそれとは異なっていて、波括弧{}を使用しません。
以下に示すように、半角スペースもしくはTabを使用して字下げすることによって、その制御範囲を記述する
ことになります。これはwhile文などであっても同様です。このようにPythonでは強制的にインデントをするという
ことがまず重要ポイントの一つです。
	01  if 条件:
	02       a = 30
	03       b = 65
	04  else:
	05       c = 75
	06       d = 100
	
if文についてはあとで詳しく勉強しますが、上の文を見てください。この文は、条件が真であれば、02, 03行を
、偽であれば、05, 06行目を実行することを意味しています。C/C++言語のように、波括弧{}が使われていません。
しかし、文の直前にインデントがありますので、インデントされた範囲が実行されます。(while文のときも同じてす)

*コメントの記述方法について

Pythonではコメントは以下のように記述する決まりになっています。

	a = 120		# 変数aに 120 を代入
	
#から改行までは、コメントとみなされます。
また上の行は、
	# 変数aに 120 を代入
	a = 120
	
と2行に分けて書いても問題ありません。

また、Pythonでは複数行にわたるコメントを記述するための記号が存在しませんが、引用符を3つ続ける(3連引用符)を使う
ことによって、コメント記述が可能となります。
 以下に例を示します。
	"""
		コメントその1・・・
		コメントその2・・・
	"""
	
なぜこのように記述するのかという理由についてですが、Pythonでは演算を行わないで単に文字列のみを記述した場合には、その文字列
に対する処理は行われないことになっているためです。なので、上記に示したように、複数行にわたるコメントのような(的な)文字列を
記述可能になります。

リテラル・変数、演算子と式について

ここからがおそらくPythonの肝の部分になってくるように思います。計算したりするのがPythonの目的なので、これがないとPythonでは
ありませんね。まずリテラルというのは、JavaやC/c++言語などの定数に相当します。定数とは変数ではない決まった値のことです。
例:123、"SpaceColony"、'xyz'、True、9999.999、314159e-5 など

文字列リテラルとバイト列リテラル(bytes型リテラル,常にbやBが先頭に来る) は,対応する一重引用符「'」、または,二重引用符「"」で囲まれます。
Pythonにおいては、この2つの引用符は同じ意味になります。区別されません。なお、バイト列リテラルにおいては ASCII文字のみを含むことが出来ます。

	>>> "文字列"
	'文字列'
	>>> '文字列'
	'文字列'
	>>> b"abcdefg"	← バイト列リテラル
	b'abcdefg'
	>>> b"文字列"	# エラー(ASCII文字のみ対応なため)
	
文字列は、+演算子を使用して連結させることができます。あと、*演算子で反復させることが可能です。また、文字列リテラルをスペースで区切るとそれらは
自動的に連結されます。
	>>> 2 * "xyz" + "abcde" + "fghij" "klmn" "opqrs"
	'xyzxyzabcdefghijklmnopqrs'
	
複数行にわたる文字列は,対応する3連の引用符 '''、または"""で囲むことによって可能となります。
複数行にわたる文字列については例を示しませんので、各自ネットなどで調べておいてください。ご了承下さい。

行末の改行は、文字列に必ず含まれます。これを行末に \を付加することによって、改行を含まない内容にすることも可能です。 以下例を示します。
	>>> """\
	... abc\
	... def
	... ghi\
	... """
	'abcdef\nghi'
	
出力結果の \n は改行を表しています。結果を見ると、defのところ以外は改行が出力されていないのがわかると思います。(\で改行出力を抑制しているため)
結果文字列の中にある、改行を表す \n はエスケープシーケンスと呼ばれていて、特殊な機能を発揮する文字列です。これもいろいろ種類があります。

エスケープシーケンス ※重要

Pythonにおいて使用できるエスケープシーケンスは以下の通りです。

	\newline……………行末に \ を記述するとその行の改行が無視される
	\'……………………一重引用符(シングルクォーテーション)
	\"……………………二重引用符(ダブルクォーテーション)
	\\……………………バックスラッシュ(円記号)
	\a……………………ベル
	\b……………………バック スペース
	\f……………………改ページ
	\n……………………行送り
	\r……………………復帰
	\t……………………水平タブ
	\v……………………垂直タブ 
	\ooo…………………8進表記による ASCII文字
	\xhh…………………16進表記による ASCII文字
	
*以下に示すエスケープシーケンスは,文字列のみに対して有効です。
	\N[name]……………………Unicode データベース中で name という名前の文字
	\uxxxx…………………………16ビットの十六進の値 xxxx を持つ文字
	\Uxxxxxxxx………………32ビットの十六進の値 xxxxxxxx を持つ文字
	
よく考えてみれば、エスケープシーケンスはC言語やC++にもありますし、Javaにもあります。
基本的にプログラミング言語に共通な 制御文字として認識していてもほぼ間違いないと思います。VBにも似たようなものがあったような気がします.

数値リテラルについて。Pythonでは、数値表現には以下のようなものがあります。
数値リテラルは、3種類あります。整数型(Integer)、浮動小数点数型(floating point number)、及び、虚数(Imaginary numbers)です。
複素数リテラルは存在しませんが、複素数の場合、実数と虚数の和として表現されます。また数値リテラルには符号は含まれていないことにご注意ください.
-123 のような数値は、実際には単項演算子 - とリテラル 123 を組み合わせたものになります。

整数リテラルは,10進数、8進数 0ohhhh、16進数 0xhhhh、または,2進数 0bhhhh を使用して表現できます (o, x, b は大文字でもOKです)
整数リテラルの長さは、メモリーが許す限り,いくらでも長くできます。例を見てみましょう。
	>>> 15
	15
	>>> 0xf
	15
	>>> 0o17
	15
	>>> 0b1111
	15
	
上記はどれも15を表していますが、表記方法が異なるだけです。いろいろと実験してみて下さい。

真偽値も整数リテラルの一種であり、False と True の 2種類の値を取ります。Pythonの場合の真偽値を表すブール型は整数型の派生型であり、
ほとんどの状況下でそれぞれ 0 と 1 のように振る舞います。
	>>> True
	True
	>>> False
	False
	>>> True + True
	2
	>>> False - True
	-1
	>>> True * False
	0
	>>> False * False
	0
	>>> True * True
	1
	>>> True / False
	Traceback (most recent call last):
	  File "<stdin>", line 1, in <module>
	ZeroDivisionError: division by zero
	ここでは、False が 0 として計算するので、100 は 0で割り切れないので、エラーが発生する.
	
浮動小数点数リテラルの取り得る値の範囲は、実装に依存します。なお、数値はすべて 10進数であり、仮数部と指数部を使用して表現する場合,
その基数は常に 10となります。これも例を示します。
	>>> 12345.567
	12345.567
	>>> 12345.01
	12345.01
	>>> 1234501e-2
	12345.01
	>>> 12345022e-3
	12345.022
	>>> 314159265e-8
	3.14159265
	
虚数リテラルは,aj (aJ) のように表現します。これは、実数部が 0.0 の複素数を表しています。実数部がゼロではない複素数を生成するには、
(3 + 4j)のように虚数リテラルに浮動小数点数を加算するか、または、組み込み関数 complex関数 を使用します。
complex関数については、またあとで説明いたします。しかしあとになると、忘れてしまうこともありますので、簡単に説明しますと、complex(2, 5)のように
記述します。これは、複素数(2 + 5j)を意味します.

数学の世界には、実数という数直線上で表せる数,数直線上では表すことができない虚数が存在します。しかし、数直線上に別の0を通る垂直な線を
描くことによって 虚数(aj)を表現することができます。複素数のiやjがついていない部分を実数部と言いますが、これは数直線上で表せる部分です。
複素数のiやjの係数部分は、 縦軸にとることができますが,これが虚数部となります。例も示しておきます.
	01 >>> 3.14j   # 3.14J でもOK
	02  3.14j
	03 >>> 2.56 + 3.1416j
	04 (2.56+3.1416j)
	05 >>> complex(2.56, 3.1416)
	06 (2.56+3.1416j)
	07 >>> complex(2.56, 3.1416).real     # 実数部の参照(参照のみ)
	08 2.56
	09 >>> complex(2.56, 3.1416).imag    # 虚数部の参照(参照のみ)
	10 3.1416
	11 >>> complex(1,2) + complex(3,4)   # 複素数の加算
	12 (4+6j)
	13 >>> complex(1,2) * complex(3,4)   # 複素数の乗算
	14 (-5+10j)
	15 >>> complex(3,4) / complex(1,2)   # 複素数の除算
	16 (2.2-0.4j)
	17 >>> complex(1,2) / complex(3,4)    # 複素数の除算2
	18 (0.44+0.08j)
	
complex関数は、complex(2,5)においては、complex(2 + 5j)とも書けますし、complex("2+5j")とも書くことができます。
また、j の代わりに i を使用すると、エラーが発生します。理由はどうしてかというと、これは iが別の用途(for文、反復など)として利用されるものだからと考えられます。

変数

変数に使用できる文字について:
Pythonでは変数に使用できる文字についていろいろと制約があります。例えば、先頭の文字に数字は使用はできません。例→7abなど
アルファベット、下線 _、および,数字を利用できます。ただし下線 _から始まる識別子には、特別な意味がある場合があります。
また、Python言語における予約語(キーワード)は、変数名として利用できません。

     
キーワード一覧
Falseexcept pass
Nonefinallyraise
True for return
and from try
asglobal while
assert if with
break importyield
class in
continue is
def lambda
del nonlocal
elif not
else or

演算子と式について

比較と論理演算

Pythonには以下のような比較演算子が存在します。これらの演算子は,オブジェクト(データ)の値同士の比較を行います.

	<	: 	より小さい			a < b
	>	:	より大きい			a > b
	<=	:	以下				a <= b
	>=	:	以上				a >= b
	==	:	等しい				a == b
	!=	:	等しくない			a != b
	is 	:	同じオブジェクト		a is b
	is not 	:	同じオブジェクトではない	a is not b
	
以上述べた演算子を利用して、以下のような論理演算が可能です。 Pythonにおいては、「 x < y < z 」 の結果が、「 x < y and y < z」 とほぼ等価になるようです。(理由はわかりません)
一番右は計算の優先順位を表しています。上から順番に、低→高となっていて、or演算が一番優先順位が低いことがわかります.
例:x < 3 and y < 4 or x > 4 and y < 8 だと、(x < 3 and y < 4) or (x>4 and y<8)と同等になります.
また、notは非ブール演算より優先順位が低いため,not a == b は,not (a == b)と解釈されます。

この辺りも分かりやすく,動画などを交えてきちんと解説していきたいと思います。

数値演算

Pythonには以下のような数値演算を行うための演算子が用意されています。またJava,C/C++など同様,代入と加算を同時に行う演算子 += などや、
-=、*=、/= ………なども可能です。ただしインクリメント演算子(++)や、デクリメント演算子(ーー)や、条件演算子=?:が存在しませんので.
注意してください。

	+    :    加算(複素数に対しても適用可能、結合(文字列), x + y)
	-    :    減算(複素数に対しても可能、符号の変更, x - y, -y)
	*    :    乗算(複素数に対しても可能、文字列の繰り返し, x * y, *x)
	**   :    べき乗(複素数に対しても可能,C/C++には存在しない,x ** y)
	/    :    除算(結果は浮動小数点数、複素数に対しても適用可能, x / y)
	//   :    除算(小数点以下を切り捨て, x // y)
	%    :    余り(浮動小数点数に対しても可能, x % y)
	
例は省略します。また複素数に対しては、以上の演算子の演算とともに、以下のような処理が可能です。
		c.conjugate()……………………複素数cの共役複素数
		c.real()……………………………複素数cの実部
		c.imag()……………………………複素数cの虚部
		
忘れているかも知れないので、共役な複素数とは、(a + bj)に対して、(a - bj)となる複素数のことを指します。
ただ単に、虚部の符号をひっくり返しただけです。高校生の頃、この意味がよく分からず、何のために使うのだろうかと疑問でした
複素数平面に図示してみると、この2つの複素数を表す点は、ちょうど実軸に対して、対称になっているというのがわかります。
あとは、実部と虚部は参照のみできるが、変更はできないというのも重要ポイントです。(つまり、c.real = 2 のようにはできない。)
このように複素数は複素数平面に図示してみると,わかることが多く,非常に重宝します。(回転や対称移動の計算もこれで理解できる)
ただ複素数平面は難しすぎるため、大学の教育課程に移行したと聞いたことがあります。個人的に面白く,いろいろと応用が利きそうだと思いますが.

ビット単位の演算(ビット演算)

Pythonでは,整数に対し、以下のようにビット単位での演算を行う演算子が用意されています。なお、これもC/C++同様に
>>=, <<=, &= といった演算も可能です。

		<<     左にビットシフト    a << 3
		>>     右にビットシフト    a >> 4
		&      ビットごとの論理積    x & y
		|      ビットごとの論理和    x | y
		^      ビットごとの排他的論理和   x ^ y
		~      1の補数( 0 と 1 の 反転)   ~x
	

Pythonの複合データについて

いわゆるデータ構造のことで、配列などを扱います。JavaにもC/C++にも配列は存在しますが、Pythonの配列はだいぶ異なっています。
しかし習得すれば、いろいろ応用が効きますので、学んでおいて損はないと思います。実はここがPythonの真価が発揮されるところ
で、肝の肝でもあったりします。ぜひ勉強していきましょう.ちなみにPythonにおける配列は、リストといいます。

配列(※ここはC/C++における配列の説明です。興味がない方はこの説を読み飛ばしてもOK.)

非常に重要なデータ構造であり、いろいろな場面で使用されています。1つの変数で複数のデータを扱うためのデータになります。
今まで学んできた普通の変数は、単純変数と呼ばれ、スカラーと呼ばれています。また、これから扱う配列は、ベクトルに対応しています
ベクトルは高校2年くらいで習うと思いますが、まずは2つの数の組をセットで扱いますね。これは配列の基本になります。
その後、3次元のベクトルに拡張していって、いろいろ問題を解くと思いますが、これを連想してもらえればOKです。
配列も同様に、次元を拡張していって、データ数を増やしていくことが可能となります。
複数のデータをひとまとまりにして、扱うので、顧客データの管理や、学生管理システム、成績管理システムなどの開発に
向いています. 例えば、C/C++ 言語において、

	int x[20];   // 要素の数 20 の部分は定数である必要がある
	
このように定義することにより、変数xは 20個の要素を持った配列変数だと見なされて、メモリーに確保されます。
また、コメントにもあるように、要素数は定数である必要があります。変数は使用できない.

配列の各要素にアクセスするためには、ベクトルの場合と同様、x[i]のように記述することになります。ただし、添え字iは 1から20ではなく、0から19まで変化します。ポイントは、Pythonの場合、添字は1から始まるのではなく、0から始まります
	x[3] = 4.0;
	y    = x[7];
	z    = x[15];
	
上の例では、配列 x の4番目の要素に、4.0を代入しています。そして、8番目の要素に記憶されている値が、yに代入されています。さらに、 16番目の要素の値がzに代入されています。

また、C言語やC++におけるポインタの概念は、配列と非常に密接に関連しております。
	int x[5] = { 100, 200, 300, 400, 500};
int *y; // int y[5]; と宣言した場合,y = x; は実行できない
このような宣言がなされていたと仮定して,説明を行います。100 ~ 500は、各要素に記憶される値の初期値になります。
このとき配列変数 x はポインタ変数となり、この変数の値が,連続した領域の中にある4つの変数 x[0] x[1] x[2] x[3]
および、x[4] の先頭アドレスを指しているというイメージです。したがって、ポインタ変数 x をポインタ変数 y に代入するつまり、
	y = x;  # または  y = &(x[0]);
	
変数x と 変数y は同じものを指していることになるので、変数xと変数yはほとんど同じものとなります。
しかし厳密には異なっており、y++ といったアドレス演算は可能ですが、 x++ は不可能になります。
yはx内を移動すると考える?

2次元配列も2次元以降の配列も、ポインタを介しての参照が可能です。しかし説明が長くなってしまうため、ここでは省きます。
ご了承ください。
Pythonの複合データは、次以降に示すようなシーケンス型などがありますので、順次説明してゆきます。

シーケンス型

シーケンスとは、順番の、順序通りという意味ですが、これらの型は有限の順序集合を表しています。
要素の値などを書き換え(変更)できないシーケンス型として、文字列型・タプル型・bytes型
が存在します。これらの型はイミュータブルとも言います。また逆に、変更可能なシーケンス型として
リスト型( list ) ・ Range型 ・ ByteArray型が存在します。これらはミュータブルと言います。

要素の参照方法

シーケンス型のデータを参照する基本的な方法は、C/C++における配列同様、添え字になります。
ただし、Pythonにおいては、負の添え字も使用可能です。次の文字列を使って説明いたします。

	test = "Python_Mania";
	
正の添え字を使用する場合、先頭の文字に対応する添え字は0,最後の文字に対応する添え字は
(n-1)となります。文字数がnの場合です。上に示した文字列について、その添え字は次のようになります。
	+---+---+---+---+---+---+---+---+---+---+---+---+
	| P | y | t | h | o | n | _ | M | a | n | i | a |
	+---+---+---+---+---+---+---+---+---+---+---+---+
	  0   1   2   3   4   5   6   7   8   9  10  11
	 -12 -11 -10 -9  -8  -7  -6  -5  -4  -3  -2  -1
	
この場合、test[0] = 'P' で、test[-4] = 'a' ,test[7] = 'M' となります。
また、最後の文字について、添え字は11ですが、これは文字の長さ 12 - 1 となっていますね。
また負の添え字に関して、次の式が成立します。
	(対応する正の添え字) - (対応する負の添え字) = (文字の長さ)
		
また、Pythonにおいては、スライス(slice)という表現法があり、部分文字列を指定することが可能です。 sliceは、
	[m1:m2[:m3]]
		
のように記述します。これは、
添え字 m1 から 添え字 m2 - 1 までの範囲の文字列を抜き出しします。(※注:m2ではありません)
もしこれがわかりづらい場合には、一番左端のついたて(|)を 0に見立て、右端までのついたて全てに数字を
順番に割り振って考える方法があります。こうすれば、例えば [0:3] の場合だと,左端の要素3つだとすぐわかります.
つまり、ついたての中にある範囲のものが、抜き出される範囲ということになります。

また、開始インデックス m1 を省略すると、0を指定したものとみなされます。 終了インデックス m2を省略すると
文字の長さを指定したものと見なされます。 また、m3を指定した場合ですが、m1 から m2 までの m3 ごとの要素という意味になります。
例も示しておきましょう。
	>>> test = "PythonMania";
	>>> test[0:6]   # 添え字 0 から 6 の手前まで(6は含まず)
	'Python'
	>>> test[:9]   # 最初から添え字 9 の手前まで
	'PythonMan'
	>>> test[8:]   # 添え字 8 から最後まで
	'nia'
	>>> test[6:-1]   # 添え字 6 から最後の手前まで(最後は含まない)
	'Mani'
	>>> test[0:9:2]   # 添え字0から,9 の手前まで 2ずつ増やしながら抜き出す
	'PtoMn'
	
C/C++には、負の添え字やスライスに対応する機能がありません。
文字列は自分の好きな文字列に変えていろいろと試してみて下さい。

シーケンス型に共通の演算

※各項目別窓で開きます。

変更可能・不可能にかかわらず、ほとんどのシーケンス型でサポートされており、同じ型のシーケンス同士に対しては、比較もサポートしています.

変更不可能なシーケンス

文字列型

ここからは、変更不可能なシーケンス型について見ていきたいと思います。

文字列はstrオブジェクトです。 一重引用符(')または二重引用符(")で囲み、 どちらも同じ文字列です。
また、一重引用符 or 二重引用符を3つ続けることによって,複数行にわたる文字列表現が可能です。(前述で説明)
 文字列に対しては、先述のシーケンス型における共通の演算すべてに加え、以下に述べるメソッドが使用可能です。
しかし、ここでは各項目詳細に解説していきます。

上記のようなメソッドが文字列(型)には、あります。

タプル型

タプルとは、任意のPythonオブジェクトのことで、丸括弧で囲まれたものです。以下に例を示します。

	>>> ()		# 空のタプル
	()
	>>> tuple()	# 空のタプル
	()
	>>> ("abc",)	# 単要素のタプル
	('abc',)
	>>> "abc",		# 単要素のタプル(括弧なし)
	('abc',)
	>>> tuple(["abc"])	# リストを使用してタプル生成
	('abc',)
	>>> ("abc", 10, "xxx", "yyy")	# 一般的なタプル生成
	('abc', 10, 'xxx', 'yyy')
	>>> "abc", 10, "xxx"			# 括弧なしで生成
	('abc', 10, 'xxx')
	>>> tuple(["abc", 10, complex(1,3)])	# 異なる型が含まれるタプル(tuple()使用)
	('abc', 10, (1+3j))
	>>> tuple("abc")			# 組み込み関数 tuple()の使用
	('a', 'b', 'c')
	>>> a = ((1, 2, 3), (10, 20, 30))		# 二次元配列に対応したタプル
	>>> a[0][1]
	2
	>>> a[1][2]
	30
	

bytes型

bytes型は、8ビット、つまり1バイトであり、 0~256 までの範囲の整数で表されます。

			>>> b"abcdef"
			b'abcdef'
		

変更可能なシーケンス

変更可能なシーケンス型には以下のようなものがあります。

リスト型

リストは、C/C++における配列に相当するオブジェクトで,格納はもちろん,追加や削除・挿入や変更が可能です。
データの個数を数えることも可能です。買い物リストや、やることリストなど,を思い浮かべてもらえれば、わかりやすいかと思います。

Range型

for 文など指定した回数繰り返したい場合、range関数を使って、for文に渡すデータ群を作れます。range関数は、リストに似たRange型
と呼ばれるデータ群を戻り値で返します。渡す引数として、

	range(終了値)………………………………0から始まり、終了値-1 までの数値を要素とするRange型のデータ群を作成する。
	range(開始値,終了値)……………………… 開始値から、終了値-1 までの数値を要素とするRange型のデータ群を作成する。
	range(開始値,終了値,ステップ)…………… 開始値から、ステップごとに終了値-1 までの数値を要素とするRange型のデータ群を作成する。
	
のようになります。渡す引数の数によって、データ群に格納される要素の数値が変化します。
	>>> list(range(1, 10, 2))		# 1 から 10まで 2ステップごとに作成
	[1, 3, 5, 7, 9]
	>>> list(range(10, -3, -1))		# 要素 -3 は含まれない。
	[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, -1, -2]
	>>> r = range(1, 10, 2)			# ステップを取り出す
	>>> r.step
	2
	>>> r[2]			# 添え字2番目のデータ参照
	5
	
Range型はfor文で、よく出てきます。for文の所でもまた改めて復習を兼ねて再度説明したいと思います。

bytearray 型

bytearray オブジェクトについての要素は、8ビット、つまり1バイトであり、0<=x<=255 の範囲の整数で表されます。

	>>> bytearray()		# 組み込み関数 bytearray()で空のオブジェクト作成
	bytearray(b'')
	>>> bytearray(5)	# 指定した長さの 0 で埋められた bytearray オブジェクトを作成
	bytearray(b'\x00\x00\x00\x00\x00')	
	>>> bytearray(range(5))		# 整数を要素とする イテラブル(iterable)オブジェクトを使用。ここではrangeを使用
	bytearray(b'\x00\x01\x02\x03\x04')
	>>> bytearray([1, 2, 3, 4, 5])
	bytearray(b'\x01\x02\x03\x04\x05')
	>>> bytearray(b"abcd")	# 既存のバイナリデータより bytearray 生成
	bytearray(b'abcd')
	
bytearray の対しては、先に述べた共通のシーケンス演算すべてに加えて、他にも多くのメソッドが使用できます。
ですが、紙面上の都合もあり、省略します。ご了承ください。

集合型

セット(set)型とも言います。setオブジェクトは,ハッシュが可能な(=変更不可能な)オブジェクトの順序のない集まりであり,
数学における集合に相当します。よって、ある要素が含まれる、要素の数などに相当する演算は可能です。しかし、添え字やスライスなど、シーケンス型に
対して使用されるような操作は不可能です。また、 set は 異なる型のオブジェクトを要素として持つことができます。
タプル型・リスト型・辞書型も同様です。なお、C++の set は要素を追加・削除するたびに自動的にソートされますが、こちらの set はソートされません。

set には、set および frozenset という 2種類 の集合型が存在します。 set は変更可能な集合型であり,要素の追加や削除といった操作が
可能です。変更可能なため、ハッシュ値を持たず、辞書のキーや他の集合の要素として用いることができません。
一方、 frozenset 型は変更不可能であり,ハッシュ可能です。作成後に内容の改変ができないため、辞書のキーや他の集合の要素として用いることが
できます。

set は,要素を波括弧{}でくくって、カンマ区切りで列挙していくことによって生成できます。空のsetの場合、波括弧のみとなります。
また、set および frozenset はそれぞれ、組み込み関数 set()、frozenset()を使用しても作成することが可能です。引数は,
イテラブルオブジェクトを指定しますが、省略した場合は、空の集合が作成されます。

	>>> {}
	{}
	>>> {1, 2, 3}
	{1, 2, 3}
	>>> {1, 2, 3, 3, 3}		# 同じ要素は含まない
	{1, 2, 3}
	>>> set([1, 2, 3])		# set()より集合の作成
	{1, 2, 3}
	>>> frozenset([1, 2, 3])	# frozenset()より、変更不可能な集合の生成
	frozenset([1, 2, 3])
	>>> number_set = {10, 20, 30}
	>>> print(number_set[0])	# 集合でインデックスは指定できない(エラーが発生する)
	Traceback (most recent call last):
 	 File "<stdin>", line 1, in <module>
	TypeError: 'set' object is not subscriptable
	
set および frozenset オブジェクトに対して、以下に示す操作が可能です。ですがプログラム中で使用すると初心者にとっては、
たいへんわかりにくいものになるため、できればあまり多用しないことをお勧めします。※別窓で開きます。

マッピング型(辞書型)

マッピング型は、辞書型とも言い,ハッシュ可能な値であるキーと任意のオブジェクトのペアで構成されます。
現在において,標準のマッピング型としては、辞書があります。こちらも異なる型のオブジェクトを要素として持つことができます。
タプル型・リスト型・集合型も同様です。なお、C++における mapは、データが入力されるたびに自動的にソートされますが、こちらの mapはソートがされません。

 辞書のキーは、任意の値ですが、ハッシュ可能でない値(つまり、リストや辞書など変更可能な型)は、キーとして使用できません。
またキーは同一のキーは一つしか格納することができず、重複したキーを持つことができません。また、要素が順序づけられていません。
よって、インデックスや、スライスは使えません。

 また、辞書は、異なる型のオブジェクトを要素として持つことができます。(これは、タプル型やリスト型、集合なども同様です。)
辞書は次のように、キーと値をセットにして、カンマで区切って波括弧で括ることで作成が可能です。
辞書では、キーを指定することによって、それに対応する値を取得することが可能です。

	>>> d = {}		# 空の辞書
	>>> d = dict()		# 空の辞書
	>>> d = {"kenta" : 40, "kenpi" : 29, "kensuke" : 34}	# キー・バリューの組と波括弧の利用
	>>> d = dict(kenta = 40, kenpi = 29, kensuke = 34)		# キーワード引数の利用
	>>> d = dict(["kenta" : 40, "kenpi" : 29, "kensuke" : 34])	# mappingの利用
	>>> d = dict(["kenta" : 40, "kenpi" : 29], kensuke = 34)		# マッピングとキーワード引数の利用
	>>> d = dict([("kenta" , 40), ("kenpi" , 28), ("kensuke" , 34)])	# イテラブルの利用
	>>> d.keys()					# 辞書の中のキーをすべて取得する
	dict_keys(['kenta', 'kenpi', 'kensuke'])
	>>> d.values()				# 辞書の中の値をすべて取得する
	dict_values([40, 28, 34])
	
>>次章に続く