Pythonは、1991年にオランダ出身グイド・ヴァン・ロッサム氏によって開発されたプログラミング言語です。Pythonは、人間にとって読みやすく、それでいて
効率よくコードをなるべく簡単に書けるようにという設計思想があり、Javaと同様にオブジェクト指向プログラミングをサポートしており、プログラマーが
小規模から大規模な開発プロジェクトまで、幅広く明瞭で簡潔なコードを書くことを支援するのを目的としています。
オブジェクト指向に限らず、c言語のような構造化プログラミングや、関数型プログラミング・論理型プログラミングといった複数のプログラミングパラダイムにも対応しています。
あと、Pythonはインタープリタ型言語に属しています。C言語やJavaやVBは、ソースコードを打ち込めば、そのままでは実行できません。
コンパイルという作業が必要になります。しかし、Pythonにはその必要はないのです。コードを打ち込んでエンターキーを押すと、コンピュータが
その場で解釈して実行してくれます。
Pythonは、AI(人工知能)開発が得意だと言われています。実際に画像認識プログラムなどは主に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の大事なポイントとなりますが,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] # ~コメント3PythonにもJavaと同様に、制御構文があり、if文/while文などが存在します。
01 if 条件: 02 a = 30 03 b = 65 04 else: 05 c = 75 06 d = 100if文についてはあとで詳しく勉強しますが、上の文を見てください。この文は、条件が真であれば、02, 03行を
Pythonではコメントは以下のように記述する決まりになっています。
a = 120 # 変数aに 120 を代入#から改行までは、コメントとみなされます。
# 変数aに 120 を代入 a = 120と2行に分けて書いても問題ありません。
""" コメントその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のところ以外は改行が出力されていないのがわかると思います。(\で改行出力を抑制しているため)
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にもあります。
>>> 15 15 >>> 0xf 15 >>> 0o17 15 >>> 0b1111 15上記はどれも15を表していますが、表記方法が異なるだけです。いろいろと実験してみて下さい。
>>> 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進数であり、仮数部と指数部を使用して表現する場合,
>>> 12345.567 12345.567 >>> 12345.01 12345.01 >>> 1234501e-2 12345.01 >>> 12345022e-3 12345.022 >>> 314159265e-8 3.14159265虚数リテラルは,aj (aJ) のように表現します。これは、実数部が 0.0 の複素数を表しています。実数部がゼロではない複素数を生成するには、
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")とも書くことができます。
変数に使用できる文字について:
Pythonでは変数に使用できる文字についていろいろと制約があります。例えば、先頭の文字に数字は使用はできません。例→7abなど
アルファベット、下線 _、および,数字を利用できます。ただし下線 _から始まる識別子には、特別な意味がある場合があります。
また、Python言語における予約語(キーワード)は、変数名として利用できません。
False | except | pass |
None | finally | raise |
True | for | return |
and | from | try |
as | global | while |
assert | if | with |
break | import | yield |
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には以下のような数値演算を行うための演算子が用意されています。また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)となる複素数のことを指します。
Pythonでは,整数に対し、以下のようにビット単位での演算を行う演算子が用意されています。なお、これもC/C++同様に
>>=, <<=, &= といった演算も可能です。
<< 左にビットシフト a << 3 >> 右にビットシフト a >> 4 & ビットごとの論理積 x & y | ビットごとの論理和 x | y ^ ビットごとの排他的論理和 x ^ y ~ 1の補数( 0 と 1 の 反転) ~x
いわゆるデータ構造のことで、配列などを扱います。JavaにもC/C++にも配列は存在しますが、Pythonの配列はだいぶ異なっています。
しかし習得すれば、いろいろ応用が効きますので、学んでおいて損はないと思います。実はここがPythonの真価が発揮されるところ
で、肝の肝でもあったりします。ぜひ勉強していきましょう.ちなみにPythonにおける配列は、リストといいます。
非常に重要なデータ構造であり、いろいろな場面で使用されています。1つの変数で複数のデータを扱うためのデータになります。
今まで学んできた普通の変数は、単純変数と呼ばれ、スカラーと呼ばれています。また、これから扱う配列は、ベクトルに対応しています
ベクトルは高校2年くらいで習うと思いますが、まずは2つの数の組をセットで扱いますね。これは配列の基本になります。
その後、3次元のベクトルに拡張していって、いろいろ問題を解くと思いますが、これを連想してもらえればOKです。
配列も同様に、次元を拡張していって、データ数を増やしていくことが可能となります。
複数のデータをひとまとまりにして、扱うので、顧客データの管理や、学生管理システム、成績管理システムなどの開発に
向いています. 例えば、C/C++ 言語において、
int x[20]; // 要素の数 20 の部分は定数である必要があるこのように定義することにより、変数xは 20個の要素を持った配列変数だと見なされて、メモリーに確保されます。
x[3] = 4.0; y = x[7]; z = x[15];上の例では、配列 x の4番目の要素に、4.0を代入しています。そして、8番目の要素に記憶されている値が、yに代入されています。さらに、 16番目の要素の値がzに代入されています。
int x[5] = { 100, 200, 300, 400, 500};このような宣言がなされていたと仮定して,説明を行います。100 ~ 500は、各要素に記憶される値の初期値になります。
int *y; // int y[5]; と宣言した場合,y = x; は実行できない
y = x; # または y = &(x[0]);変数x と 変数y は同じものを指していることになるので、変数xと変数yはほとんど同じものとなります。
シーケンスとは、順番の、順序通りという意味ですが、これらの型は有限の順序集合を表しています。
要素の値などを書き換え(変更)できないシーケンス型として、文字列型・タプル型・bytes型
が存在します。これらの型はイミュータブルとも言います。また逆に、変更可能なシーケンス型として
リスト型( list ) ・ Range型 ・ ByteArray型が存在します。これらはミュータブルと言います。
シーケンス型のデータを参照する基本的な方法は、C/C++における配列同様、添え字になります。
ただし、Pythonにおいては、負の添え字も使用可能です。次の文字列を使って説明いたします。
test = "Python_Mania";正の添え字を使用する場合、先頭の文字に対応する添え字は0,最後の文字に対応する添え字は
+---+---+---+---+---+---+---+---+---+---+---+---+ | 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' となります。
(対応する正の添え字) - (対応する負の添え字) = (文字の長さ)また、Pythonにおいては、スライス(slice)という表現法があり、部分文字列を指定することが可能です。 sliceは、
[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型は、8ビット、つまり1バイトであり、 0~256 までの範囲の整数で表されます。
>>> b"abcdef" b'abcdef'
変更可能なシーケンス型には以下のようなものがあります。
リストは、C/C++における配列に相当するオブジェクトで,格納はもちろん,追加や削除・挿入や変更が可能です。
データの個数を数えることも可能です。買い物リストや、やることリストなど,を思い浮かべてもらえれば、わかりやすいかと思います。
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番目のデータ参照 5Range型はfor文で、よく出てきます。for文の所でもまた改めて復習を兼ねて再度説明したいと思います。
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 subscriptableset および 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])>>次章に続く