【Python初心者】Python資格の勉強まとめ(合格しました!)
みなさんこんにちは。shinです。
久々のnote更新です。
今回の記事は、今勉強しているPythonの基本的な資格についてまとめている内容になります。
勉強しながら更新している感じなので、全然まとまっていませんが勉強しながらまとめていこうと思っています。
→追記。12/12に合格することができました。
Pythonの資格に興味がある人は見て行っていただければと思います。
資格名
Python 3 エンジニア認定基礎試験
試験の詳細は以下を見てください。
参考書
勉強をする前に
勉強をする前にどのような試験なのかを見てみましょう。
まず、問題数は40問で合格基準は7割となっています。
ということは、最低28問は正解する必要があり、逆に言えば12問は間違えることができるということです。
では、これを元に合格するのに一番効率的な勉強法を考えてみましょう。
公式サイトの出題率を見ると次のようになっています。
章立て 出題率
1章 食欲をそそってみようか 2.50%
2章 Pythonインタープリタの使い方 2.50%
3章 気楽な入門編 15.00%
4章 制御構造ツール 22.50%
5章 データ構造 17.50%
6章 モジュール 5.00%
7章 入出力 2.50%
8章 エラーと例外 10.00%
9章 クラス 5.00%
10章 標準ライブラリめぐり 10.00%
11章 標準ライブラリめぐり─PartII 2.50%
12章 仮想環境とパッケージ 2.50%
13章 次はなに? 0.00%
14章 対話環境での入力行編集とヒストリ置換 2.50%
この出題率の割合を元に、各章毎に何問出題されるかというとこうなります。
章 問題数
1章 食欲をそそってみようか:1問
2章 Pythonインタープリタの使い方:1問
3章 気楽な入門編:6問
4章 制御構造ツール:9問
5章 データ構造:7問
6章 モジュール:2問
7章 入出力:1問
8章 エラーと例外:4問
9章 クラス:2問
10章 標準ライブラリめぐり:4問
11章 標準ライブラリめぐり─PartII:1問
12章 仮想環境とパッケージ:1問
13章 次はなに?:0問
14章 対話環境での入力行編集とヒストリ置換:1問
見ると3章、4章、5章、8章、10章あたりが問題数として多そうです。
ですが参考書の内容を確認すると章ごとにページ数が異なっているので、まだ分析する余地がありそうなので、次に1問あたりに出題されるページ数を出してみます。
1章 食欲をそそってみようか:3ページ/1問
2章 Pythonインタープリタの使い方:3ページ/1問
3章 気楽な入門編:2.2ページ/1問
4章 制御構造ツール:1.9ページ/1問
5章 データ構造:2.1ページ/1問
6章 モジュール:6.5ページ/1問
7章 入出力:11ページ/1問
8章 エラーと例外:2.3ページ/1問
9章 クラス:10.5ページ/1問
10章 標準ライブラリめぐり:1.8ページ/1問
11章 標準ライブラリめぐり─PartII:9ページ/1問
12章 仮想環境とパッケージ:5ページ/1問
13章 次はなに?:0ページ/1問
14章 対話環境での入力行編集とヒストリ置換:1ページ/1問
1問あたりのページ数で出すと章ごとにばらつきがありそうですね。
これらの結果から、1問あたり3ページ以下のものを出してみます。
1章 食欲をそそってみようか:3ページ/1問
2章 Pythonインタープリタの使い方:3ページ/1問
3章 気楽な入門編:2.2ページ/1問
4章 制御構造ツール:1.9ページ/1問
5章 データ構造:2.1ページ/1問
8章 エラーと例外:2.3ページ/1問
10章 標準ライブラリめぐり:1.8ページ/1問
14章 対話環境での入力行編集とヒストリ置換:1ページ/1問
問題数を集計すると、「33」問になります。
これなら合格ラインに届くので、結論として「1,2,3,4,5,8,10,14」章重点的に勉強するのが効率よさそうですね!
それでは、ここからまとめになります。
1章 食欲をそそってみようか
●Pythonの特徴
インタープリタ言語でコンパイルが不要。
変数や引数の宣言も不要。
フリーのオープンソフトウェア。
対応可能な問題領域は、「Awk」、「Perl」よりも広い
2章 Pythonインタープリタの使い方
●インタープリタの特徴
インタープリタを起動するには「python -c コマンド[引数]...」というやり方もある。利用する場合は、コマンド部分全体をシングルクォートで囲んでおく。
モジュールのソースファイル名を完全な形で指定するには「python -m モジュール名[引数]」として呼び出す。
スクリプトファイル名の前に「-i」を入れると、実行後に対話モードに入る。
プロンプトの記号はプライマリ「>>>」、セカンダリ「...」である。
標準入力からファイルを与えて起動した場合は、そのファイルに入った「スクリプト」を読み込んで実行する。
インタプリターがスクリプト名のあとに引数を入力すると、これらの文字列はリストになり、sysモジュールの変数argvに割り当てられる。「import sys」を実行することで、このリストにアクセスできる。
●sys.argvの使い方
import sys
sys.argv
argv[0]はスクリプト名を返す
argv[1:]はコマンドラインの引数を返す
●プログラムでコメントを使う場合
「#」記号の後ろはすべてコメントになる
3章 気軽な入門編
●オペランドと演算子の違い
オペランドは計算する値のこと「(1 + 1)の1の部分」
演算子は計算する記号のこと「(1 + 1)の+の部分」
●演算子の使い方
整数はint型、小数点はfloat型を使う。
もし、int型とfloat型を同時に計算した場合は、float型で結果が出る。
pythonで割り算を行うと必ずfloat型で返される。
※「4 / 2 = 2.0」となる。
割り算をして整数解を得たい場合は演算子に「//」を使う。
割り算をして余りを得たい場合は演算子に「%」を使う。
※「5%2=1」
対話モードで最後に利用した式は変数「_」(アンダースコアー)に代入している。
●演算子の優先順位
演算子は基本的には、左から右へ計算される。
例)1 + 2 = 3
ただし、通常の算数と同じように、掛け算や割り算の演算子の方が、足し算や引き算よりも優先される。
例)2 + 2 * 3 = 8
もう一つ例外があり、べき乗だけは右から計算される。
例)2 ** 2 ** 3 = 256
この場合、次のような計算が行われる。
「2 ** (2 ** 3)」となるため「2 ** 8」となる。だから2の8乗で256になる。
●文字列について
バックスラッシュ(\)を前置した文字が特殊文字として解釈されたくないときは、raw文字列を使う。
使い方は「print(r'C:/some/name'」として、文字列の前に「r」を入れる。
Pythonは複素数もサポートしている。複素数とは、実数と虚数を組み合わせたものです。例えば、「1 + 2j」みたいなもの。
その場合、Pythonでは「j」または「J」を使う。
Pythonの文字列は改変できない。
例えば、次のプログラムはエラーになる。
word = 'word'
word[0] = 'a'
TypeError: 'str' object does not support item assignment
●文字列のインデックス指定とスライシングについて
変数に保存した文字列の指定した部分を取り出すにはインデックス指定とスライシングという方法がある。
インデックス指定:特定の場所の文字を抽出
スライシング:指定した範囲の文字を抽出
例)
mozi = 'abcdefg'
print(mozi[2]) インデックス指定
c
print(mozi[-1]) インデックス指定
g
print(mozi[1:3]) スライシング
bc
print(mozi[-3:-1]) スライシング
ef
例のインデックス指定「print(mozi[2])」では、2番のインデックスを指定しています。
ここで気を付けるべきことは、2番目のインデックスなら「b」では?と思うかもしれないが、プログラムではインデックス番号は[0]番から始まる決まりがある。
そのため、実際には3番目の文字列になる。
※ちなみにインデックス番号はマイナスでも指定できるが、その場合はー1は後ろから1番目という意味になります。
次にスライシング「print(mozi[1:3])」の場合では、インデックスの1番目から3番目までを出力するようにプログラムしている。この場合、先ほどのインデックスの話しで、1番目のインデックスつまり2番目の文字から、2番目のインデックスつまり3番目の文字を出力する。
ここでも一つ注意点があり、スライシングを使った場合の終わりの文字は、「インデックス番号 ー 1」となる仕様です。これはインデックスにマイナスを指定した場合も同様になります。
●さらにスライシングについて
print関数とスライシングを組み合わせてもう少しやってみます。
例)
char = 'Todayiscool'
print(char[2:7:2])
結果
dys
今回のようなプログラムの場合は、スライシングの引数の意味は次のようになります。
第1引数:最初の出力
第2引数:出力が可能な最後の数
第3引数:出力する間隔
つまり今回の場合だと次のようになります。
T o d a y i s c l o o l
0 1 2 3 4 5 6 7 8 9 10 11
第1引数は、「2」なので2番目の文字、「d」を出力します。
次に第3引数が「2」なので2つ間隔で出力し、第2引数の「7」まで続けます。つまり、2の次は「4」番目の文字の「y」、4の次は「6」番目の文字「s」になり、出力結果が「dys」となります。
●リスト
Pythonでは複数の値をまとめる方法が複数(リスト、辞書、タプルなど)あるが、その中で万能なものがリスト(list)です。
リストを使う場合は、角カッコの中にカンマ区切りで値を入れていきます。
例
item = [1, 2, 3, 4]
print(item)
結果
[1, 2, 3, 4]
文字列と同様にリストもインデックスやスライシングが使えます。
例
item = [1, 2, 3, 4]
print(item[0])
print(item[-1])
print(item[1:])
print(item[:-2])
結果
1
4
[2, 3, 4]
[1, 2]
他にも、リストには連結もサポートしてます。
連結には演算子を利用します。
例
item = [1, 2, 3, 4]
item = item + [5, 6, 7]
print(item)
結果
[1, 2, 3, 4, 5, 6, 7]
文字列でできなかった値の入れ替えも行うことができます。
入れ替える場合は、インデックス番号をしています。
item = [1, 2, 3, 4]
item = item + [5, 6, 7]
item[0] = 0
print(item)
結果
[0, 2, 3, 4, 5, 6, 7]
4章 制御構造ツール
●任意引数のリスト
関数の引数に「*や**」を使うことによって任意個数の引数を使うことができる。それぞれの意味は次のようになります。
*:リストやタプルに利用する
**:辞書のキーワード引数として利用する
●for文のrange関数の注意点
for文のrange関数では何回反復するかを指定できるが利用する時の注意点がある。
・範囲を指定しない場合は「0」から始まる
for i in range(10):
print(i, end='')
結果
0123456789
・range関数で範囲を指定した場合はその値から始まる。
さらに、範囲指定の始めと終わりが同じ場合は処理しない。
for i in range(2, 10):
print(i, end='')
結果
23456789
for i in range(2, 2):
print(i, end='')
結果
何も処理されないため、表示されない。
・rangeの範囲与えられた最後の値は含まない
for i in range(1,-10,-3): ←1から始まってマイナス10になるまで、マイナス3ずつ減らす
print(i, end=' ')
結果
1 -2 -5 -8
●for文のスライスについて
for文のループに範囲にスライスを使うことができる。
例えば、「words = ['one', 'two', 'three', 'four', 'five']」というリストがありこれをfor文のスライスを使って好きな範囲だけをループさせることができる。
words = ['one', 'two', 'three', 'four', 'five']
for i in words[1:3]:
print(i)
結果
two
three
上記の場合、wordsのリストからインデックス番号(1番~2番)を取り出して表示している。※3番目を含まないのは仕様通り。
他にもスライスの範囲で色々な出力ができます。
words = ['one', 'two', 'three', 'four', 'five']
for i in words[1:]:
print(i, end = ',')
for i in words[:-2]:
print(i, end = ',')
結果
two,three,four,five,
one,two,three,
for文とスライスを使ってリストの順番を反対にすることができます。
words = ['one', 'two', 'three', 'four', 'five']
for i in words[:]:
words.insert(0, i)
words.pop()
print(words)
結果
['five', 'four', 'three', 'two', 'one']
この時、ループに使うイテラブルはwordsではなく、words[:]を指定する必要があります。
●break文とcontinue文、ループにおけるelse節
break文とは、そのbreak文を使ったforまたはwhileのループを抜けるときに使うもの。
このループ文にelse節を使うことができる。
else節は、for文やwhile文を抜けるタイミングで実行される。
break文で終了した場合は実行されない。
for n in range(2, 10):
for x in range(2 ,n):
if n % x == 0:
print(n, 'equals', x, '*', n//x)
break
else:
print(n,'is a prime number')
結果
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3
上記のような場合、まずはnに「2」が入り、次のfor文に行く。
次のfor文では、rangeが「2, 2」のため、for文が実行されず、else節に移動する。最初の「2 is a prime number」が実行される。
続いて、nに「3」が入り、同じく次のfor文に行く。
次のfor文では、rangeが「2, 3」のため、for文が実行され、if文に移動する「n(3) % x(2)」を実行した結果「1」になるため、実行されずfor文に戻るがrangeの範囲を満たしたため、else節に移動し「3 is a prime number」が実行される。
nに「4」が入り、同じく次のfor文に行く。
次のfor文では、rangeが「2, 4」のため、for文が実行され、if文に移動する「n(4) % x(2)」を実行した結果「0」になるため、if文のprint文が実行され「4 equls 2 * 2」を表示し、break文が実行され終了する。
次はnに「5」が入り、このような感じでプログラムが処理されていく。
●pass文
pass文は構文的に文が必要なんだけれど、プログラム的には何もしたくないときに使うもの。
for num in range(3, 7):
if num % 2 == 1:
print('if文:',num)
pass
print('not if文:',num)
結果
if文: 3
not if文: 3
not if文: 4
if文: 5
not if文: 5
not if文: 6
passを使うタイミングとしては、とりあえずクラスの中身は決まってないけれど定義だけしておこうみたいな時に使います。
●関数の引数を呼び出す際の注意点関数の引数を呼び出すには以下のことに注意する。
・新しく引数を宣言することはできない。
・引数の値を更新する場合は、「変数名 = '値'」とするか、引数の順番通りに「値」を入れる必要がある。
例えば、次のような関数があるとします。
def test(a, b='Bです。', c='Cです。'):
print(a,b,c)
test("Aです。")
結果
Aです。 Bです。 Cです。
新しい引数を追加してみます。
def test(a, b='Bです。', c='Cです。'):
print(a,b,c)
test("Aです", d ="Dです。")
結果
TypeError: test() got an unexpected keyword argument 'd'
次は、最初に引数を更新する値の結果を確認してら、引数を別の順にして呼び出してみます。
def test(a, b='Bです。', c='Cです。'):
print(a,b,c)
test("Aです。", b = "BBBです。")
結果
Aです。 BBBです Cです。
次に引数の順を別にして値を更新してみます。
def test(a, b='Bです。', c='Cです。'):
print(a,b,c)
test(b = "BBBです。", "Aです。")
結果
SyntaxError: positional argument follows keyword argument
●lambda(ラムダ)式について
lambda式を使うと、無名関数が書ける。
書き方は「lambda 引数:返り値」となる。
以下の例の場合は、lambda式を使って、配列の2つ目の文字を起点に昇順にsortしています。「pairs.sort(key = lambda arg : arg[1])」の部分です。
pairs = [(3, 'a'),(1, 'c'),(4, 'b'),(2, 'd')]
pairs.sort(key = lambda arg : arg[1])
print(pairs)
結果
[(3, 'a'), (4, 'b'), (1, 'c'), (2, 'd')]
●ドキュメンテーション文字列(docstring)の話し
docstringとは関数やクラスに対しての説明文のことです。
・1行目は常にオブジェクトの目的の簡潔な要約にする
・1行目は大文字で始まり、ピリオドで終わること
・2行目は空白行とする
・トリプルクオート「"""」で関数内に記述されたdocstringの内容は、関数の「__doc__」属性に文字列として格納される。また、help関数でドキュメントとして表示させることもできる。
●関数注釈(関数アノテーション)
関数アノテーションとは、関数の引数や返り値の型を明確にするために利用するものです。
・注釈(アノテーション)は関数の「__annotations__」属性にディクショナリとして格納される
・関数の他の部分にはいかなる影響も与えない
●コーディングスタイル
Pythonでは、たいていのプロジェクトで守るべきルールみたいなものがあり、PEP8という規約がある。
【PEP8の内容】
・インデントはスペース4つとして、タブを使わない
・79文字以下で行を折り返す
・関数やクラス、そして関数内の大きめのブロックを分離するときは空白行を使う
・可能であればコメント行は独立させる
・docstringを使う
・演算子の周囲やカンマの後ろにはスペースを入れるが、カッコのすぐ内側に入れない。「a = 1 + (2 + 3)」
・クラスや関数には一貫した命名をする。クラスは、ClassUse(単語の頭文字を大文字にして繋げる)、関数やメソッドはclass_use(小文字の単語同士をアンダースコアで繋げる)のようにする。メソッドの第一引数としては常に「self」を使う
・国際的な環境で使うコードでは、自分勝手なエンコーディングは使わない。PythonのデフォルトのUTF-8またはASCIIが良い
・非ASCII文字は使わない
5章 データ構造
●リストとタプルと集合とディクショナリの違い
リスト:変更可能(mutable)。使うには、「 [ ] 」角カッコを使う。
タプル:変更不能(immutable)。使うには、「 ( ) 」丸カッコを使う。
集合:重複しない要素を順不同で集めたもの。利用方法は存在判定。使うには、「 { } 」中カッコを使う。
ディクショナリ:キーの唯一性(一つの辞書の中で重複しない)ことを条件としている。使うには、「 { kye:value } 」中カッコとキーバリューを使う。
●リストとタプルは順序を持つ要素の集まりという共通点がある
●集合(set)の特徴
・集合とは重複しない要素を順不同に集めたもの。
・集合を作成する場合は「{}」または「set()関数」を使う。
・空の集合を作成する場合は「set()」を使う。
●辞書(ディクショナリ)の特徴
・ディクショナリには「キー」と「インデックス」がある。
・ディクショナリは「キー:値」で保存する。
・ディクショナリの中では重複することができない。
・中カッコを対「{}」で書くことによってからのディクショナリを作成できる。
・del関数で削除することができる。
・あるキーがディクショナリに存在するかをチェックする場合は「in」を使う。値ではない。
・ディクショナリにループを使ってキーと値をを出力したい場合は、ループの出力対象に「.items()」をつける
例)
zisho = {'key1': 1, 'key2': 2, 'key3': 3}
for key, value in zisho.items():
print(key, value)
結果
key1 1
key2 2
key3 3
●シーケンスの比較
シーケンスの比較する場合は、次の順で比較する。
1.最初のアイテム同士を比較
2.同じであれば、次の値で比較
3.なくなるまで繰り返す
4.すべてが同じであれば同一シーケンスとして考えられる。
5.もし、同じシーケンスで、片方の長さが短い場合は、長いほうが大となる。
6.文字列の場合はそれぞれの文字のUnicodeポイント番号を使う。
基本はアルファベット順で大きくなっていく。大文字と小文字の場合は、小文字の方が番号は小さい。
間違えるポイント
カッコで囲まれている文字の比較。
例) ('ab','cd') < ('abc','ab')
この場合、先頭の「abとabc」が比較されて決着がつくため次の「cdとab」の比較はされず「True」となる。
例) ('ab','cd') < ('ab','ab')
この場合は先頭の「abとab」が同じであるため、「cdとab」の比較になり、左側の式の方が大きいので「False」となる。
参考Unicode
●リストの行列入れ替え方法
次のようなリストがあった場合に、行列を入れ替える方法がある。
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
]
入れ替え方法
matrix2 = [[row[i] for row in matrix] for i in range()]
print(matrix)
print(matrix2)
結果
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
その他にもビルドイン関数を使うやり方もある。
ビルドイン関数(zip()を使う)
matrix3 = list(zip(*matrix))
print(matrix3)
結果
[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
●リストのメソッドについて
リストには色々なメソッドがある。
list.append(x):リストの末尾にアイテムを1つ追加する
list.insert(i, x):指定した場所にアイテムを挿入する。
i:挿入場所、x:挿入アイテム
list.remove(x):指定した位置のアイテムを削除する。
a = [1,3,4,6,3,5]
print(a)
a.remove(6)
print(a)
結果
[1, 3, 4, 6, 3, 5]
[1, 3, 4, 3, 5]
list.pop([i)]:指定した位置のアイテムリストから削除して、そのアイテムを返す。インデックスを指定しない場合は、最後のアイテムが選択される。
※pop(-1)とした場合は、インデックスを指定しない場合と同じ結果になる。
list = [-10, 1, 15, 20, 30]
list.pop()
print(list)
list.pop(-1)
print(list)
結果
[-10, 1, 15, 20]
[-10, 1, 15, 20]
●リスト内包
リスト内包とはリストを簡単に作成することができる方法。
リスト内包を使うときは角括弧「 [ ] 」を使う
例)
通常のリスト
squares = []
for x in range(10):
squares.append(x**2)
print(squares)
リストの内包
squares3 = [x**2 for x in range(10)]
print(squares3)
map関数で同じこともできる。
squares2 = list(map(lambda x: x**2, range(10)))
print(squares2)
結果
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
例を見ると通常のリストよりも、リストの内包を使った方がコードが少なくて見やすくなる。
※map関数は「map(function, iterable)」となり、function の結果を返しながらiterableの全ての要素に適用するイテレータを返します。
上記の場合「lambda x: x**2」を「range(10)」回分繰り返すという意味です。
もう一つの例
通常のリスト
num1 = []
for x in [1, 2, 3]:
for y in [3, 1, 4]:
if x != y:
num1.append((x, y))
print(num1)
リストの内包
num2 = [(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
print(num2)
結果
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
6章 モジュール
モジュールとは、Pythonの定義や文が入ったファイルのこと。
ファイル名は「.py」とついているもの。
●ヒストリ編集
pythonのデフォルト設定ではヒストリは「.python_histroy」というファイルに保存されている。ヒストリは対話型インタプリタセッションで利用できる。
●モジュールの検索パス
モジュールをインポートする場合次の順番でパスが検索される。
1.ビルドインモジュール
2.sys.path変数で得られるディレクトリのリストを使う
sys.pathは以下の場所に初期化されています。
●入力するクリプトのあるディレクトリ(ファイル名が指定されていない場合はカレントディレクトリ)
●PYTHONPATHH(ディレクトリ名のリスト。構文はシェル変数PATHと同じ)
●インストールごとのデフォルト
シンボリックリンクを置いているディレクトリはモジュール検索パスには入らない。
sys.pathは初期化後にプログラムから改変ができる。実行中のスクリプトのあるディレクトリは、検索パスの最初、標準ライブラリのパスよりも前方に置かれる。
sys.pathとはPythonがインポートするモジュールを検索するパスのリストのこと。
●コンパイル済のPythonファイル
Pythonではモジュールの読み込み高速化のため、コンパイル済のモジュールを「__pycache__」ディレクトリに「module.バージョン名.pyc」の名前でキャッシュする。
●パッケージ
パッケージとは、「ドット区切りモジュール名」を使ってPythonモジュールを構築する方法。
例えば、「モジュール名A.B」の場合、パッケージAにあるサブモジュールBのことを指す。
あるディレクトリをパッケージを含むものとして扱う場合は「__init__.py」ファイルが必要になる。
7章 入出力
●手の込んだ出力フォーマット
文字列の左側をスペースにして右詰で揃えたい時は、「str.rust()」メソッドを使う。スペース以外を利用したい場合、第2引数に値を入れる。
文字列の方が大きい場合は、何も変わらない。
char = 'aaa'
print(char.rjust(10))
print(char.rjust(10, '0'))
print(char.rjust(2))
結果
aaa
0000000aaa
aa
ゼロ埋めだけでよければ場合は「str.zfill()」を使う。
プラスとマイナスの記号も含める。
char = 'aaa'
print(char.zfill(10))
結果
0000000aaa
●ファイルの読み書き
ファイルの読み書きファイルをする場合は「open」関数を使う。
open(<ファイル名>,<モード>)というように引数を2つ与える。
モードの種類
「r」:読み取り専用 ※省略時のデフォルト
「w」:書き出し専用
「a」:追記
「r+」:読み書き
●構造のあるデータをjsonで保存
標準モジュールのjsonは、Pythonのデータ階層構造を取って文字列表現にコンバートすることができる。このプロセスを「シリアライズ」と言う。
文字列表現からデータを再構築することを「デシリアライズ」という。
シリアライズとは、「複数の並列データを直列化して送信すること」だそうです。
8章 エラーと例外
●エラーの種類
エラーには「構文エラー」と「例外」がある。
構文エラー:パース(構文解釈)上のエラーとも呼ばれる。エラーは矢印より前のトークンが原因である。
>>> matrix = [
... [1, 2, 3, 4],
... [5, 6, 7, 8],
... [9, 10, 11, 12],
... ]
Traceback (most recent call last):
File "/usr/lib/python3.8/code.py", line 63, in runsource
code = self.compile(source, filename, symbol)
File "/usr/lib/python3.8/codeop.py", line 176, in __call__
return _maybe_compile(self.compiler, source, filename, symbol)
File "/usr/lib/python3.8/codeop.py", line 104, in _maybe_compile
raise err1
File "/usr/lib/python3.8/codeop.py", line 91, in _maybe_compile
code1 = compiler(source + "\n", filename, symbol)
File "/usr/lib/python3.8/codeop.py", line 141, in __call__
codeob = compile(source, filename, symbol, self.flags, 1)
File "<input>", line 1
matrix = [
^
SyntaxError: invalid character in identifier
例外:プログラム実行中に起こるエラーのこと。
エラーの内容は、一番下の内容に記載されている。
>>> 10 * (1/0)
Traceback (most recent call last):
File "/usr/lib/python3.8/code.py", line 90, in runcode
exec(code, self.locals)
File "<input>", line 1, in <module>
ZeroDivisionError: division by zero
●エラーの種類
ZeroDivisionError:「0」で割り算された場合
ValueError:指定した型と異なる値が入っている場合
●例外の処理
プログラムは選択した例外を処理するように書くことができる。
その場合「try」文を使う。
try文の動作
・最初にtry節(キーワードtryとexceptに挟まれた文)が実行される。
・例外が送出されなければexcept節はスキップされ、try文の実行が終了する。
・try節の実行中に例外が発生すると、try節中の残りはスキップする。
・発生した例外の型がexceptキーワードの後ろで指定している例外と一致すれば、そのexcept節が実行される。そしてtry文のあとのプログラムの実行がそのまま続けられる。
・例外の型がexcept節にある名前と一致しない場合、送出された例外はさらに外側にあるtry文に渡される(try文が入れ子になっている場合)。
・最後のexcept節は例外名を書略することですべての例外に対応する。
・オプションでelse節を入れることができ、else節の位置はexcept節後ろでなければならない。else節が実行されるのは、try節が例外を送出しなかったときのみである。
・finally節はtry節、except節どちらを通っても最後に実行される。
例)
try:
int_a = 3
int_b = 0
print(int_a ** 2)
print((int_a ** 2) / int_b)
except(ValueError) as v:
print(type(v))
print('C')
except(ZeroDivisionError) :
print('D')
except:
print('E')
else:
print('F')
finally:
print('G')
結果
9
D
G
例の場合、まずtry節が実行され、int_aには3の二乗の「9」が出力される。
その後、int_bは0のためZeroDivisionErrorが発生するため、「D」が出力される。
elseはtry節を通った時にしか出力しないためスキップされ、最後にfinallyの「G」が出力される。
結果として「9、D、G」となる
9章 クラス
●スコープと名前空間
スコープ:ある名前空間から直接アクセスできるプログラムテキスト上の範囲のこと。
名前空間:名前とオブジェクトの対応付け(マッピング)のこと。
クラスや関数内の変数はローカルスコープ
グローバルスコープの変数の値を、関数やクラスの変数で変更する場合は、「nolocal」や「global」を使う。
def scope():
loc = "one" #グローバル変数
def do_local():
loc = "two" #ローカル変数
def do_nonlocal():
nonlocal loc #グローバル変数を「def scope」関数内でだけ書き換える
loc = "three"
def do_global():
global loc #グローバル変数を書き換える
loc = "four"
do_local()
print(loc)
do_nonlocal()
print(loc)
do_global()
print(loc)
scope()
print(loc)
結果
one
three
three
four
10章 標準ライブラリめぐり
●コマンドライン引数
コマンドラインの引数はsysモジュールのargv属性リストとして格納されている。
●statisticsモジュールでデータの平均、中央値、分散を求める場合
平均:mean
中央値:median
分散:variance
●mathモジュールで円周率と自然対数の底を使う
mathモジュールの使い方
import math
print(math.pi)
print(math.e)
結果
3.141592653589793
2.718281828459045
小数点の範囲を決めたい場合
print('{:.5f}, {:.3f}'.format(math.pi, math.e))
結果
3.14159
2.71828
●randomモジュールの使い方
選択肢からランダムに抽出する場合は、「random.choice」を使う。
例)random.choice(['apple', 'banana', 'lemon'])→'apple'
ランダムで重複なしの抽出をする場合は、「random.sampe」を使う。
例)random.sample(range(100), 3)→3, 93, 22
ランダムな浮動小数点を抽出する場合は、「random.random」を使う。
例)random.random→0.23213
特定の範囲の中からランダムな整数を抽出する場合は、「random.randrange」を使う
例)random.randrange(10)→2
●日付と時間
日付と時間を使う場合は次のモジュールを利用する。
from datetime import date
今日の日付を使う場合は、「date.today()」を使う。
例)today = date.today()
●コード処理の実行時間モジュール
コード処理の実行時間を測定するには、「timeit」モジュールを利用する
12章 仮想環境とパッケージ
●仮想環境の生成
仮想環境を作成、管理するには、「pyvenv」を使う。
生成する場合は、仮想環境を置きたいディレクトリに移動し、pyvenvに仮想環境のディレクトリ名を付けて実行する。
pyvenv test-env
利用する際は、アクティベートする必要がある。
●pipによるパッケージ管理
仮想環境では、pipプログラムを使ってパッケージのインストール、アップグレード、リムーブができる。
コマンド各種
・pip install パッケージ名:パッケージがインストールされる
・pip install パッケージ名 == バージョン:「==」を使うことでバージョン指定したパッケージがインストールされる
・pip install --upgrade パッケージ名:パッケージを最新のバージョンにアップグレードする
・pip uninstall パッケージ名:指定したパッケージがアンインストールされる
・pip show パッケージ名:そのパッケージの情報を表示する
・pip list:仮想環境にインストールされたパッケージの一覧を表示する
・pip freeze:「pip list」と同じくパッケージのインストール一覧を表示するが、若干出力される形式が異なる。主な使い方は出力したリストを「requirements.txt」に保存する。
test@ubuntu:~/デスクトップ/python$ pip list
Package Version
---------------------- --------------------
apturl 0.5.2
asgiref 3.2.10
test@ubuntu:~/デスクトップ/python$ pip freeze
apturl==0.5.2
asgiref==3.2.10
以上です。
この記事が気に入ったらサポートをしてみませんか?