41日目_2024/09/25
学習資料
と
Python3エンジニア認定基礎試験の概要
1章 食欲をそそってみようか
出題数
出題数:1問(2.5%)
ページ数:3P
プログラミングを始めよう
C/C++/Java:プロフェッショナルなソフトウェア開発
UNIX シェルスクリプト/Windowsパッチファイル:用途が限られる
↓
Pythonで簡単に始めよう
Pythonの特徴
①超高水準言語 = 人間が理解しやすい言語
②型の指定が不要
主なデータ型 | 説明 |
---|---|
str(文字列) | 文字列 |
int(整数) | 小数点を含まない数 |
float(浮動小数) | 小数 |
bool(真偽値) | True or False |
list(リスト) | []の中に複数の要素を「,」で区切って書く |
tuple(タプル) | ()の中に複数の要素を「,」で区切って書く |
dist(辞書) | {}の中に複数の要素を「,」で区切って書く |
list(リスト) | []の中に複数の要素を「,」で区切って書く。keyとvalueの値をペアで要素とする。 |
型の指定が不要 = 動的型付け = Pythonが実行時に判断している
③文のグルーピングがインデント
インデント = 空白
↓ 例
④モジュールで再利用可
汎用性のあるコードを再利用できる
(詳しくは6章で)
Pythonでできること
①テキストファイルの検索置換
②ファイル名の変更
③デーアベースの作成
④GUIアプリケーションの作成
⑤ゲームの作成
インタープリンタ型言語
特徴
・インタープリンタ型言語 ↔︎ コンパイラ言語(C/C++/Java)
・コンパイル/リンクが不要
・対話的に使うことができる = 同時通訳のイメージ
→インタープリンタ型げんご:機械語への変換なし
→処理速度がコンパイラ型言語より遅い(C言語で拡張が可能Cyhton)
・コンパイラ型言語の特徴
①ソースコードを機械語に変換してから実行
②処理速度がインタープリンタ型言語より速い
問題の傾向
正誤問題:次の文章の中で「正しいもの」or「誤っているもの」を選べ
42日目_2024/09/26
2章 Pythonインタープリタの使い方
1回目動画視聴
43日目_2024/09/27
2章 Pythonインタープリタの使い方
出題数
・1問(2.5%)
・該当ページ:4P分
出題傾向
正誤問題が多い
インタープリンタの起動
インタープリンタ = コードを対話的に実行できるアプリケーションのこと。
インタープリンタの種類
①「Python」と入力
・スタンダードなもの
・まずはバージョンと著作権から始まるウェルカムメッセージから始まる
・対話モード
⑴プライマリプロンプト = >>>
→コマンドの入力を促している
⑵セカンダリプロンプト = ...
→継続を表している
↓ 例
>>> x = 10
>>> if x > 5:
... print('5より大きい数字')
...
5より大きい数字
# 補足解説
Q.4行目がなぜカンダリプロンプトなのか?
A.3行目のenterで機械側は、「続きある or これで完了」がわからないから。
そのため、「...」になる。
もう一度enterすると機械側が、「これで完了なんだな」とみなし、if文の結果を表示することになる。
インタープリンタの終了方法
UNIX:Ctrl + D
Windows:Ctrl + Z
quit()
②「python -c コマンド」と入力
コマンドにある文を実行することができる
↓ 例
python -c print('test')
↓ 出力結果
test
# 補足
「""」は使用不可
③「python -m モジュール名」と入力
モジュールのソースファイル名を実行できる
↓ 例
# testモジュールのソースファイル
print('Hello World')
# モジュールのソースファイル名を実行
python -m test
↓
出力結果
Hello World
# 補足
モジュール名に拡張子(.py)はつけない
④「python -i スクリプトファイル名」と入力
スクリプトを実行した後に対話モードに入ることができる
↓ 例
num = 5
# スクリプトを実行した後に対話モードに入る
python -i test1.py
↓ 対話モードになる
>>>
# 対話モードに入力
>>> num + 5
# 10が出力される
10
コマンド行編集
コマンド行編集 = インタープリンタの中での便利な機能のこと
Ctrl + E
# 末尾へ移動
Ctrl + E
# 解説
「123456789」の1と2の間にカーソルがあるとき、
9の後ろにカーソルを持ってくることができる。
Ctrl + K
# 順方向に向かって行の残りを削除
Ctrl + K
# 解説
「123456789」の4と5の間にカーソルがあるとき、
56789を削除する。
Ctrl + N or P
# ヒストリ置換 = 過去に入力したものを参照できる
Ctrl + N or P
# なぜ参照できるのか
.python_histpryに保存されているから。
C:Users\username\.python_histpry
引数を渡す
スクリプト名と引数群はsysモジュールのargvに割り当てられている
↓ 例
スクリプト名 = test2.py
引数 = one two three
import sys
print (sys.argv)
# インタープリンタ側で以下を実行
python test2.py one two three
↓ 実行結果
# リストで返ってくる
['test2.py', 'one', 'two', 'three']
エンコーディング
エンコーディング = 一定の規則に従って、別の形式のデータに変換すること
Pythonは「UTF-8」を使用
他の「Shift_JIS」「EUC_JP」などを使う際は、以下を記載する
# UTF-8以外を使う際のルール
# 必ず1行目に記載する
-*- coding: encoding名 -*-
# 2行目に記載する場合もある
# shebang(シバン)を使うとき
# shebang = #!
↓ 例
# 今回はPython3.9を使うよ!という明示的な記述になる
#!/user/bin/env python3.9
-*- coding: encoding名 -*-
3章 Python気楽な入門編 part1
動画視聴
3章 Python気楽な入門編 part1
出題数
・6問(15%)
・ページ数:13P
・今回は、3.1.1まで
コメントアウト
コメントアウト = Pythonが解釈しない部分のこと
「#」から始まる
↓ 例
# コメントアウト
・使用用途
①コードの説明
②元のコードを残してバグ修正
文字列リテラルはコメントアウトできない
文字列リテラル = シングルクォーテーション''やダブルクォーテーション""で囲われているもののこと
↓ 例
44日目_2024/09/28
計算のルール
計算での数値の型は主に2つ
①int型(整数)
②float型(小数)
割り算は常にfloat型
整数のみ抽出したい場合
「//」を使う
型が混在する場合もfloat型
累乗の計算
「**」を使う
_(アンダースコア)
対話モードでは最後に表示した式を_(アンダースコア)に代入してある。
↓ 例
・やってはいけないこと
_に代入すること
# 以下はNG
_ = 5
3章 Python気楽な入門編 part2.1
文字列を表現する
エスケープシーケンス
エスケープシーケンス = 「\」と特定の文字の組み合わせで特殊な機能を持つ
↓ エスケープシーケンス代表例 ↓
コード | 説明 |
---|---|
\n | 改行 |
\t | タブ |
\ ' or \ " | '(")で囲われた文字列で'(")を文字として扱う |
対話型インタープリンタ
文字列は引用符に囲まれ、特殊文字はエスケープされた状態で出力される。
↓ 例
print関数
print関数 = 全体を囲う引用符を除去し、エスケープ文字や特殊文字をプリントする
# 「\n」がエスケープできていない。。。
>>> 'it\'s \nthat\'s'
"it's \nthat's"
raw文字列
raw文字列 = 特殊文字として解釈して欲しくない時に使う。
↓ 例
# たまたま「\n」がくっついてしまい、エスケープされそうになっているが、その処理ではない時
>>> print('C:\some\name')
C:\some
ame
トリプルクウォート
「'」か「"」を3つずつ記載して囲う
'''文字列''' or """文字列"""
トリプルクウォートのポイント
文字列の連結
変数や式はエラーになる(+があればOK)
改行したい時に、文字列の連結は便利
45日目_2024/09/29
3章 Python気楽な入門編 part3
3章 Python気楽な入門編 part3
文字列はインデックス指定ができる
右から数えることもできる
連結することもできる
範囲外を指定した場合はエラー
スライス
スライス = 連続した部分文字列を取得することができる
⭐️後ろの数字は-1する = 含まない
スライスの省略
スライスの連結
スライスは、範囲外を指定してもエラーにならない
種類 | 範囲外の指定 |
---|---|
文字列のインデックス番号の指定 | エラーになる |
スライスでのインデックス番号の指定 | エラーにならない |
文字列は改変できない(新しい文字列は作成可能)
↓ 例:新しい文字列を作ることは可能(改変は上記の通りできない)
ミュータブル/イミュータブル
種類 | 改変の有無 | 具体例 | id |
---|---|---|---|
イミュータブル | 改変できない | int、float、tuple、文字列 | 異なる |
ミュータブル | 改変可能 | リスト、辞書 | 同じ |
46日目_2024/09/30
ビルトイン関数
ビルトイン関数 = 最初から組み込まれている関数
↓ 例
len関数
print関数
type関数など
46日目_2024/09/30
3章 Python気楽な入門編 part4
動画視聴
47日目_2024/10/01
3章 Python気楽な入門編 part4
リスト
リストには異なる型を入れることができる。(通常は同じ型を入れる)
# 異なる型
# 以下はstr型とint型
[1, a, 2, b]
# 通常は同じ型
[1, 2, 33, 456]
48日目_2024/10/02
帰宅0時で学習できず。
49日目_2024/10/03
連結することもできる
ミュータブルである(値を改変できる)
ミュータブル/イミュータブル
種類 | 改変の有無 | 具体例 | id |
---|---|---|---|
イミュータブル | 改変できない | int、float、tuple、文字列 | 異なる |
ミュータブル | 改変可能 | リスト、辞書 | 同じ |
様々なメソッドがある
# 追加
append()
※その他は5章で取り扱う
オブジェクトの複製を伴わないポインタのコピー
簡単に言うと、インデックスやスライスは、定義されたリストの値を参照している。
だから、値がか改変されると改変された値を出力することになる。
ポインタ = 何かを指し示すもの。ポインタ変数を使って他の変数の場所を指し示している状態。
len関数が使える
リストを要素とするリストを生成可能(リストinリスト)
プログラミング始めの一歩
多重代入
カンマ区切りで、代入することができる
# 多重代入
a, b = c, d
print(a)
print(b)
↓
c
d
bool型(True、False)
Pythonの場合、先頭の文字が大文字になる。
整数が真、0が偽
# bool値確認
bool()
シーケンスの長さが0以外であれば真、空は偽
シーケンス = 要素と要素の並ぶ順序が記憶されている型のこと
例えば:リスト、文字列など
文のグルーピングは、インデント
print関数
キーワード引数end(改行の抑制と文字列の変更)
# キーワード引数end = 出力末尾の改行の抑制 + 文字列の変更が可能になる。
50日目_2024/10/04
Pythonチュートリアル 4章 制御構造ツール part1
動画視聴
出題数
・9問(22.5%)
→この章が一番問題数多い
・ページ数:20p
・4.1:if文
4.2:for文
4.3:range()関数
if文
for文
for文 = あらゆるシーケンス(リストや文字列)に対し、そのシーケンス内の順序で反復をかける
※シーケンス = 要素と要素の順序が記憶されている型 = リスト、文字列
↓ 例
辞書の中身を変更したい時は、「①新しいコレクションを作成」 or 「②コピーを反復にかける」
①新しいコレクション(辞書を作成)
items()の解説
items() = 辞書型に使用される関数。
辞書の中の キーと値のペア をタプルの形で取得する。
items()で取得したkeyとvalueをuserにkey、statusにvalueを順番に入れていく
②コピーを反復にかける
copy()の解説
・なぜcopy()を使うのか?
辞書を反復処理中に直接変更(要素を削除)すると、RuntimeError が発生することがある。
この問題を回避するために copy() メソッドを使って、元の辞書のコピーを作成し、そのコピーに対してループ処理を行っています。
これにより、元の辞書を操作しながらも安全に要素を削除することができます。
del(削除)の解説
辞書の要素の削除 = 「del 辞書オブジェクト[key]」
copyを使わない場合(エラーが起こる)
エラーが起こる
dictionary changed size during iteration
# 理由
Pythonで辞書を反復処理(ループ)している間に、その辞書の内容を変更(追加や削除)したときに発生するエラー。
辞書は反復処理中に直接変更することができないため、このエラーが出る。
辞書型
辞書型 = {}の中にkeyとvalueの組み合わせが含まれているデータのこと
# 辞書型の例
dict = {'apple': 1, 'orange': 2, 'banana': 3}
51日目_2024/10/05
range()関数
・ビルトイン関数 = Pythonがあらかじめ用意している関数
# 連続した数値の要素を持つ
# 終端値(終わりの数字は排除 -1)は持たない
range()関数
0以外の数字から始めることもOK
# 0以外の数字から始める
range(1,5)
負の数字もOK
# 後ろの数字は-1する
range(-6,-1)
増分を指定することOK
# 第一引数:スタート
# 第二引数:終了(-1する)
# 第三引数:増分(飛ばす数)
range(3,12,2)
シーケンス(文字列やリスト)のインデックス数で反復をかけたい時の方法
range()とlen()を使う
反復可能体(iterable)、反復子(iterator)
・上記画像の解説
①反復可能体(iterable)を「iter()」で反復子(iterator)に変換
反復子(iterator) = 繰り返すもの
②反復子(iterator)を「next()」で一つずつ出力する
52日目_2024/10/06
4章 制御構造ツール part2 break文・pass文・continue文を解説
動画視聴
53日目_2024/10/07
4章 制御構造ツール part2 break文・pass文・continue文を解説
else節(ループにおけるelse節)、for文ver
ループにおけるelse節 = ループが終了した場合に実行される
ループ文 = forb文、while文のこと
キーワード引数end(改行の抑制と文字列の変更)の復習
# キーワード引数end = 出力末尾の改行の抑制 + 文字列の変更が可能になる。
else節。while文ver
break文
# それを取り囲む最も内側のforやwhile文のループから抜ける
break
continue文
# ループの残りを飛ばしてループに戻る
continue
else節、break文、continue文のわかりすい表
種類 | ループでの動き |
---|---|
else節 | ループ処理の後に実行 |
break文 | それを取り囲む最も内側のforやwhile文のループから抜ける |
continue文 | # ループの残りを飛ばしてループに戻る |
pass文
# 構文的には文が必要なのに、プログラム的には何もする必要がない時に使う
pass
・役割:プレースホルダー
・プレースホルダー = 後から実際の内容を挿入するために、仮に確保した場所のこと
54日目_2024/10/08
4章 制御構造ツール part3 関数の基本
関数の基本
関数のメリット = 同じ処理を繰り返す時に定義する
例)面積の求め方
関数の公式
# 関数の定義
def 関数名(仮引数):
処理内容
# 関数の呼び出し
関数名(引数)
※補足
・仮引数はなくても良い
他の名前でも、同じ関数オブジェクトを指し示すことができ、アクセス可能
簡単に言うと、
関数の呼び出しを変数に代入して使うことも可能
↓ 例
変数について
スコープ(変数の有効範囲)とは
スコープ = 変数の有効範囲(定義した変数を使うことのできる範囲)
↓ わかりやすく
関数内で変数を呼び出しているときに、どこの変数を見に行きますか?と言うこと
スコープの順番
スコープの見にいく順番
①ローカルのシンボル表
②外側の関数のシンボル表
③グローバルのシンボル表(関数の外)
④ビルドイン名のシンボル表
変数の参照はできるが、代入はできない(代入の例外はあり)
例外
①global文 = 関数内からグローバル変数に値を代入する
②nonlocal文 = 外側の関数の変数に値を代入する
シンボル表(名前空間のディクショナリー) = 変数名や関数名などの名前(シンボル)と、それに対応する内容の情報
↓ 例
def test_func2():
a = 2
b = 5
c = 9
↓
# 関数の内容
{'a':2, 'b':5, 'c':9} ← これがシンボル表
引数について
引数はオブジェクト参照渡しで渡される
↓ わかりやすく
関数内で変更を加えた時に | |
---|---|
イミュータブル | 関数内で変更しても、関数外で変更をみえることはない |
ミュータブル | 関数内での変更が、関数外でも適用される(変更がみえる) |
docstring
docstring = 関数などの仕様をその利用者に対して説明するために記述
return文
return文 = 戻り値
※使うとき
関数の外で値を使いたい時
※注意点
関数を終了させる機能がある
return文がないと。。。
「None」が返される
return文は、関数を終了される機能がある
メソッド
メソッド = オブジェクト(リストや文字列など)に所属した関数
# メソッドの公式
オブジェクト.メソッド名()
↓ 例
# リストに追加
sample_list.append(5)
# 辞書のkeyを取得
sample_dict.keys()
4章 制御構造ツール part4 関数の引数を徹底解説
動画視聴
55日目_2024/10/09
4章 制御構造ツール part4 関数の引数を徹底解説
引数のデフォルト値
デフォルト値があると何が良いの?
仮引数で定義してある数よりも、少ない引数の数で実行できる
↓ 例:# デフォルト値の引数(address)に値を送ることもできる
デフォルト値の評価は定義している側のスコープで決まる
スコープ = その位置からどのように見えるのか
スコープの見にいく順番
①ローカルのシンボル表
②外側の関数のシンボル表
③グローバルのシンボル表(関数の外)
④ビルドイン名のシンボル表
①デフォルト値を定義していない場合
②デフォルト値を定義している場合
③デフォルト値を定義している場合(関数定義段階で変数の定義なし)
デフォルト値は1回しか評価されない(初期化されない)
以下例のようにミュータブルな値の場合、
デフォルト値の共有をされてしまう(デフォルト値の初期化はされない)
↓ 例
デフォルト値を何度も使う & 毎回初期化したい場合
・デフォルト値を「None」にする
・if文で条件をNoneならば、と言う条件を作成
・毎回空のリストや辞書を作成し、その中に引数の値を代入していくことで
毎回初期化できる(デフォルト値の共有NGにできる)
56日目_2024/10/10
キーワードin
キーワードin = シーケンス(リストや文字列)が指定の値を含むかどうかを判定する
キーワード引数
キーワード引数 = 関数を「キーワード = 値」の形でコールできる
キーワード引数の注意点
①位置引数→キーワード引数の順番に記載しないとエラーになる
②キーワード引数は、仮引数と一致する必要がある
③キーワード引数のみの場合、引数と仮引数の順番は問われない
④値は一つしか取れない
⑤辞書オブジェクトに**をつけて渡すことも可能
*名前(*arg)と**名前(**kwargs)
複数の引数を受け取ることができる
*名前(*arg)
*名前(*arg) = タプルで受け取る
*名前(*args)の後ろに仮引数がある場合はキーワード引数のみが有効である
理由:キーワード引数を設定しないと、どこまでが*argの範囲か判別できないため。
↓ 例
**名前(**kwargs)は辞書で受け取る
**名前(**kwargs) = 辞書で受け取る
# ポイント
仮引数に対応するキーワードを除いた全ての全てのキーワード引数が入る
57日目_2024/10/11
①*名前(*arg) → ②**名前(**kwargs)の順番で記載する
**名前(**kwargs)は、「最後」でのみ定義することが可能
特殊引数
位置専用引数、キーワード専用引数がある
位置専用引数
位置専用引数 = 「/」より前に記述される
キーワード専用引数
キーワード専用引数 = 「*」より後ろに記述される
特殊引数のメリット
・可読性が上がる
特殊引数の用例
位置専用引数
①APIの引数名が変更されて使えなくなるのを防ぐ
APIの仕様が変わり、引数名が変わった場合に、自分のプログラムの方からキーワード引数でAPIを呼び出していると、APIの方が引数名を変えてしまっているので、名前が違うためエラーが出てしまう
API = アプリとプログラムを繋ぐもの
②位置引数と任意個数のキーワード引数の衝突を防ぐ
キーワード専用引数
キーワードに意味があり、明示することでより理解しやすくなる
58.59日目_2024/10/12~13
4章 制御構造ツール part5 関数の引数を徹底解説
動画視聴
60日目_2024/10/14
4章 制御構造ツール part5 関数の引数を徹底解説
アンパック
アンパック = 複数の要素を持つものを分解して、各変数に代入すること。
「*」:リストやタプルをアンパック
「**」:辞書をアンパック
lambda式
lambda式 = 小さな無名関数(名前をつけるほどでもない小さい関数を使うときに使う)
# 公式
lambda 引数: 処理
↓
例) lambda a, b: a + b
入れ子になった関数同様、スコープの変数を参照できる
他の関数と組み合わせて使う
例えば、sort:listメソッド
sort:listメソッド = keyに関数を設定すると、listの各要素にその関数が適用され、戻り値によってソートされる
⭐️key = lambda 仮引数: 条件
→仮引数はリストの値がそのまま入る
解説サイト
decstring
decstring = 関数などの仕様をその利用者に対して説明するために記述
# 推奨される記述方法
①慣習的にダブルクォートのトリプルクォートが使用される
②1行目は大文字で始まり、ピリオドで終わる
③続きがある場合は2行目を空行とし、分離する
decstringの内容を表示するツール(help関数)
# decstringの内容を表示するツールを使用する際の慣習的ルール
①最初の行より後にある空白でない行をインデントの基準にする
②インデント量と等価の空白を除去する
③空白の判定はタブ文字を展開してから
help関数 = decstringの内容を表示するツール
関数アノテーション
関数アノテーション = 関数に注釈をつけることでわかりやすくする
# ポイント
①関数のいかなる部分にも影響を及ぼさない
②引数アノテーションは、引数名の後にコロンを続け、その後にアノテーションの値として評価される式を置く
③返り値アノテーションは、引数リストとdef文の終わりを表すコロンの間に置かれた->によって定義され、その後に式が続く
④.⑤は例の下で解説
④アノテーションで指定した型以外の引数を渡してもエラーにならない
⑤__anotetaions__の属性に辞書として格納されている
アノテーションで指定した型以外の引数を渡してもエラーにならない
__anotetaions__の属性に辞書として格納されている
コーディングスタイル
コーディングスタイル = Pythonコードのコーディング規約
# コーディングスタイル
PEP8:綺麗に見えるようにする一つの方法
①インデント(字下げ)はスペース4つ
②79文字以下で折り返し
③インラインコメントは書かない:コードの横にコメントアウトで記載するやつ
④カンマの後ろにはスペースを入れる:[1, 2]
⑤クラス名の頭文字は大文字で接続する:MyFavoriteClass
⑥関数やメソッドは小文字の単語同士をアンダースコアで繋ぐ:my_favorite_function
⑦エンコーディングはUTF-8、ASCⅡを使う
エンコーディング = データを一定の規則に従って符号化すること、または暗号化や記号化すること
61日目_2024/10/15
仕事が長引き学習できず。
62日目_2024/10/16
5章 データ構造 part1 リストのメソッドやリスト内包表記を解説
出題数
出題数:7問
ページ数:17
リストのメソッド
末尾にアイテムを1つ追加する:append()
・公式
append()
---
・コード例
# 末尾にアイテムを1つ追加する:append()
a = [1, 2, 3]
a.append(4)
print(a)
末尾にイテラブルを追加する:リスト名.extend(iterable)
イテラブル = 繰り返し処理が可能なオブジェクト。Pythonにおいてforループなどで順に値を取り出すことができるオブジェクトを指す。
・公式
リスト名.extend(iterable)
---
・コード例
# 末尾にイテラブルを追加する:リスト名.extend(iterable)
# 末尾にイテラブルを追加する:リスト名.extend(iterable)
b = [1, 2, 3]
b.extend(range(3))
print(b)
指定したxの最初のインデックス番号をを返す:リスト.index(x, strat, end)
・公式
リスト.index(x, strat, end)
---
・コード例
# 指定したxの最初のインデックス番号をを返す:リスト.index(x, strat, end)
d = [1, 2, 3, 4, 5, 1]
# 最初にできてくる「1」のインデックス番号を取得
print(d.index(1))
# 最初にできてくる「1」のインデックス番号を取得
# 第二引数は、開始するインデックス番号を記載する
print(d.index(1, 2))
リストの指定した値の個数を返す:count()
・公式
count()
---
・コード例
# リストの指定した値の個数を返す:count()
e = [1, 2, 3, 4, 5, 1, 100]
print(e.count(1))
指定した位置に値を挿入する:insert(場所指定, 挿入する値)
・公式
insert(場所指定, 挿入する値)
---
・コード例
# 指定した位置に値を挿入する:insert(場所指定, 挿入する値)
f = [1, 2, 3, 4, 5, 1, 100]
f.insert(2, 1000)
print(f)
リストを逆順にする:reverse()
・公式
reverse()
---
・コード例
# リストを逆順にする:reverse()
f = [1, 2, 3, 4, 5, 1, 100]
f.reverse()
print(f)
63日目_2024/10/17
指定した値と等しい最初の値を削除する:remove()
remove()
---
・コード例
# 指定した値と等しい最初の値を削除する:remove()
g = [1, 2, 3, 4, 5, 1, 100]
g.remove(100)
print(g)
指定したインデックス番号の値を削除 & その値を返す:pop()
pop()
---
・コード例
# 指定したインデックス番号の値を削除 & その値を返す:pop()
h = [1, 2, 3, 4, 5]
print(h.pop(0))
# インデックス番号がない場合は最後の値を削除&返す
print(h.pop())
print(h)
リストから全ての値を削除する:clear()
clear()
---
・コード例
# リストから全ての値を削除する:clear()
i = [1, 2, 3, 4, 5]
i.clear()
print(i)
リストをソートする:sort(key=条件, reverse=False)
sort(key=条件, reverse=False)
reverse=Trueの場合、ソートの順番を逆にする
記載無しでもOK
---
・コード例
# リストをソートする:sort(key=条件)
j = ['aaaaa', 'bbbbbb', 'cc', 'dddd']
# j.sort = jをソートする
# (key= = 条件設定
# lambda x: = lambda x:は仮引数で、ここにjの値が入る
# len(x) = 「lambda x:」に入ってきた値を「len(x)」に入れることで文字数の長さを取得 & 返す。
# その後、文字数の長さ順にソートする
j.sort(key=lambda x: len(x))
print(j)
「sort(key=条件, reverse=False)」は、インプレース(idが変更されない)
インプレース(in-place)とは、
プログラムの中で、データを新しい場所にコピーせずに、元の場所を直接変更する操作を指す。
これは、メモリや処理時間を節約できるため、効率的な処理方法の一つ。
# 「sort(key=条件, reverse=False)」は、インプレース(idが変更されない)
j = ['aaaaa', 'bbbbbb', 'cc', 'dddd']
print(j)
print(id(j))
j.sort(key=lambda x: len(x))
print(j)
print(id(j))
リストのコピーを返す:copy()
copy()
---
・コード例
# リストのコピーを返す:copy()
k = [1, 2, 3, 4, 5]
copy = k.copy()
copy[0] = 100
print(k)
print(copy)
「copy()」は、「浅いコピー」である
浅いコピーの場合、
要素がミュータブルだと動作が変わる
# 「copy()」は、「浅いコピー」である
# 浅いコピーの場合、要素がミュータブルだと動作が変わる
l = [[1, 2], 3, 4, 5]
copy = l.copy()
copy[0][1] = 100
# コピー元も変化してしまう性質がある
print(l)
print(copy)
リストの改変をするメソッドの返り値はNone:メソッドチェーンができない
メソッドチェーン = 複数のメソッドを連続して一つの文で呼び出すテクニックのこと
a = []
a.メソッドx.メソッドy
上記のようなコードは、
①aに対して、メソッドxで改変を起こし
②①に対してメソッドyを改変する
①はできるが、改変後の改変を起こすのはできない
全てのデータを比較できるわけではない
以下は比較ができないため、エラーになる
・型が異なる
・複素数 = 実数と虚数の組み合わせで表される数のこと。数直線上の数(実数)に虚数を加えることで、複素数はより広い範囲の数を扱うことができる。
64日目_2024/10/18
スタックとして使う
スタック = 最後に追加された要素を最初に取り出す
コード例)
p = [1, 2, 3]
p.append(4)
print(p)
# pop() = 最後に追加された要素 or リストの最後を削除しながら取り出す
print(p.pop())
print(p)
print(p.pop())
print(p)
キューとして使う
キュー = 最初に追加した要素を最初に取り出す
コード例)
# キュー = 先入れ先出し
# スタック = 後入れ先出し
from collections import deque
# dequeでの定義
p = deque([1, 2, 3])
p.append(4)
print(p)
# popleft() = 最初を取り出す。deque定義時に使用可能。
print(p.popleft())
print(p)
print(p.popleft())
print(p)
リスト内包表記
リスト内包表記 = リストを作成する表記方法。コンパクトにコードを記述できる。
# 公式
[式 for 任意の変数名 in イテラブルオブジェクト]
# コード例
q = [x ** 2 for x in range(10)]
print(q)
lambda式を使ったリスト内包表記
# lambda式を使ったリスト内包表記 コード例
q = list(map(lambda x: x ** 2, range(10)))
print(q)
## 解説
# map() 関数 = 指定された関数(ここでは lambda x: x ** 2)をイテラブル(ここでは range(10))の各要素に適用し、その結果を返します。
# 具体的には、range(10) の各要素に対して平方を計算します。
# 0 ** 2 = 0
# 1 ** 2 = 1
# 2 ** 2 = 4
# この結果、map() は [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] という結果を返すイテレータを生成します。
# イテレータ(iterator) = データの集合を順に1つずつ取り出して処理するためのオブジェクト
# map() はイテレータを返すため、その結果を list() でリストに変換します。
# そのため、q にはリスト [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] が代入されます。
式がタプルの場合は円括弧()が必要
# 式がタプルの場合は円括弧()が必要
r = [(x, x**2, x**3) for x in range(5)]
print(r)
if文で条件分岐することも可能
# if文で条件分岐することも可能
s = [(x**2) for x in range(5) if x > 2]
print(s)
forは1つじゃなくても良い
# forは1つじゃなくても良い
[(x, y) for x in [1, 2, 3] for y in [3, 1, 4] if x != y]
## 解説
# x = 1, y = 3 → x = 1, y = 1 → x = 1, y = 4 → x = 2, y = 3...の順で見ていく
65日目_2024/10/19
関数やメソッドが使える
abs関数(絶対値を出力する関数)
# 絶対値を出力する関数
abs()
stripメソッド(不要なスペースを埋めてくれるメソッド)
# 不要なスペースを埋めてくれる
strip()
関数内関数も使える
# 関数内関数も使える
# pi = 円周率
from math import pi
# round(a, b) = 小数点をどこまで取り出すか決める
# round(3, 3)の場合、3.142となる
[str(round(pi, u)) for u in range(1, 5)]
内側のリスト内包表記は、続くforコンテキストの中で評価される
# 内側のリスト内包表記は、続くforコンテキストの中で評価される
v = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
[[row[w] for row in v] for w in range(4)]
##解説
# w = 0 のときは、v のすべての行の0番目の要素(1, 5, 9)を取り出し、リスト [1, 5, 9] を作成します。
# 同様に、w = 1 のときは [2, 6, 10] が、w = 2 のときは [3, 7, 11] が生成されます。
# ↓ 入れ替わった新しいリストができる
#[
# [1, 5, 9], # 元のリストの1列目
# [2, 6, 10], # 元のリストの2列目
# [3, 7, 11], # 元のリストの3列目
# [4, 8, 12] # 元のリストの4列目
#]
zip関数で同じようなことができる
・zip関数 = 複数の要素を持つものを同時に取得する
・アンパック = 複数の要素を持つものを分解して各変数に代入すること(*x or **x)
---
v = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
# アンパック = 複数の要素を持つものを分解して各変数に代入すること
# zip関数 = 複数のリストやタプルの要素を同時に取得し、新しいタプルを返します。
# それぞれのリストから1つずつ要素を取り出して、並べてタプルにするのがzip()の動作です。
# zip() 関数にアンパックされた3つのリスト([1,2,3,4]など)が渡され、それらのリストから同じインデックスの要素を組み合わせてタプルにします。
print(list(zip(*v)))
66日目_2024/10/20
Pythonチュートリアル 5章 データ構造 part2 タプルや集合を解説
del文
・削除を行う
・削除したものの、値を返さない
インデックス、スライスで削除する方法
del 変数名[インデックス番号]
del 変数名[スライス]
---
# del文 インデックス、スライスで削除する方法
# インデックス番号で削除
a = [1, 2, 3, 4]
del a[0]
print(a)
# スライスで削除
# 始点、終点の記載がないと全ての値を削除する
del a[:]
print(a)
変数を丸ごと削除する
del 変数名
注意点:変数を丸ごと削除した場合、その後にその変数を参照するとエラーになる(変数が定義されてないよ)
---
a = [1, 2, 3, 4]
del a
print(a)
タプル
タプル = シーケンスの一つ
(シーケンス = 連続した値)
タプルはカンマで区切られた値からなる
t = 10, 'a', [1, 2]
print(t)
注意点
・入力の際、囲みの()はなくても良い
・式の一部として使っている場合は必要
タプルはイミュータブルである(値を改変できない)
# タプルはイミュータブルである(値を改変できない)
a = 1, 2, 3
a[0] = 100
タプルの入れ子構造
a = 't', [1, 'a', 100]
b = a, (10, 'a', [1, 2])
print(b)
アイテム数が特殊なタプル
アイテム数が0のタプル
タプル名 = ()
---
empty = ()
print(empty)
print(type(empty))
アイテム数が1のタプル
タプル名 = 値,
---
single = 'hello',
print(single)
print(type(single))
タプルへのアクセス
アンパック
アンパック = 複数の要素を持つものを分解して各変数に代入すること
---
# タプルのパッキング = 「v = (12345, 67890, 'aaaaa')」
v = (12345, 67890, 'aaaaa')
# シーケンス・アンパッキング = 「a, b, c = v」
# シーケンス = 要素が順番に並んだデータ構造のこと
a, b, c = v
print(a)
print(b)
print(c)
インデックス
67日目_2024/10/21
namedtaple
namedtaple = 属性やインデックスで要素にアクセスできるタプル
---
from collections import namedtuple
# 'Person':クラス
# 'id', 'name', 'age':属性
Person = namedtuple('Person', ('id name age'))
# インスタンス化
p = Person(1, 'Bob', 20)
# 属性を出力
print(p.id)
print(p.name)
print(p.age)
# インデックスで出力
print(p[0])
print(p[1])
print(p[2])
集合
集合 = 重複しない要素を順不同に集めたもの
・使い方
{} or set関数 のどちらかを使用する
---
# 集合 = 重複しない要素を順不同に集めたもの
# {} or set関数 のどちらかを使用する
# 重複が削除される
set1 = {'a', 's', 'b', 'x', 's', 'b'}
print(set1)
---
set2 = set('aannfnlas')
print(set2)
68日目_2024/10/22
空の集合にはset関数を使用する
# 空の集合にはset関数を使用する
empty = set()
print(empty)
print(type(empty))
集合の存在判定
inを使う
---
# 集合の存在判定 = inを使う
set1 = {'a', 's', 'b', 'x', 's', 'b'}
print('a' in set1)
print('c' in set1)
集合の演算
和集合
和集合 = AとBの全て
「|」を使う
---
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b)
差集合
差集合 = Aに存在して、Bに存在しない要素(Bに要素はAにあっても弾かれる)
「-」を使う
---
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a - b)
積集合
積集合 = AとB両方にある要素のみ
「&」を使う
---
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b)
対象差集合
対象差集合 = AとBに共通するものを除いた全ての要素
「^」を使う
---
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a ^ b)
ser内包表記
リスト内包表記のser内包表記版
x = {n ** 2 for n in range(10)}
print(x)
69日目_2024/10/23
Pythonチュートリアル 5章 データ構造 part3 辞書の基本とループのテクニックを解説
ディクショナリ
# ディクショナリの使い方
key: valueのペア
---
x = {1: 'one', 'apple': 5, ('a', 5): 'tuple'}
辞書はキー(変更不能な型)でインデックス化
・変更不能な型 = 文字列、数値、タプルなど
・タプルは変更可能なオブジェクトを含んだ場合エラーになる
空の辞書を作成
x = {}
delで削除が可能
del 辞書名[キー]
「キー = 新しい値」で辞書の内容を変更できる
辞書名[既存のキー] = 新しい値
辞書にないキーを指定した場合は追加される
辞書名[新規のキー] = 新しい値
keyを指定すると値を取り出すことができる
存在しないkeyを使うとエラーになる
辞書オブジェクトに対しlist()を実行すると、keyからなるリストを返す
辞書 = {}
list(辞書)
ソートされたリストを出したい場合、sortedを使用する
辞書 = {}
sorted(辞書)
70日目_2024/10/24
keyが辞書にあるか調べるにはinを使う
辞書内包表記を使って、任意のkeyとvalueのペアから辞書を作ることができる
dict()コンストラクタ
コンストラクタ = クラスからオブジェクトを生成するときに実行されるメソッド
# 2つの公式
・dict([('a', x), ('b', y), ('c', z)])
・dict('a'=x, 'b'=y, 'c'=z)
復習:listコンストラクタ
ループのテクニック
itemsメソッド(keyとvalueを同時に取り出す)
keys = {1: 'a', 2: 'b', 3: 'c'}
for k, v in keys.items():
print(k, v)
enumerate関数(要素のインデックス&要素を同時に取り出す)
for i, v in enumerate(['a', 'b', 'c']):
print(i, v)
71日目_2024/10/25
zip関数を使うと各要素をひと組みにすることができる
num_list = [1, 2, 3]
str_list = ['a', 'b', 'c']
for n, s in zip(num_list, str_list):
print(n, s)
reversed関数(逆方向でループ処理)
for i in reversed(range(1, 10, 2)):
print(i)
set()とsorted()で、ソートされた順序で、同一要素に一度のみアクセスすることができる
# 重複を消す
set()
---
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for f in sorted(set(basket)):
print(f)
ループ内でリストを変更したい場合は、代わりに新しいリストを作った方が安全
# Nanを削除したい場合の方法(新しいリストを作成)
import math
raw_data = [56.2, float('NaN'), float('NaN'), 47.8, 51.7, 55.3, 53.7, 42.2]
filtered_data = []
for value in raw_data:
if not math.isnan(value):
filtered_data.append(value)
print(filtered_data)
72日目_2024/10/26
Pythonチュートリアル 5章 データ構造 part4 演算子の基本を解説
比較演算子
in
# シーケンス(リストや文字列)が指定の値を含むかどうかを判定する
in
---
'a' in 'abc'
is
# 同じオブジェクトかどうかを判別する
is
---
a = [1, 2, 3]
b = [1, 2, 3]
print(a is a)
---
a = [1, 2, 3]
b = [1, 2, 3]
# 同じ値だが、同じオブジェクトではないためFalseになる
print(a is b)
同じ値かを調べたい場合は「=」を使う
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b)
ブール演算子(and/or/not)
and/or/notが混在する場合の優先順位
not > and > or
andの評価方法
式「x and y」はまず「x」を評価する
↓
xが偽ならxを返し、それ以外はyを評価し、yを返す
orの評価方法
式「x ory」はまず「x」を評価しする
↓
xが真ならxを返し、それ以外はyを評価し、yを返す
and/or/notの例題
True and not True or True
→True
なぜTrueになるのか解説
①and/or/notが混在する場合の優先順位「not > and > or」
そのためnotから始める
「not True」は、「False」になる
②次にandをみる
andの評価方法
式「x and y」はまず「x」を評価する
↓
xが偽ならxを返し、それ以外はyを評価し、yを返す
# 例題
True and not True or True
↓
True and ①False or True
↓
「True and ①False」をみる
↓
・x(True)は偽ではないため、y(False)を評価し、yを返す
↓
②False or True
③最後にorをみる
式「x or y」はまず「x」を評価しする
↓
xが真ならxを返し、それ以外はyを評価し、yを返す
# 例題
True and not True or True
↓
True and ①False or True
↓
「True and ①False」をみる
↓
・x(True)は偽ではないため、y(False)を評価し、yを返す
↓
②False or True
↓
ここから
↓
③False or True
・x(False)は真ではないため、y(True)を評価し、yを返す
↓
結果、「True」になる
ブール演算子は短絡演算子
演算子の引数は左から右へと順番に評価され、結果が確定した時点で評価を止める
AとCが真で、Bが偽の時、「A and B and C」はCを評価しない
# AとCが真で、Bが偽の時、「A and B and C」はCを評価しない
# 演算子の引数は左から右へと順番に評価され、結果が確定した時点で評価を止める
A and B and C
↓
Ture and False and Ture
↓
「A and B」で確定した結果を返す。Cは評価しない。
→False
ブール値以外を使うことができる
# 空文字はFlaseになる。それ以外はTrueになる。
bool('') = Flase
---
返り値は最後に評価された引数
---
式「x or y」はまず「x」を評価しする
↓
xが真ならxを返し、それ以外はyを評価し、yを返す
セイウチ演算子
セイウチ演算子 = 式中での代入が可能になる演算子
---
a = (b := 5) + 9
print(a)
# 上記コードの解説
(b := 5)は、変数 b に 5 が代入される。
(b := 5)は、「b = 5」になっている。
※「b := 5」を「b = 5」で記述すると構文エラーになるので注意
要するに、
a = (b := 5) + 9は、
→a = b(5が代入済) + 9
→a = 14
となる。
73日目_2024/10/27
比較
比較 = 辞書的順序(辞書の並び方)で行う
シーケンスの要素が尽きるまで比較を続ける
要素が同じシーケンス型であれば、そのシーケンス間での比較を再帰的に行う
全ての比較結果が等しい時、シーケンスは等しいとみなされる
短い方のシーケンスが、小さいシーケンスとみなされる
文字列の比較:ord()関数
print(ord('a'))
print(ord('A'))
print(ord('Z'))
異なる型でも、比較順序がある場合は比較可能
比較順序がない場合はtype errerになる
Python基礎試験問題集:1章
問題解いた
結果:×以外は正解
1
2:×
3
4
5
6
7
8
9:×
Pythonチュートリアル 6章 モジュール part1 モジュールの基礎を学ぶ
出題数
問題数:2問
ページ数:13ページ
モジュール/パッケージ/ライブラリ
モジュール
モジュール = 便利な関数やクラスを取り入れることができるもの
・定義や文が入ったファイルのこと
・スクリプトファイル(.pyがついたファイルのこと)の一つ一つ
パッケージ
パッケージ = 複数のモジュールが集合したもの(ディレクトリ構造)
・「__init__.py」という名前のファイルを持つ
・__path__属性を持つ
ライブラリ
ライブラリ = モジュールとパッケージが集合したもの
74日目_2024/10/28
import/from/as
import:モジュールにアクセスすることができる
# import:先頭に記載するのが慣習
>>> import calc
# モジュール.関数名()
>>> calc.square(2)
4
関数にはモジュール名を使ってアクセス
>>> import calc
# モジュール.関数名() ← ここ
>>> calc.square(2)
4
ローカルな名前に代入することができる
>>> import calc
# モジュール.関数名
# ローカルな名前に代入
>>> c = calc.square
# 呼び出し
>>> c(2)
4
from:特定の関数にimportすることができる
# clacモジュールのcube関数にアクセスする
>>> from clac import cube
# 呼び出し
>>> cube(2)
8
75日目_2024/10/29
76日目_2024/10/30
仕事の関係上、学習できず。
問題集の復習は完了
77日目_2024/10/31
「from モジュール名 import 関数名」の場合、モジュール名は定義されていない
>>> from clac import cube
>>> cube(2)
8
↓
「from clac import cube」は関数めいの定義をしているが、モジュール名の定義をしていない。
そのため、以下のようにモジュールを通して呼び出そうとするとエラーになる。
>>> from clac import square
>>> clac.square(2)
エラー
「from モジュール名 import *」:_以外で始まる全ての名前(クラス、関数)をimportできる
_ = 外部に公開したくないもの
↓ 例 「from モジュール名 import *」
as:指定した名前でimportできる
>>> import calc as cl
>>> cl.cube(4)
64
モジュールについて
変数にもアクセスできる
>>> import test3
>>> print(test3.a)
5
>>> test3.a = 9
>>> print(test3.a)
9
モジュールは一回しかimportされない
モジュールを修正した場合は、再起動かimportlib.rekload()を使う
>>> import importlib
>>> importlib.reload(モジュール名)
__name__の値がモジュール名
# test2はtest1を読み込んでいて、
# test1は「__name__」を出力する。
# 「__name__」は、モジュール名を出力する関数名となっている。
>>> python test2.py
test1
# トップレベルで実行する場合は__main__となる
>>> python test1.py
__name__
モジュール名が__name__ならば
# 「このモジュールをトップレベルで実行するならば」
if __name__ == '__main__'
ythonチュートリアル 6章 モジュール part2 if name == "main": の動作を確認
モジュールをスクリプトとして実行
__name__がモジュール名になる(復習)
# test2はtest1を読み込んでいて、test1は「__name__」を出力する。
# 「__name__」は、モジュール名を出力する関数名となっている。
>>> python test2.py
test1
# 直接実行した場合
# トップレベルで実行する場合は、__main__
>>> python test1.py
__main__
if name == 'main':(復習)
↓
importとして使う(トップレベルではない)時は、
「if name == 'main':」以下の処理は走らない。
モジュールの検索パス
①モジュールを探す時、インタープリンタはまずその名前の組み込みモジュール(python自体に組み込まれている)を探す
# モジュールの一覧を探す方法
sys.builtin_module_names
②見つからなかった場合は、sys.pathにあるディレクトリのリストの中から探す
sys.pathは以下の場所に初期化される
①入力されたスクリプトのあるディレクトリ(ファイルの指定がない場合はカレントディレクトリ)
②PYTHONPATH
③②以降は、インストールごとのデフォルトが表示される
ポイント
シンボリックリンクは検索パスに追加されない
・シンボリックリンクは、ショートカットのイメージでOK
・元のファイルと、シンボリックファイルが別の場所にあったとして、シンボリックファイルは検索パスに入らない
78日目_2024/11/1
学習
79日目_2024/11/2
sys.pathは修正できる
リストの操作で改変できる
変数.pop()とか変数.append()など
スクリプトファイルを含むディレクトリが検索パスの先頭
標準ライブラリと同名のものがある場合はインポート時に注意が必要
・インポートの優先順位
①スクリプトファイルを含むディレクトリ
②Pythonパス
③インストールごとのデフォルト
・標準ライブラリは③に含まれる
①と②に同名のライブラリがある場合、そちらが優先されてしまう
コンパイルされたモジュール
モジュールを読み込む
モジュールの読み込みを高速化するため、コンパイル済みの各モジュールを__pycache__ディレクトリのmodule.version.pycファイルとしてキャッシュする
キャッシュ = アクセスしたサイトや起動させたアプリなどのデータを一時的に保存しておく技術。
1からデータを読み込む必要がなくなるため、サイトの表示やアプリの動作の速度を上げることができる。
# 上記の画像の例なら以下のようにimportする
>>> import test
キャッシュのチェックが自動で行われる
・ソースの変更日時をコンパイル済みのものと比較し、コンパイル済みのものが最新でなければ再コンパイル
キャッシュのチェックが自動で行われない場合
①コマンドラインから直接モジュールが読み込まれた場合
例)testファイルを呼び出すために、test2ファイルを呼び出す(testを呼び出す関数があるなど)
②ソースモジュール(元々のモジュール)のない場合
コンパイル済みのファイルを使う場合は、pycファイルをソースディレクトリに置く必要がある。
以下画像で言うと、test.pyがない場合、testcpython-38.pycをソースディレクトリの位置に置く必要がある。
プラットフォーム非依存
特定のOS(Windows、Mac)に依存しない
80日目_2024/11/3
Pythonチュートリアル 6章 モジュール part3 組み込みモジュール・dir()関数を解説
標準モジュール
・標準モジュール = Pythonではインタープリンタに組み込まれているモジュールがある
・インタープリンタ = プログラムの中身をコンピュータがわかる言葉(機械語)へ翻訳しながら実行すること
# モジュール名の一覧確認方法
sys.builtin_module_names
プラットフォーム依存のもの
winregモジュール = Windowsのみのもの
全てのインタープリンタに組み込まれているもの
sysモジュール = プライマリプロンプトとセカンダリプロンプトが定義されている
import sys
# プライマリプロンプト(変数なので置き換え代入も可能)
sys.ps1
# セカンダリプロンプト(変数なので置き換え代入も可能)
sys.ps2
sys.path
sys.path = インタープリンタのモジュール検索パスを指定する文字列のリスト
・sys.pathの記載されている順番(上記画像を見ながら)
①入力されたスクリプトのあるディレクトリ(ファイルの指定がない場合はカレントディレクトリ)
②PYTHONPATH(自身で設定できる環境変数)
③インストールごとのデフォルト
①と②以降のこと
sys.pathは修正することが可能:リスト操作で改変可能
81日目_2024/11/4
発熱のため学習できず
82日目_2024/11/5
dir()関数
# モジュールが定義している名前を確認するのに使う
dir()関数
引数なしの場合は現在のローカルスコープで定義されている名前のリストを返す
組み込みの関数名や変数名はリストアップしない
Pythonチュートリアル 6章 モジュール part4 パッケージの基本を解説
パッケージ
ドットつきモジュール名を使って構造化する方法 = パッケージ
# パッケージAにあるサブモジュールB
# モジュール名の衝突を気にせずに済む
モジュール名A.B
インポート方法
モジュール同様、sys.pathからインストールされる
特定のモジュールをインポート
あるパッケージの中から特定のモジュールをインポートする方法
func3()を呼び出す方法3個
①import.サブアイテム.サブサブアイテム
# 最後のサブサブアイテム以外はパッケージでなければならない
# 最後の要素はモジュール or パッケージ
import.サブアイテム.サブサブアイテム
②from パッケージ import アイテム
# アイテムには、サブパッケージ/サブモジュール/関数/変数などが入る
# まずはパッケージ(__init__.pyで定義されているか確認する)
from パッケージ import アイテム
まずはパッケージ(init.pyで定義されているか確認する)
↓ 例題
↓
解説
①__init__.pyが先に読み込まれる
②module2.pyを呼び出すと、①で読み込まれたmodule2の中身が呼び出される
③①と②がなかれば、module2.pyの中身が呼び出される
init.py
ファイルを含むディレクトリをパッケージとして扱うために必要
↓
よくある名前のディレクトリが誤ってimportされるのを防ぐ
↓ 例題
以下画像の優先順位とは、「sys.pathの読み込みの順位 = moduleを読み込む優先順位」
↓
・解説
左側の方が優先順位は高いが、
「init.py」の方がさらに優先順位上位のため、優先順位2位が呼び出されている
初期化コードを実行したり、 __ all __.py変数を設定できる
・ここで言う初期化 = 使い始められるように、最初の状態に整えること
・なければ空で大丈夫
例えば
init.pyに読み込みを書いておくと以下のようなことができる
↓
Python3.3以降は、__ init __.pyがなくてもimportができる
ただし、namespaceパッケージが必要になる
83日目_2024/11/6
Pythonチュートリアル 6章 モジュール part5 all・相対インポートなどを解説
パッケージから*をimportする
__all__変数
__all__で定義されているものだけ使用可能である。
定義していないとエラーになる
↓
↓
新バージョンをリリースするときにリストを最新の状態に更新するのはパッケージの作者の責任(サポートしないことにしても構わない)
__all__が定義されていないと?
↓
定義されていないものは全てimportしない
↓
ただし、package、subpackageはimportされる(本体はimportされる)
package、subpackageはimportされる(本体はimportされる)
解説
「from package.subpackage import *」の段階では、module1.pyはimportされていないが、
subpackage自体はimportされており、なおかつ
subpackage\__init__.pyに相対importの「from.import module1」でimportされているため、
funci関数を呼び出すことが可能になる。
相対import(相対パスのようなもの)
# 例)下記画像
# . = module1から見て、現在のパッケージを示す
# 「..」で一個下のパッケージを示す
from . import module1
パッケージで定義されている名前を全てimportする
# 復習
dir() = スコープで定義されている関数を全て確認できる関数
__init__.pyで定義された名前と、明示的にロードされたサブモジュールが含まれる
__all__はあまり良い書き方ではない
・特定のモジュールでは、特定のパターンに従った名前のみを公開するように設計されているが、製品コードでは良いことではない
・以下の書き方が推奨されている(ただし、importを行うmoduleが他パッケージのサブモジュールと名前衝突がない場合)
from package import specific_submodule
84日目_2024/11/7
パッケージ内参照
パッケージ内参照 = 兄弟関係にあるパッケージは絶対importもしくは相対importで使うことができる
相対import
mainモジュールとして使用する場合は使えないので注意
↓
解説
メインモジュールとして使うと、「package\subpackage3\module3.py」が「package\subpackage3_main_.py」に変わってしまい、「module3.py」を探すことができなくなってしまう
複数のディレクトリにまたがるパッケージ
↓ 仮にパッケージ名が同じでもカレントディレクトリからデスクトップのモジュールを取得しようとしてもエラーになる(ディレクトリの違うところからimportはできない)
↓ __path__を改変することで、カレントディレクトリからデスクトップのモジュールを取得できるようになる
・__path__を拡張する文を記載
→sys.pathにパッケージ名があればimportができるように拡張
※__path__がどのように拡張されたのか
↓ エラーの時の__path__の中身
↓ 拡張した時の__path__の中身(デスクトップパッケージ、カレントディレクトリパッケージの2つが追加されている)
Pythonチュートリアル 7章 入力と出力 part1 出力フォーマットの基本を解説
出題数
・1問(2.5%)
・11ページ
値を出力する方法:ファイルオブジェクトのwrite()メソッド
・ファイルオブジェクト = ファイルを読み書きするためのデータ
# ファイルオブジェクトの記載方法
# 以下は「sample.txtを書き込みモードで開く」指示
f = open('sample.txt', 'w')
↓ ファイルオブジェクトに書き込む
# ファイルオブジェクトに書き込む方法
# 以下は「f(=上記で設定したsample.txtのファイルオブジェクト)に「sampleテキスト」を書き込む」指示
f.write('sampleテキスト')
標準出力のファイルオブジェクトはsys.stdoutとして参照できる
・標準出力 = 画面上のこと
sys.stdout.write('sampleテキスト')
出力をフォーマットする方法
フォーマット済み文字列リテラル(短くしてf-stringとも呼ぶ)
文字列の頭に「f」or「F」を付け、式を{}の間に書くことで、変数やリテラル値(文字列、数値など)を参照できる
→ここでいう式とは、1つの値を返すもの
例
year = 2024
place = 'Tokyo'
f'I was born in {place} in {year}'
str.format()メソッド
・f-stringより文が長くなる
↓ 例
# str.format()メソッド
year = 2024
place = 'Tokyo'
'I was born in {} in {}'.format(place, year)
str.format()メソッドは細かい指示を出すことができる
# str.format()メソッドは細かい指示を出すことができる
yes_votes = 42_572_654
no_votes = 43_132_495
# :n = テキストの幅を指定
# % = %表示に変換
# .2 = 小数点以下の桁数
'{:15} YES votes {:10.2%}'.format(yes_votes, no_votes)
85日目_2024/11/8
風邪寝込み
86日目_2024/11/9
str関数とrepr関数
数値やリストなどは同じ表現を返す
文字列は、2つの異なる表現を持つ
str()とrepr()の違い
str() = 人間に読ませる
repr() = インタープリンタが読める内容
stringモジュール
標準モジュールの一つ
str関数ではない
stringモジュールのTemplateクラスで文字列を置き換えることができる
例1
# stringモジュールのTemplateクラス
from string import Template
# 代入に使う辞書を生成
d = dict(who='I', what='cake')
# インスタンスを生成
s = Template('$who likes $what')
# テンプレートを展開して文字列を生成(substituteメソッドで展開)
print(s.substitute(d))
---
解説
・「$X」をプレースホルダーにしてディクショナリの値と置き換える
プレースホルダー = 後から実際の内容を挿入するために、仮に確保した場所のこと
例2
d = dict(value='study')
s = Template('The peresent progressive from of "$value" is "${value}ing".')
print(s.substitute(d))
Pythonチュートリアル 7章 入力と出力 part2 f-string・str.format()などを解説
フォーマット済み文字列リテラル(短くしてf-stringとも呼ぶ)
# 文字列の頭に「f」or「F」をつけ、式を{}の間に書くことで、変数やリテラル値を参照できる
# 式 = 1つの値を返すもの
year = 2024
place = 'Tokyo'
f'I was born in {place} in {year}'
オプションのフォーマット指定子を式の後ろにつけることができる
①小数点を丸める
import math
# f = 小数点を示すフォーマット指定子。.2fで小数点2位まで示す。
print(f'The value of pi is {math.pi:.2f}.')
②「:n」で最小の文字幅を指定
例題1
table = {'tanaka': 2139, 'suzuki': 1123, 'kimura': 8456}
for name, phone in table.items():
# d = 10進数
print(f'{name:10} ==> {phone:10d}')
例題2:# 10文字以上の場合
# 10文字以上の場合は、幅を超えて表示
table = {'tanaka': 213900000000, 'suzuki': 1123, 'kimura': 8456}
for name, phone in table.items():
print(f'{name:10} ==> {phone:10d}')
③!s、!r、!a(str()、repr()、ascii())
# 非ascii文字をUnicodeエスケープする
ascii()
例題1
animil = 'dog'
f'My favorite animal is {animil}'
---
animil = 'dog'
f'My favorite animal is {animil!r}'
str.format()メソッド
year = 2024
place = 'Tokyo'
# {} = フォーマットフィールドと言う
'I was born in {} in {}'.format(year, place)
括弧の中の数字がオブジェクトの位置を示している
# 括弧の中の数字がオブジェクトの位置を示している
year = 2024
place = 'Tokyo'
'I was born in {1} in {0}'.format(place, year)
キーワード引数も使える
# キーワード引数も使える
'I was born in {place} in {year}'.format(place='Tokyo', year=2024)
位置引数 + キーワード引数
'I was born in {place} in {0}'.format(2024, place='Tokyo')
辞書を引数に渡して、'[]'を使って辞書のキーで参照できる
dict1 = {'year': 2024}
dict2 = {'place': 'Tokyo'}
'I was born in {1[place]} in {0[year]}'.format(dict1, dict2)
↓
長い書式文字列があり、それを分割したくない場合は、変数を名前で参照できると良い
→位置引数は可読性が落ちるため、キーワード引数が推奨されている
**記法を使ってキーワード引数として渡す方法(ディクショナリのアンパック)
# **記法を使ってキーワード引数として渡す方法(ディクショナリのアンパック)
dict = {'year': 2024, 'place': 'Tokyo'}
'I was born in {place} in {year}'.format(**dict)
vars()関数
手作業でのフォーマット
str.rjust()、str.ljust()、str.center()
入力文字が長すぎる場合、文字列を切り詰めることはせず、値をそのまま返す
どうしても切り詰めたい場合は、スライス表記を使う
str.format()のように出力しているのではなく、新しい文字列を生成している
str.zfill()メソッド
87日目_2024/11/10
古い文字列書式設定方法
# 'string'の中の%はvaluesの余りの要素に置き換えられる
'string' % values
Pythonチュートリアル 7章 入力と出力 part3 open関数・withキーワードを解説
open() = ファイルオブジェクトを返す
# 公式
open(filename, mode, encoding=None)
# 使い方例
>>> f = open('sample.txt', 'w', encoding='utf-8')
↓ 解説
第一引数:ファイル名の「文字列」
第二引数:モードを選択
読み込み専用:r
書き込み専用:w
追記用 :a
読み書き両用:r+
省略の場合 :自動でrになる
第三引数:エンコーディング
エンコーディング = 人間とコンピュータのやり取りで必要な対応表
エンコード = 一定の規則(エンコーディングのこと)に従って、別の形式のデータに変換すること
デコード = データを元の形式に戻すこと(エンコードの逆)
エンコーディングは指定がなければ、プラットフォーム依存
# エンコーディングの確認
import locale
locale.getpreferredencoding(False)
バイナリモード
bytesモードで読み書きする(以下画像のように、先頭に「b」がついているものがbytesモード)
bytesモードはエンコーディングを指定できない
バイナリデータはバイナリモードで
・テキストモードの読み取りでは、行末記号(Unixでは¥n、Windowsでは¥r¥n)を¥nに変換するのがデフォルト
・テキストモードの書き込みでは、¥nをプラットフォーム固有の行末記号に戻すのがデフォルト(open関数のnewlineで変換することができる)
・テキストファイルは問題ないが、バイナリファイルはデータを破壊する恐れがある