0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

3章:Python3エンジニア認定基礎試験:試験基礎学習

Last updated at Posted at 2024-09-25

41日目_2024/09/25

学習資料

Python3エンジニア認定基礎試験の概要

スクリーンショット 2024-09-25 22.45.39.png

スクリーンショット 2024-09-25 22.46.24.png

スクリーンショット 2024-09-25 22.47.02.png

スクリーンショット 2024-09-25 22.47.32.png

スクリーンショット 2024-09-25 22.48.11.png

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が実行時に判断している

③文のグルーピングがインデント
インデント = 空白
↓ 例
スクリーンショット 2024-09-25 23.31.39.png

④モジュールで再利用可
汎用性のあるコードを再利用できる
(詳しくは6章で)

Pythonでできること

①テキストファイルの検索置換
②ファイル名の変更
③デーアベースの作成
④GUIアプリケーションの作成
スクリーンショット 2024-09-25 23.37.07.png
⑤ゲームの作成

インタープリンタ型言語

特徴
・インタープリンタ型言語 ↔︎ コンパイラ言語(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.py
# testモジュールのソースファイル
print('Hello World')
# モジュールのソースファイル名を実行
python -m test

↓
出力結果
Hello World


# 補足
モジュール名に拡張子(.py)はつけない
④「python -i スクリプトファイル名」と入力

スクリプトを実行した後に対話モードに入ることができる
↓ 例

test1.py
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

test2.py
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が解釈しない部分のこと

「#」から始まる
↓ 例
# コメントアウト

・使用用途
①コードの説明
②元のコードを残してバグ修正

文字列リテラルはコメントアウトできない

文字列リテラル = シングルクォーテーション''やダブルクォーテーション""で囲われているもののこと
↓ 例
スクリーンショット 2024-09-27 19.46.58.png

44日目_2024/09/28

計算のルール

計算での数値の型は主に2つ

①int型(整数)
②float型(小数)

割り算は常にfloat型

↓ 例
スクリーンショット 2024-09-28 9.11.18.png

整数のみ抽出したい場合
「//」を使う

↓ 例
スクリーンショット 2024-09-28 9.12.18.png

型が混在する場合もfloat型

↓ 例
スクリーンショット 2024-09-28 9.14.29.png

累乗の計算

「**」を使う

↓ 例
スクリーンショット 2024-09-28 9.16.23.png

_(アンダースコア)

対話モードでは最後に表示した式を_(アンダースコア)に代入してある。
↓ 例
スクリーンショット 2024-09-28 9.19.44.png

・やってはいけないこと
_に代入すること

# 以下はNG
_ = 5

3章 Python気楽な入門編 part2.1

文字列を表現する

エスケープシーケンス

エスケープシーケンス = 「\」と特定の文字の組み合わせで特殊な機能を持つ

↓ エスケープシーケンス代表例 ↓

コード 説明
\n 改行
\t タブ
\ ' or \ " '(")で囲われた文字列で'(")を文字として扱う

対話型インタープリンタ

文字列は引用符に囲まれ、特殊文字はエスケープされた状態で出力される。
↓ 例
スクリーンショット 2024-09-28 20.50.09.png

スクリーンショット 2024-09-28 21.18.58.png

print関数

print関数 = 全体を囲う引用符を除去し、エスケープ文字や特殊文字をプリントする

# 「\n」がエスケープできていない。。。
>>> 'it\'s \nthat\'s'
"it's \nthat's"

↓ print関数を使うと?
スクリーンショット 2024-09-28 21.23.03.png

raw文字列

raw文字列 = 特殊文字として解釈して欲しくない時に使う。
↓ 例

# たまたま「\n」がくっついてしまい、エスケープされそうになっているが、その処理ではない時
>>> print('C:\some\name')
C:\some
ame

↓ 解決する方法
スクリーンショット 2024-09-28 21.29.21.png

トリプルクウォート

「'」か「"」を3つずつ記載して囲う
'''文字列''' or """文字列"""
トリプルクウォートのポイント

①複数行に渡り書くことができる
スクリーンショット 2024-09-28 21.35.57.png

②\で行末文字を避けることができる
スクリーンショット 2024-09-28 21.38.47.png

前後で改行を消す方法
スクリーンショット 2024-09-28 22.35.49.png

文字列の連結

列挙された文字列リテラルは自動的に連結される。
↓ 例
スクリーンショット 2024-09-28 21.41.02.png

変数や式はエラーになる(+があればOK)

ただし、「+」を使えばOK
↓ 例
スクリーンショット 2024-09-28 21.43.58.png

改行したい時に、文字列の連結は便利

スクリーンショット 2024-09-28 21.46.05.png

45日目_2024/09/29

3章 Python気楽な入門編 part3

3章 Python気楽な入門編 part3

文字列はインデックス指定ができる

↓ 例
スクリーンショット 2024-09-29 21.27.18.png

右から数えることもできる

⭐️0と-0は同じ。だから-1から始まる
↓ 例
スクリーンショット 2024-09-29 21.29.15.png

連結することもできる

↓ 例
スクリーンショット 2024-09-29 21.30.29.png

範囲外を指定した場合はエラー

↓ 例
スクリーンショット 2024-09-29 21.31.44.png

スライス

スライス = 連続した部分文字列を取得することができる
⭐️後ろの数字は-1する = 含まない

↓ 例
スクリーンショット 2024-09-29 21.38.30.png

スライスの省略

↓ 例
スクリーンショット 2024-09-29 21.41.42.png

スライスの連結

↓ 例
スクリーンショット 2024-09-29 21.43.55.png

スライスは、範囲外を指定してもエラーにならない

種類 範囲外の指定
文字列のインデックス番号の指定 エラーになる
スライスでのインデックス番号の指定 エラーにならない

↓ 例
スクリーンショット 2024-09-29 21.47.07.png

文字列は改変できない(新しい文字列は作成可能)

↓ 例
スクリーンショット 2024-09-29 21.51.06.png

↓ 例:新しい文字列を作ることは可能(改変は上記の通りできない)
スクリーンショット 2024-09-29 21.52.45.png

ミュータブル/イミュータブル

種類 改変の有無 具体例 id
イミュータブル 改変できない int、float、tuple、文字列 異なる
ミュータブル 改変可能 リスト、辞書 同じ

↓ ミュータブルの例
スクリーンショット 2024-09-30 21.59.33.png

↓ イミュータブルの例
スクリーンショット 2024-09-30 22.04.01.png

46日目_2024/09/30

ビルトイン関数

ビルトイン関数 = 最初から組み込まれている関数
↓ 例

len関数
print関数
type関数など

↓ 具体例
スクリーンショット 2024-09-30 21.50.37.png

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

連結することもできる

スクリーンショット 2024-10-03 20.27.38.png

ミュータブルである(値を改変できる)

ミュータブル/イミュータブル

種類 改変の有無 具体例 id
イミュータブル 改変できない int、float、tuple、文字列 異なる
ミュータブル 改変可能 リスト、辞書 同じ

↓ 例
スクリーンショット 2024-10-03 20.29.43.png

↓ ミュータブル応用例
スクリーンショット 2024-10-03 21.30.42.png

様々なメソッドがある

# 追加
append()

↓ 例
スクリーンショット 2024-10-03 20.31.48.png

※その他は5章で取り扱う

オブジェクトの複製を伴わないポインタのコピー

簡単に言うと、インデックスやスライスは、定義されたリストの値を参照している。
だから、値がか改変されると改変された値を出力することになる。

ポインタ = 何かを指し示すもの。ポインタ変数を使って他の変数の場所を指し示している状態。

↓ 例
スクリーンショット 2024-10-03 20.38.57.png

len関数が使える

スクリーンショット 2024-10-03 20.40.20.png

リストを要素とするリストを生成可能(リストinリスト)

リストの中にリストを作ることが可能。
↓ 例
スクリーンショット 2024-10-03 20.42.59.png

プログラミング始めの一歩

多重代入

カンマ区切りで、代入することができる

# 多重代入
a, b = c, d

print(a)
print(b)

↓
c
d

↓ 例
スクリーンショット 2024-10-03 20.46.58.png

↓ 例2 リストありver
スクリーンショット 2024-10-03 20.46.19.png

bool型(True、False)

Pythonの場合、先頭の文字が大文字になる。

整数が真、0が偽
# bool値確認
bool()

↓ 例
スクリーンショット 2024-10-03 21.05.39.png

シーケンスの長さが0以外であれば真、空は偽

シーケンス = 要素と要素の並ぶ順序が記憶されている型のこと
例えば:リスト、文字列など

↓ 例
スクリーンショット 2024-10-03 21.13.04.png

文のグルーピングは、インデント

スクリーンショット 2024-10-03 21.15.16.png

print関数

カンマ区切りは、自動でスペースが挿入される
↓ 例
スクリーンショット 2024-10-03 21.18.02.png

キーワード引数end(改行の抑制と文字列の変更)
# キーワード引数end = 出力末尾の改行の抑制 + 文字列の変更が可能になる。

↓ 例
スクリーンショット 2024-10-03 21.24.21.png

50日目_2024/10/04

Pythonチュートリアル 4章 制御構造ツール part1

動画視聴

出題数

・9問(22.5%)
→この章が一番問題数多い
・ページ数:20p
・4.1:if文
4.2:for文
4.3:range()関数

if文

スクリーンショット 2024-10-04 21.55.04.png

for文

for文 = あらゆるシーケンス(リストや文字列)に対し、そのシーケンス内の順序で反復をかける
※シーケンス = 要素と要素の順序が記憶されている型 = リスト、文字列
↓ 例
スクリーンショット 2024-10-04 21.59.28.png

辞書の中身を変更したい時は、「①新しいコレクションを作成」 or 「②コピーを反復にかける」

①新しいコレクション(辞書を作成)

スクリーンショット 2024-10-04 22.20.18.png

items()の解説
items() = 辞書型に使用される関数。
        辞書の中の キーと値のペア をタプルの形で取得する。
        items()で取得したkeyとvalueをuserにkey、statusにvalueを順番に入れていく

↓ 例
スクリーンショット 2024-10-04 22.23.36.png

②コピーを反復にかける

スクリーンショット 2024-10-05 9.06.36.png

copy()の解説

・なぜcopy()を使うのか?

辞書を反復処理中に直接変更(要素を削除)すると、RuntimeError が発生することがある。
この問題を回避するために copy() メソッドを使って、元の辞書のコピーを作成し、そのコピーに対してループ処理を行っています。
これにより、元の辞書を操作しながらも安全に要素を削除することができます。
del(削除)の解説
辞書の要素の削除 = 「del 辞書オブジェクト[key]」
copyを使わない場合(エラーが起こる)

スクリーンショット 2024-10-06 0.23.38.png

エラーが起こる

dictionary changed size during iteration

# 理由
Pythonで辞書を反復処理(ループ)している間に、その辞書の内容を変更(追加や削除)したときに発生するエラー。
辞書は反復処理中に直接変更することができないため、このエラーが出る。

辞書型

辞書型 = {}の中にkeyとvalueの組み合わせが含まれているデータのこと

# 辞書型の例
dict = {'apple': 1, 'orange': 2, 'banana': 3}

51日目_2024/10/05

range()関数

・ビルトイン関数 = Pythonがあらかじめ用意している関数

# 連続した数値の要素を持つ
# 終端値(終わりの数字は排除 -1)は持たない
range()関数

↓ 例
スクリーンショット 2024-10-05 9.14.58.png

0以外の数字から始めることもOK

# 0以外の数字から始める
range(1,5)

↓ 例
スクリーンショット 2024-10-05 9.16.54.png

負の数字もOK

# 後ろの数字は-1する
range(-6,-1)

↓ 例
スクリーンショット 2024-10-05 9.18.16.png

増分を指定することOK

# 第一引数:スタート
# 第二引数:終了(-1する)
# 第三引数:増分(飛ばす数)
range(3,12,2)

↓ 例
スクリーンショット 2024-10-05 9.21.00.png

シーケンス(文字列やリスト)のインデックス数で反復をかけたい時の方法

range()とlen()を使う

↓ 例
スクリーンショット 2024-10-05 9.24.47.png

反復可能体(iterable)、反復子(iterator)

・for文の裏側(どのように処理されているのか)
スクリーンショット 2024-10-05 9.27.39.png

・上記画像の解説
①反復可能体(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文のこと

↓ 例
スクリーンショット 2024-10-07 16.59.02.png

キーワード引数end(改行の抑制と文字列の変更)の復習

# キーワード引数end = 出力末尾の改行の抑制 + 文字列の変更が可能になる。

↓ 例
スクリーンショット 2024-10-03 21.24.21.png

else節。while文ver

スクリーンショット 2024-10-07 16.59.44.png

break文

# それを取り囲む最も内側のforやwhile文のループから抜ける
break

↓ 例
スクリーンショット 2024-10-07 17.18.29.png

continue文

# ループの残りを飛ばしてループに戻る
continue

↓ 例
スクリーンショット 2024-10-07 20.41.45.png

else節、break文、continue文のわかりすい表

種類 ループでの動き
else節 ループ処理の後に実行
break文 それを取り囲む最も内側のforやwhile文のループから抜ける
continue文 # ループの残りを飛ばしてループに戻る

pass文

# 構文的には文が必要なのに、プログラム的には何もする必要がない時に使う
pass

・役割:プレースホルダー
・プレースホルダー = 後から実際の内容を挿入するために、仮に確保した場所のこと

↓ 例:passあり
スクリーンショット 2024-10-07 20.52.17.png

↓ 例:passなし
スクリーンショット 2024-10-07 20.51.39.png

54日目_2024/10/08

4章 制御構造ツール part3 関数の基本

関数の基本

関数のメリット = 同じ処理を繰り返す時に定義する
例)面積の求め方

関数の公式

# 関数の定義
def 関数名(仮引数):
    処理内容

# 関数の呼び出し
関数名(引数)


※補足
・仮引数はなくても良い

↓ 例
スクリーンショット 2024-10-08 19.09.07.png

他の名前でも、同じ関数オブジェクトを指し示すことができ、アクセス可能

簡単に言うと、
関数の呼び出しを変数に代入して使うことも可能
↓ 例
スクリーンショット 2024-10-08 19.12.08.png

変数について

スコープ(変数の有効範囲)とは

スコープ = 変数の有効範囲(定義した変数を使うことのできる範囲)
↓ わかりやすく
関数内で変数を呼び出しているときに、どこの変数を見に行きますか?と言うこと

スコープの順番

スコープの見にいく順番
①ローカルのシンボル表
②外側の関数のシンボル表
③グローバルのシンボル表(関数の外)
④ビルドイン名のシンボル表

↓ 例:①ローカルのシンボル表の場合
スクリーンショット 2024-10-08 19.36.12.png

↓ 例:②外側の関数のシンボル表
スクリーンショット 2024-10-08 22.39.32.png

↓ 例:③グローバルのシンボル表(関数の外)
スクリーンショット 2024-10-08 22.40.23.png

変数の参照はできるが、代入はできない(代入の例外はあり)

例外
①global文 = 関数内からグローバル変数に値を代入する
②nonlocal文 = 外側の関数の変数に値を代入する

シンボル表(名前空間のディクショナリー) = 変数名や関数名などの名前(シンボル)と、それに対応する内容の情報

↓ 例

def test_func2():
    a = 2
    b = 5
    c = 9

↓
# 関数の内容
{'a':2, 'b':5, 'c':9} ← これがシンボル表

引数について

引数はオブジェクト参照渡しで渡される
↓ わかりやすく

関数内で変更を加えた時に
イミュータブル 関数内で変更しても、関数外で変更をみえることはない
ミュータブル 関数内での変更が、関数外でも適用される(変更がみえる)

↓ 例(イミュータブルの場合)
スクリーンショット 2024-10-08 20.05.40.png

↓ 例(ミュータブルの場合)
スクリーンショット 2024-10-08 20.06.23.png

docstring

docstring = 関数などの仕様をその利用者に対して説明するために記述
スクリーンショット 2024-10-08 20.10.22.png

return文

return文 = 戻り値

※使うとき
関数の外で値を使いたい時

※注意点
関数を終了させる機能がある

↓ 例
スクリーンショット 2024-10-08 20.14.37.png

return文がないと。。。

「None」が返される

↓ 例
スクリーンショット 2024-10-08 20.22.19.png

return文は、関数を終了される機能がある

スクリーンショット 2024-10-08 20.51.57.png

メソッド

メソッド = オブジェクト(リストや文字列など)に所属した関数

# メソッドの公式
オブジェクト.メソッド名()

↓ 例

# リストに追加
sample_list.append(5)

# 辞書のkeyを取得
sample_dict.keys()

4章 制御構造ツール part4 関数の引数を徹底解説

動画視聴

55日目_2024/10/09

4章 制御構造ツール part4 関数の引数を徹底解説

引数のデフォルト値

デフォルト値があると何が良いの?

仮引数で定義してある数よりも、少ない引数の数で実行できる

↓ 例
スクリーンショット 2024-10-09 22.17.46.png

↓ 例:# デフォルト値の引数(address)に値を送ることもできる
スクリーンショット 2024-10-09 22.19.05.png

デフォルト値の評価は定義している側のスコープで決まる

スコープ = その位置からどのように見えるのか

スコープの見にいく順番

①ローカルのシンボル表
②外側の関数のシンボル表
③グローバルのシンボル表(関数の外)
④ビルドイン名のシンボル表

①デフォルト値を定義していない場合

スクリーンショット 2024-10-09 22.46.05.png

②デフォルト値を定義している場合

スクリーンショット 2024-10-09 22.46.39.png

③デフォルト値を定義している場合(関数定義段階で変数の定義なし)

スクリーンショット 2024-10-09 22.47.10.png

デフォルト値は1回しか評価されない(初期化されない)

以下例のようにミュータブルな値の場合、
デフォルト値の共有をされてしまう(デフォルト値の初期化はされない)
↓ 例
スクリーンショット 2024-10-09 23.31.02.png

デフォルト値を何度も使う & 毎回初期化したい場合

・デフォルト値を「None」にする
・if文で条件をNoneならば、と言う条件を作成
・毎回空のリストや辞書を作成し、その中に引数の値を代入していくことで
毎回初期化できる(デフォルト値の共有NGにできる)

↓ 例
スクリーンショット 2024-10-09 23.34.31.png

56日目_2024/10/10

キーワードin

キーワードin = シーケンス(リストや文字列)が指定の値を含むかどうかを判定する

↓ 例
スクリーンショット 2024-10-10 22.12.46.png

キーワード引数

キーワード引数 = 関数を「キーワード = 値」の形でコールできる

↓ 例
スクリーンショット 2024-10-10 22.17.04.png

キーワード引数の注意点

①位置引数→キーワード引数の順番に記載しないとエラーになる

スクリーンショット 2024-10-10 22.20.50.png

②キーワード引数は、仮引数と一致する必要がある

スクリーンショット 2024-10-10 22.31.45.png

③キーワード引数のみの場合、引数と仮引数の順番は問われない

スクリーンショット 2024-10-10 22.34.41.png

④値は一つしか取れない

スクリーンショット 2024-10-10 23.16.41.png

⑤辞書オブジェクトに**をつけて渡すことも可能

スクリーンショット 2024-10-10 23.23.50.png

*名前(*arg)と**名前(**kwargs)

複数の引数を受け取ることができる

*名前(*arg)

*名前(*arg) = タプルで受け取る

↓ 例
スクリーンショット 2024-10-10 23.32.12.png

*名前(*args)の後ろに仮引数がある場合はキーワード引数のみが有効である

理由:キーワード引数を設定しないと、どこまでが*argの範囲か判別できないため。
↓ 例
スクリーンショット 2024-10-10 23.38.18.png

**名前(**kwargs)は辞書で受け取る

**名前(**kwargs) = 辞書で受け取る

# ポイント
仮引数に対応するキーワードを除いた全ての全てのキーワード引数が入る

↓ 例
スクリーンショット 2024-10-10 23.58.06.png

57日目_2024/10/11

①*名前(*arg) → ②**名前(**kwargs)の順番で記載する

**名前(**kwargs)は、「最後」でのみ定義することが可能

特殊引数

位置専用引数、キーワード専用引数がある

位置専用引数

位置専用引数 = 「/」より前に記述される

↓ 例
スクリーンショット 2024-10-11 7.38.52.png

↓ エラー例
スクリーンショット 2024-10-11 7.39.12.png

キーワード専用引数

キーワード専用引数 = 「*」より後ろに記述される

↓ 例
スクリーンショット 2024-10-11 7.42.39.png

↓ エラー例
スクリーンショット 2024-10-11 7.43.10.png

特殊引数のメリット

・可読性が上がる

特殊引数の用例

位置専用引数

①APIの引数名が変更されて使えなくなるのを防ぐ

APIの仕様が変わり、引数名が変わった場合に、自分のプログラムの方からキーワード引数でAPIを呼び出していると、APIの方が引数名を変えてしまっているので、名前が違うためエラーが出てしまう

API = アプリとプログラムを繋ぐもの

②位置引数と任意個数のキーワード引数の衝突を防ぐ

↓ エラー例
スクリーンショット 2024-10-11 7.57.43.png

↓ 位置引数で解決
スクリーンショット 2024-10-11 8.00.32.png

キーワード専用引数

キーワードに意味があり、明示することでより理解しやすくなる

58.59日目_2024/10/12~13

4章 制御構造ツール part5 関数の引数を徹底解説

動画視聴

60日目_2024/10/14

4章 制御構造ツール part5 関数の引数を徹底解説

アンパック

アンパック = 複数の要素を持つものを分解して、各変数に代入すること。

「*」:リストやタプルをアンパック
「**」:辞書をアンパック

↓ 例
スクリーンショット 2024-10-14 4.11.28.png

lambda式

lambda式 = 小さな無名関数(名前をつけるほどでもない小さい関数を使うときに使う)

# 公式
lambda 引数: 処理
↓
例) lambda a, b: a + b

↓ 例
スクリーンショット 2024-10-14 4.21.53.png

入れ子になった関数同様、スコープの変数を参照できる

↓ 例
スクリーンショット 2024-10-14 4.41.27.png

↓ 関数の外に変数がある場合
スクリーンショット 2024-10-14 4.45.10.png

他の関数と組み合わせて使う

例えば、sort:listメソッド

sort:listメソッド = keyに関数を設定すると、listの各要素にその関数が適用され、戻り値によってソートされる

⭐️key = lambda 仮引数: 条件
→仮引数はリストの値がそのまま入る

↓ 例
スクリーンショット 2024-10-14 5.03.53.png

解説サイト

decstring

decstring = 関数などの仕様をその利用者に対して説明するために記述

# 推奨される記述方法
①慣習的にダブルクォートのトリプルクォートが使用される
②1行目は大文字で始まり、ピリオドで終わる
③続きがある場合は2行目を空行とし、分離する

↓ 例
スクリーンショット 2024-10-14 8.56.02.png

decstringの内容を表示するツール(help関数)

# decstringの内容を表示するツールを使用する際の慣習的ルール
①最初の行より後にある空白でない行をインデントの基準にする
②インデント量と等価の空白を除去する
③空白の判定はタブ文字を展開してから
help関数 = decstringの内容を表示するツール

↓ 例(2枚で1つ)
スクリーンショット 2024-10-14 9.01.23.png
スクリーンショット 2024-10-14 9.01.50.png

関数アノテーション

関数アノテーション = 関数に注釈をつけることでわかりやすくする

# ポイント
①関数のいかなる部分にも影響を及ぼさない
②引数アノテーションは、引数名の後にコロンを続け、その後にアノテーションの値として評価される式を置く
③返り値アノテーションは、引数リストとdef文の終わりを表すコロンの間に置かれた->によって定義され、その後に式が続く

④.⑤は例の下で解説
④アノテーションで指定した型以外の引数を渡してもエラーにならない
⑤__anotetaions__の属性に辞書として格納されている

↓ 例
スクリーンショット 2024-10-14 9.13.58.png

アノテーションで指定した型以外の引数を渡してもエラーにならない

スクリーンショット 2024-10-14 9.14.50.png

__anotetaions__の属性に辞書として格納されている

スクリーンショット 2024-10-14 9.18.25.png

コーディングスタイル

コーディングスタイル = 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)

↓ 例
スクリーンショット 2024-10-16 21.01.20.png

末尾にイテラブルを追加する:リスト名.extend(iterable)

イテラブル = 繰り返し処理が可能なオブジェクト。Pythonにおいてforループなどで順に値を取り出すことができるオブジェクトを指す。

・公式
リスト名.extend(iterable)

---

・コード例
# 末尾にイテラブルを追加する:リスト名.extend(iterable)
# 末尾にイテラブルを追加する:リスト名.extend(iterable)
b = [1, 2, 3]
b.extend(range(3))
print(b)

↓ 例
スクリーンショット 2024-10-16 21.11.17.png

指定した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))

↓ 例
スクリーンショット 2024-10-16 22.45.04.png

リストの指定した値の個数を返す:count()

・公式
count()

---

・コード例
# リストの指定した値の個数を返す:count()
e = [1, 2, 3, 4, 5, 1, 100]
print(e.count(1))

↓ 例
スクリーンショット 2024-10-16 22.49.23.png

指定した位置に値を挿入する:insert(場所指定, 挿入する値)

・公式
insert(場所指定, 挿入する値)

---

・コード例
# 指定した位置に値を挿入する:insert(場所指定, 挿入する値)
f = [1, 2, 3, 4, 5, 1, 100]
f.insert(2, 1000)
print(f)

↓ 例
スクリーンショット 2024-10-16 22.56.17.png

リストを逆順にする:reverse()

・公式
reverse()

---

・コード例
# リストを逆順にする:reverse()
f = [1, 2, 3, 4, 5, 1, 100]
f.reverse()
print(f)

↓ 例
スクリーンショット 2024-10-16 22.58.13.png

63日目_2024/10/17

指定した値と等しい最初の値を削除する:remove()

remove()

---

・コード例
# 指定した値と等しい最初の値を削除する:remove()
g = [1, 2, 3, 4, 5, 1, 100]
g.remove(100)
print(g)

↓ 例
スクリーンショット 2024-10-17 7.38.29.png

指定したインデックス番号の値を削除 & その値を返す:pop()

pop()

---

・コード例
# 指定したインデックス番号の値を削除 & その値を返す:pop()
h = [1, 2, 3, 4, 5]
print(h.pop(0))

# インデックス番号がない場合は最後の値を削除&返す
print(h.pop())

print(h)

↓ 例
スクリーンショット 2024-10-17 7.41.56.png

リストから全ての値を削除する:clear()

clear()

---

・コード例
# リストから全ての値を削除する:clear()
i = [1, 2, 3, 4, 5]
i.clear()
print(i)

↓ 例
スクリーンショット 2024-10-17 7.45.51.png

リストをソートする: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)

↓ 例
スクリーンショット 2024-10-17 7.52.35.png

「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))

↓ 例
スクリーンショット 2024-10-17 7.59.43.png

リストのコピーを返す:copy()

copy()

---

・コード例
# リストのコピーを返す:copy()
k = [1, 2, 3, 4, 5]
copy = k.copy()
copy[0] = 100

print(k)
print(copy)

↓ 例
スクリーンショット 2024-10-17 8.02.45.png

「copy()」は、「浅いコピー」である

浅いコピーの場合、
要素がミュータブルだと動作が変わる

# 「copy()」は、「浅いコピー」である
# 浅いコピーの場合、要素がミュータブルだと動作が変わる
l = [[1, 2], 3, 4, 5]
copy = l.copy()
copy[0][1] = 100

# コピー元も変化してしまう性質がある
print(l)
print(copy)

↓ 例
スクリーンショット 2024-10-17 8.10.02.png

リストの改変をするメソッドの返り値はNone:メソッドチェーンができない

メソッドチェーン = 複数のメソッドを連続して一つの文で呼び出すテクニックのこと

a = []
a.メソッドx.メソッドy
上記のようなコードは、
①aに対して、メソッドxで改変を起こし
②①に対してメソッドyを改変する
①はできるが、改変後の改変を起こすのはできない

↓ 例
スクリーンショット 2024-10-17 10.39.57.png

全てのデータを比較できるわけではない

以下は比較ができないため、エラーになる
・型が異なる
・複素数 = 実数と虚数の組み合わせで表される数のこと。数直線上の数(実数)に虚数を加えることで、複素数はより広い範囲の数を扱うことができる。

↓ 例
スクリーンショット 2024-10-17 10.45.18.png

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)

↓ 例
スクリーンショット 2024-10-18 21.30.32.png

キューとして使う

キュー = 最初に追加した要素を最初に取り出す

コード例)
# キュー = 先入れ先出し
# スタック = 後入れ先出し
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)

↓ 例
スクリーンショット 2024-10-18 21.47.51.png

リスト内包表記

リスト内包表記 = リストを作成する表記方法。コンパクトにコードを記述できる。

# 公式
[式 for 任意の変数名 in イテラブルオブジェクト]

# コード例
q = [x ** 2 for x in range(10)]
print(q)

↓ 例
スクリーンショット 2024-10-18 21.55.50.png

↓ リスト内包表記を使わなかった場合
スクリーンショット 2024-10-18 21.59.58.png

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] が代入されます。

↓ 例
スクリーンショット 2024-10-18 22.09.30.png

式がタプルの場合は円括弧()が必要

# 式がタプルの場合は円括弧()が必要
r = [(x, x**2, x**3) for x in range(5)]
print(r)

↓ 例
スクリーンショット 2024-10-18 22.12.16.png

if文で条件分岐することも可能

# if文で条件分岐することも可能
s = [(x**2) for x in range(5) if x > 2]
print(s)

スクリーンショット 2024-10-18 22.22.39.png

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...の順で見ていく

↓ 例
スクリーンショット 2024-10-18 22.28.40.png

65日目_2024/10/19

関数やメソッドが使える

abs関数(絶対値を出力する関数)

# 絶対値を出力する関数
abs()

↓ 例
スクリーンショット 2024-10-19 10.04.44.png

stripメソッド(不要なスペースを埋めてくれるメソッド)

# 不要なスペースを埋めてくれる
strip()

↓ 例
スクリーンショット 2024-10-19 10.06.56.png

関数内関数も使える

# 関数内関数も使える

# pi = 円周率
from math import pi

# round(a, b) = 小数点をどこまで取り出すか決める
# round(3, 3)の場合、3.142となる
[str(round(pi, u)) for u in range(1, 5)]

スクリーンショット 2024-10-19 15.42.34.png

内側のリスト内包表記は、続く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列目
#]

スクリーンショット 2024-10-19 15.57.47.png

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)))

スクリーンショット 2024-10-19 16.06.21.png

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)

スクリーンショット 2024-10-20 8.47.22.png

変数を丸ごと削除する

del 変数名

注意点:変数を丸ごと削除した場合、その後にその変数を参照するとエラーになる(変数が定義されてないよ)

---

a = [1, 2, 3, 4]
del a
print(a)

スクリーンショット 2024-10-20 8.51.14.png

タプル

タプル = シーケンスの一つ
(シーケンス = 連続した値)

タプルはカンマで区切られた値からなる

t = 10, 'a', [1, 2]
print(t)

注意点
・入力の際、囲みの()はなくても良い
・式の一部として使っている場合は必要

スクリーンショット 2024-10-20 8.56.37.png

タプルはイミュータブルである(値を改変できない)

# タプルはイミュータブルである(値を改変できない)
a = 1, 2, 3
a[0] = 100

スクリーンショット 2024-10-20 8.58.30.png

タプルの入れ子構造

a = 't', [1, 'a', 100]
b = a, (10, 'a', [1, 2])
print(b)

スクリーンショット 2024-10-20 9.01.53.png

アイテム数が特殊なタプル

アイテム数が0のタプル

タプル名 = ()

---

empty = ()
print(empty)

print(type(empty))

スクリーンショット 2024-10-20 23.57.07.png

アイテム数が1のタプル

タプル名 = 値,

---

single = 'hello',
print(single)

print(type(single))

スクリーンショット 2024-10-20 23.58.57.png

タプルへのアクセス

アンパック

アンパック = 複数の要素を持つものを分解して各変数に代入すること

---

# タプルのパッキング = 「v = (12345, 67890, 'aaaaa')」
v = (12345, 67890, 'aaaaa')

# シーケンス・アンパッキング = 「a, b, c = v」
# シーケンス = 要素が順番に並んだデータ構造のこと
a, b, c = v
print(a)
print(b)
print(c)

スクリーンショット 2024-10-21 21.41.30.png

インデックス

スクリーンショット 2024-10-21 21.42.29.png

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])

スクリーンショット 2024-10-21 21.49.34.png

集合

集合 = 重複しない要素を順不同に集めたもの

・使い方
{} or set関数 のどちらかを使用する

---

# 集合 = 重複しない要素を順不同に集めたもの
# {} or set関数 のどちらかを使用する
# 重複が削除される
set1 = {'a', 's', 'b', 'x', 's', 'b'}
print(set1)

---

set2 = set('aannfnlas')
print(set2)

↓ 例
スクリーンショット 2024-10-21 21.57.53.png

68日目_2024/10/22

空の集合にはset関数を使用する

# 空の集合にはset関数を使用する
empty = set()
print(empty)
print(type(empty))

スクリーンショット 2024-10-22 15.24.58.png

集合の存在判定

inを使う

---

# 集合の存在判定 = inを使う
set1 = {'a', 's', 'b', 'x', 's', 'b'}
print('a' in set1)
print('c' in set1)

スクリーンショット 2024-10-22 15.27.33.png

集合の演算

和集合

スクリーンショット 2024-10-22 15.29.09.png

和集合 = AとBの全て
「|」を使う

---

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b)

スクリーンショット 2024-10-22 15.32.06.png

差集合

スクリーンショット 2024-10-22 15.33.43.png

差集合 = Aに存在して、Bに存在しない要素(Bに要素はAにあっても弾かれる)
「-」を使う

---

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a - b)

スクリーンショット 2024-10-22 15.36.39.png

積集合

スクリーンショット 2024-10-22 15.37.37.png

積集合 = AとB両方にある要素のみ
「&」を使う

---

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a & b)

スクリーンショット 2024-10-22 15.39.22.png

対象差集合

スクリーンショット 2024-10-22 15.41.48.png

対象差集合 = AとBに共通するものを除いた全ての要素
「^」を使う

---

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a ^ b)

スクリーンショット 2024-10-22 15.43.14.png

ser内包表記

リスト内包表記のser内包表記版

x = {n ** 2 for n in range(10)}
print(x)

スクリーンショット 2024-10-22 15.46.43.png

69日目_2024/10/23

Pythonチュートリアル 5章 データ構造 part3 辞書の基本とループのテクニックを解説

ディクショナリ

# ディクショナリの使い方
key: valueのペア

---

x = {1: 'one', 'apple': 5, ('a', 5): 'tuple'}

辞書はキー(変更不能な型)でインデックス化

・変更不能な型 = 文字列、数値、タプルなど
・タプルは変更可能なオブジェクトを含んだ場合エラーになる
スクリーンショット 2024-10-23 10.43.03.png

空の辞書を作成

x = {}

スクリーンショット 2024-10-23 10.44.12.png

delで削除が可能

del 辞書名[キー]

スクリーンショット 2024-10-23 10.45.25.png

「キー = 新しい値」で辞書の内容を変更できる

辞書名[既存のキー] = 新しい値

スクリーンショット 2024-10-23 10.48.20.png

辞書にないキーを指定した場合は追加される

辞書名[新規のキー] = 新しい値

スクリーンショット 2024-10-23 10.50.06.png

keyを指定すると値を取り出すことができる

スクリーンショット 2024-10-23 23.17.12.png

存在しないkeyを使うとエラーになる

スクリーンショット 2024-10-23 23.18.21.png

辞書オブジェクトに対しlist()を実行すると、keyからなるリストを返す

辞書 = {}
list(辞書)

スクリーンショット 2024-10-23 23.27.59.png

ソートされたリストを出したい場合、sortedを使用する

辞書 = {}
sorted(辞書)

スクリーンショット 2024-10-23 23.29.33.png

70日目_2024/10/24

keyが辞書にあるか調べるにはinを使う

スクリーンショット 2024-10-24 22.59.05.png

辞書内包表記を使って、任意のkeyとvalueのペアから辞書を作ることができる

スクリーンショット 2024-10-24 23.01.59.png

dict()コンストラクタ

コンストラクタ = クラスからオブジェクトを生成するときに実行されるメソッド

# 2つの公式
・dict([('a', x), ('b', y), ('c', z)])
・dict('a'=x, 'b'=y, 'c'=z)

スクリーンショット 2024-10-24 23.08.08.png

復習:listコンストラクタ

スクリーンショット 2024-10-24 23.17.38.png

ループのテクニック

itemsメソッド(keyとvalueを同時に取り出す)

keys = {1: 'a', 2: 'b', 3: 'c'}
for k, v in keys.items():
    print(k, v)

スクリーンショット 2024-10-24 23.20.58.png

enumerate関数(要素のインデックス&要素を同時に取り出す)

for i, v in enumerate(['a', 'b', 'c']):
    print(i, v)

スクリーンショット 2024-10-25 0.26.44.png

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)

スクリーンショット 2024-10-25 22.14.28.png

reversed関数(逆方向でループ処理)

for i in reversed(range(1, 10, 2)):
    print(i)

スクリーンショット 2024-10-25 22.16.26.png

set()とsorted()で、ソートされた順序で、同一要素に一度のみアクセスすることができる

# 重複を消す
set()

---

basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for f in sorted(set(basket)):
    print(f)

スクリーンショット 2024-10-25 22.20.15.png

ループ内でリストを変更したい場合は、代わりに新しいリストを作った方が安全

# 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)

スクリーンショット 2024-10-25 22.25.03.png

72日目_2024/10/26

Pythonチュートリアル 5章 データ構造 part4 演算子の基本を解説

比較演算子

in

# シーケンス(リストや文字列)が指定の値を含むかどうかを判定する
in

---

'a' in 'abc'

スクリーンショット 2024-10-26 11.32.08.png

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)

スクリーンショット 2024-10-26 11.35.48.png

同じ値かを調べたい場合は「=」を使う

a = [1, 2, 3]
b = [1, 2, 3]

print(a == b)

スクリーンショット 2024-10-26 11.37.34.png

ブール演算子(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を返す

スクリーンショット 2024-10-27 14.19.35.png

セイウチ演算子

セイウチ演算子 = 式中での代入が可能になる演算子

---

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
となる。

スクリーンショット 2024-10-27 14.26.10.png

73日目_2024/10/27

比較

比較 = 辞書的順序(辞書の並び方)で行う

シーケンスの要素が尽きるまで比較を続ける

スクリーンショット 2024-10-27 19.31.33.png

要素が同じシーケンス型であれば、そのシーケンス間での比較を再帰的に行う

スクリーンショット 2024-10-27 19.34.54.png

全ての比較結果が等しい時、シーケンスは等しいとみなされる

スクリーンショット 2024-10-27 19.36.52.png

短い方のシーケンスが、小さいシーケンスとみなされる

スクリーンショット 2024-10-27 19.38.38.png

文字列の比較:ord()関数

print(ord('a'))
print(ord('A'))
print(ord('Z'))

スクリーンショット 2024-10-27 19.42.33.png

異なる型でも、比較順序がある場合は比較可能

スクリーンショット 2024-10-27 19.45.29.png

比較順序がない場合はtype errerになる

スクリーンショット 2024-10-27 19.49.51.png

Python基礎試験問題集:1章

問題解いた
結果:×以外は正解
1
2:×
3
4
5
6
7
8
9:×

Pythonチュートリアル 6章 モジュール part1 モジュールの基礎を学ぶ

出題数

問題数:2問
ページ数:13ページ

モジュール/パッケージ/ライブラリ

スクリーンショット 2024-10-27 23.53.30.png

モジュール

モジュール = 便利な関数やクラスを取り入れることができるもの
・定義や文が入ったファイルのこと
・スクリプトファイル(.pyがついたファイルのこと)の一つ一つ

パッケージ

パッケージ = 複数のモジュールが集合したもの(ディレクトリ構造)
・「__init__.py」という名前のファイルを持つ
・__path__属性を持つ

ライブラリ

ライブラリ = モジュールとパッケージが集合したもの

74日目_2024/10/28

import/from/as

import:モジュールにアクセスすることができる


スクリーンショット 2024-10-28 10.35.50.png

# import:先頭に記載するのが慣習
>>> import calc
# モジュール.関数名()
>>> calc.square(2)
4

関数にはモジュール名を使ってアクセス

スクリーンショット 2024-10-28 10.35.50.png

>>> import calc
# モジュール.関数名() ← ここ
>>> calc.square(2)
4

モジュール名を記載しない場合、以下のようなエラーになる
スクリーンショット 2024-10-28 10.39.33.png

ローカルな名前に代入することができる

スクリーンショット 2024-10-28 10.35.50.png

>>> import calc

# モジュール.関数名
# ローカルな名前に代入
>>> c = calc.square

# 呼び出し
>>> c(2)
4

from:特定の関数にimportすることができる

スクリーンショット 2024-10-28 10.35.50.png

# clacモジュールのcube関数にアクセスする
>>> from clac import cube

# 呼び出し
>>> cube(2)
8

75日目_2024/10/29

76日目_2024/10/30

仕事の関係上、学習できず。
問題集の復習は完了

77日目_2024/10/31

「from モジュール名 import 関数名」の場合、モジュール名は定義されていない

スクリーンショット 2024-10-28 10.35.50.png

>>> from clac import cube
>>> cube(2)
8

↓

「from clac import cube」は関数めいの定義をしているが、モジュール名の定義をしていない。
そのため、以下のようにモジュールを通して呼び出そうとするとエラーになる。
>>> from clac import square
>>> clac.square(2)
エラー

「from モジュール名 import *」:_以外で始まる全ての名前(クラス、関数)をimportできる

_ = 外部に公開したくないもの
↓ 例 「from モジュール名 import *」
スクリーンショット 2024-10-31 10.41.53.png

as:指定した名前でimportできる

スクリーンショット 2024-10-28 10.35.50.png

>>> import calc as cl
>>> cl.cube(4)
64

モジュールについて

変数にもアクセスできる

スクリーンショット 2024-10-31 10.46.24.png

>>> import test3
>>> print(test3.a)
5

>>> test3.a = 9
>>> print(test3.a)
9

モジュールは一回しかimportされない

モジュールを修正した場合は、再起動かimportlib.rekload()を使う

>>> import importlib
>>> importlib.reload(モジュール名)

__name__の値がモジュール名

スクリーンショット 2024-10-31 22.49.54.png
スクリーンショット 2024-10-31 22.50.06.png

# 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__がモジュール名になる(復習)

スクリーンショット 2024-10-31 23.47.59.png

# test2はtest1を読み込んでいて、test1は「__name__」を出力する。
# 「__name__」は、モジュール名を出力する関数名となっている。
>>> python test2.py
test1


# 直接実行した場合
# トップレベルで実行する場合は、__main__
>>> python test1.py
__main__

if name == 'main':(復習)

スクリーンショット 2024-10-31 23.51.17.png
スクリーンショット 2024-10-31 23.52.04.png

importとして使う(トップレベルではない)時は、
「if name == 'main':」以下の処理は走らない。

モジュールの検索パス

①モジュールを探す時、インタープリンタはまずその名前の組み込みモジュール(python自体に組み込まれている)を探す

# モジュールの一覧を探す方法
sys.builtin_module_names

↓ 例
スクリーンショット 2024-11-01 0.00.54.png

②見つからなかった場合は、sys.pathにあるディレクトリのリストの中から探す

sys.pathは以下の場所に初期化される

スクリーンショット 2024-11-01 10.39.04.png

①入力されたスクリプトのあるディレクトリ(ファイルの指定がない場合はカレントディレクトリ)

↓ 以下のこと
スクリーンショット 2024-11-01 10.41.19.png

②PYTHONPATH

windowsの場合限定
スクリーンショット 2024-11-01 10.44.05.png

上記で設定した内容が①の次にくる
スクリーンショット 2024-11-01 10.45.06.png

③②以降は、インストールごとのデフォルトが表示される

ポイント

シンボリックリンクは検索パスに追加されない

・シンボリックリンクは、ショートカットのイメージでOK
・元のファイルと、シンボリックファイルが別の場所にあったとして、シンボリックファイルは検索パスに入らない
スクリーンショット 2024-11-01 10.48.04.png

78日目_2024/11/1

学習

79日目_2024/11/2

sys.pathは修正できる

リストの操作で改変できる
変数.pop()とか変数.append()など

スクリプトファイルを含むディレクトリが検索パスの先頭

標準ライブラリと同名のものがある場合はインポート時に注意が必要

・インポートの優先順位
①スクリプトファイルを含むディレクトリ
②Pythonパス
③インストールごとのデフォルト

・標準ライブラリは③に含まれる
①と②に同名のライブラリがある場合、そちらが優先されてしまう

コンパイルされたモジュール

モジュールを読み込む

モジュールの読み込みを高速化するため、コンパイル済みの各モジュールを__pycache__ディレクトリのmodule.version.pycファイルとしてキャッシュする

キャッシュ = アクセスしたサイトや起動させたアプリなどのデータを一時的に保存しておく技術。
1からデータを読み込む必要がなくなるため、サイトの表示やアプリの動作の速度を上げることができる。
スクリーンショット 2024-11-02 20.05.53.png

# 上記の画像の例なら以下のようにimportする
>>> import test

スクリーンショット 2024-11-02 20.08.37.png

キャッシュのチェックが自動で行われる

・ソースの変更日時をコンパイル済みのものと比較し、コンパイル済みのものが最新でなければ再コンパイル

キャッシュのチェックが自動で行われない場合

①コマンドラインから直接モジュールが読み込まれた場合
例)testファイルを呼び出すために、test2ファイルを呼び出す(testを呼び出す関数があるなど)
スクリーンショット 2024-11-02 20.13.34.png

②ソースモジュール(元々のモジュール)のない場合
コンパイル済みのファイルを使う場合は、pycファイルをソースディレクトリに置く必要がある。
以下画像で言うと、test.pyがない場合、testcpython-38.pycをソースディレクトリの位置に置く必要がある。
スクリーンショット 2024-11-02 20.05.53.png

プラットフォーム非依存

特定のOS(Windows、Mac)に依存しない

80日目_2024/11/3

Pythonチュートリアル 6章 モジュール part3 組み込みモジュール・dir()関数を解説

標準モジュール

・標準モジュール = Pythonではインタープリンタに組み込まれているモジュールがある
・インタープリンタ = プログラムの中身をコンピュータがわかる言葉(機械語)へ翻訳しながら実行すること

# モジュール名の一覧確認方法
sys.builtin_module_names

スクリーンショット 2024-11-03 11.27.46.png

プラットフォーム依存のもの

winregモジュール = Windowsのみのもの

全てのインタープリンタに組み込まれているもの

sysモジュール = プライマリプロンプトとセカンダリプロンプトが定義されている

import sys

# プライマリプロンプト(変数なので置き換え代入も可能)
sys.ps1
# セカンダリプロンプト(変数なので置き換え代入も可能)
sys.ps2

スクリーンショット 2024-11-03 11.31.51.png

sys.path

sys.path = インタープリンタのモジュール検索パスを指定する文字列のリスト
スクリーンショット 2024-11-03 11.34.52.png

・sys.pathの記載されている順番(上記画像を見ながら)
①入力されたスクリプトのあるディレクトリ(ファイルの指定がない場合はカレントディレクトリ)
スクリーンショット 2024-11-03 11.37.14.png
②PYTHONPATH(自身で設定できる環境変数)
スクリーンショット 2024-11-03 11.38.11.png
スクリーンショット 2024-11-03 11.38.27.png
③インストールごとのデフォルト
①と②以降のこと

sys.pathは修正することが可能:リスト操作で改変可能

以下画像の場合、pop()は「一番最後の値を削除&返す」
スクリーンショット 2024-11-03 11.40.49.png

81日目_2024/11/4

発熱のため学習できず

82日目_2024/11/5

dir()関数

# モジュールが定義している名前を確認するのに使う
dir()関数

スクリーンショット 2024-11-05 10.41.00.png

引数なしの場合は現在のローカルスコープで定義されている名前のリストを返す

・関数の外で処理した場合
スクリーンショット 2024-11-05 10.44.27.png

・関数の中で処理した場合
スクリーンショット 2024-11-05 11.42.52.png

組み込みの関数名や変数名はリストアップしない

builtinsモジュールで定義されている
スクリーンショット 2024-11-05 11.44.33.png

Pythonチュートリアル 6章 モジュール part4 パッケージの基本を解説

パッケージ

ドットつきモジュール名を使って構造化する方法 = パッケージ

↓ おさらい
スクリーンショット 2024-11-05 20.03.52.png

# パッケージAにあるサブモジュールB
# モジュール名の衝突を気にせずに済む
モジュール名A.B

インポート方法

モジュール同様、sys.pathからインストールされる

特定のモジュールをインポート

あるパッケージの中から特定のモジュールをインポートする方法

↓ 例としての画像
スクリーンショット 2024-11-05 20.16.03.png

func3()を呼び出す方法3個
①import.サブアイテム.サブサブアイテム

# 最後のサブサブアイテム以外はパッケージでなければならない
# 最後の要素はモジュール or パッケージ
import.サブアイテム.サブサブアイテム

スクリーンショット 2024-11-05 20.35.11.png

②from パッケージ import アイテム

# アイテムには、サブパッケージ/サブモジュール/関数/変数などが入る
# まずはパッケージ(__init__.pyで定義されているか確認する)
from パッケージ import アイテム

例1個目
スクリーンショット 2024-11-05 20.36.05.png
例2個目
スクリーンショット 2024-11-05 20.36.30.png

まずはパッケージ(init.pyで定義されているか確認する)

↓ 例題
スクリーンショット 2024-11-05 20.45.28.png

解説
①__init__.pyが先に読み込まれる
②module2.pyを呼び出すと、①で読み込まれたmodule2の中身が呼び出される
③①と②がなかれば、module2.pyの中身が呼び出される
スクリーンショット 2024-11-05 20.46.31.png

init.py

ファイルを含むディレクトリをパッケージとして扱うために必要

よくある名前のディレクトリが誤ってimportされるのを防ぐ

↓ 例題
以下画像の優先順位とは、「sys.pathの読み込みの順位 = moduleを読み込む優先順位」
スクリーンショット 2024-11-05 20.56.29.png

スクリーンショット 2024-11-05 20.58.29.png

・解説
左側の方が優先順位は高いが、
init.py」の方がさらに優先順位上位のため、優先順位2位が呼び出されている

初期化コードを実行したり、 __ all __.py変数を設定できる

・ここで言う初期化 = 使い始められるように、最初の状態に整えること
・なければ空で大丈夫

例えば

init.pyに読み込みを書いておくと以下のようなことができる

スクリーンショット 2024-11-05 22.48.15.png
スクリーンショット 2024-11-05 22.48.46.png

Python3.3以降は、__ init __.pyがなくてもimportができる

ただし、namespaceパッケージが必要になる

83日目_2024/11/6

Pythonチュートリアル 6章 モジュール part5 all・相対インポートなどを解説

パッケージから*をimportする

__all__変数

__all__で定義されているものだけ使用可能である。
定義していないとエラーになる

スクリーンショット 2024-11-06 23.07.31.png
スクリーンショット 2024-11-06 23.08.54.png

新バージョンをリリースするときにリストを最新の状態に更新するのはパッケージの作者の責任(サポートしないことにしても構わない)

__all__が定義されていないと?

スクリーンショット 2024-11-06 23.13.17.png
スクリーンショット 2024-11-06 23.14.12.png

定義されていないものは全てimportしない

ただし、package、subpackageはimportされる(本体はimportされる)

package、subpackageはimportされる(本体はimportされる)

スクリーンショット 2024-11-06 23.16.30.png
スクリーンショット 2024-11-06 23.17.37.png

解説

「from package.subpackage import *」の段階では、module1.pyはimportされていないが、
subpackage自体はimportされており、なおかつ
subpackage\__init__.pyに相対importの「from.import module1」でimportされているため、
funci関数を呼び出すことが可能になる。
相対import(相対パスのようなもの)
# 例)下記画像
# . = module1から見て、現在のパッケージを示す
# 「..」で一個下のパッケージを示す
from . import module1

スクリーンショット 2024-11-06 23.16.30.png
スクリーンショット 2024-11-06 23.17.37.png

パッケージで定義されている名前を全てimportする
# 復習
dir() = スコープで定義されている関数を全て確認できる関数
__init__.pyで定義された名前と、明示的にロードされたサブモジュールが含まれる

スクリーンショット 2024-11-06 23.27.43.png
↓ 中身
スクリーンショット 2024-11-06 23.16.30.png
スクリーンショット 2024-11-06 23.17.37.png

__all__はあまり良い書き方ではない

・特定のモジュールでは、特定のパターンに従った名前のみを公開するように設計されているが、製品コードでは良いことではない
・以下の書き方が推奨されている(ただし、importを行うmoduleが他パッケージのサブモジュールと名前衝突がない場合)

from package import specific_submodule

84日目_2024/11/7

パッケージ内参照

パッケージ内参照 = 兄弟関係にあるパッケージは絶対importもしくは相対importで使うことができる
スクリーンショット 2024-11-07 21.01.23.png

↓ 絶対importがこれ
スクリーンショット 2024-11-07 21.02.39.png

↓ 相対importがこれ
スクリーンショット 2024-11-07 21.03.38.png

↓ 絶対import、相対importの読み込み
スクリーンショット 2024-11-07 21.04.25.png

相対import

mainモジュールとして使用する場合は使えないので注意
スクリーンショット 2024-11-07 21.01.23.png

スクリーンショット 2024-11-07 21.09.09.png
解説
メインモジュールとして使うと、「package\subpackage3\module3.py」が「package\subpackage3_main_.py」に変わってしまい、「module3.py」を探すことができなくなってしまう

複数のディレクトリにまたがるパッケージ

スクリーンショット 2024-11-07 21.15.35.png

↓ 仮にパッケージ名が同じでもカレントディレクトリからデスクトップのモジュールを取得しようとしてもエラーになる(ディレクトリの違うところからimportはできない)
スクリーンショット 2024-11-07 21.17.13.png

↓ __path__を改変することで、カレントディレクトリからデスクトップのモジュールを取得できるようになる
スクリーンショット 2024-11-07 21.18.54.png
・__path__を拡張する文を記載
→sys.pathにパッケージ名があればimportができるように拡張
スクリーンショット 2024-11-07 21.20.49.png

※__path__がどのように拡張されたのか
↓ エラーの時の__path__の中身
スクリーンショット 2024-11-07 21.21.50.png

↓ 拡張した時の__path__の中身(デスクトップパッケージ、カレントディレクトリパッケージの2つが追加されている)
スクリーンショット 2024-11-07 21.22.55.png

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テキスト')

例)
スクリーンショット 2024-11-07 22.48.35.png

出力をフォーマットする方法

フォーマット済み文字列リテラル(短くしてf-stringとも呼ぶ)

文字列の頭に「f」or「F」を付け、式を{}の間に書くことで、変数やリテラル値(文字列、数値など)を参照できる
→ここでいう式とは、1つの値を返すもの

year = 2024
place = 'Tokyo'
f'I was born in {place} in {year}'

スクリーンショット 2024-11-07 23.17.08.png

str.format()メソッド

・f-stringより文が長くなる
↓ 例

# str.format()メソッド
year = 2024
place = 'Tokyo'
'I was born in {} in {}'.format(place, year)

スクリーンショット 2024-11-07 23.25.39.png

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)

スクリーンショット 2024-11-07 23.32.35.png
スクリーンショット 2024-11-07 23.33.15.png

85日目_2024/11/8

風邪寝込み

86日目_2024/11/9

str関数とrepr関数

数値やリストなどは同じ表現を返す

スクリーンショット 2024-11-09 16.16.09.png

文字列は、2つの異なる表現を持つ

スクリーンショット 2024-11-09 16.19.59.png

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」をプレースホルダーにしてディクショナリの値と置き換える
プレースホルダー = 後から実際の内容を挿入するために、仮に確保した場所のこと

スクリーンショット 2024-11-09 16.29.52.png


例2

d = dict(value='study')
s = Template('The peresent progressive from of "$value" is "${value}ing".')
print(s.substitute(d))

スクリーンショット 2024-11-09 16.39.37.png

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}'

スクリーンショット 2024-11-09 19.03.28.png

オプションのフォーマット指定子を式の後ろにつけることができる

①小数点を丸める

import math
# f = 小数点を示すフォーマット指定子。.2fで小数点2位まで示す。
print(f'The value of pi is {math.pi:.2f}.')

スクリーンショット 2024-11-09 19.09.49.png

②「:n」で最小の文字幅を指定

例題1

table = {'tanaka': 2139, 'suzuki': 1123, 'kimura': 8456}
for name, phone in table.items():
# d = 10進数
    print(f'{name:10} ==> {phone:10d}')

スクリーンショット 2024-11-09 19.14.32.png


例題2:# 10文字以上の場合

# 10文字以上の場合は、幅を超えて表示
table = {'tanaka': 213900000000, 'suzuki': 1123, 'kimura': 8456}
for name, phone in table.items():
    print(f'{name:10} ==> {phone:10d}')

スクリーンショット 2024-11-09 19.18.59.png

③!s、!r、!a(str()、repr()、ascii())

# 非ascii文字をUnicodeエスケープする
ascii()

例題1
スクリーンショット 2024-11-09 19.25.38.png

animil = 'dog'
f'My favorite animal is {animil}'
---
animil = 'dog'
f'My favorite animal is {animil!r}'

例題2
スクリーンショット 2024-11-09 21.10.40.png


フォーマット前に適用されるから注意が必要
スクリーンショット 2024-11-09 21.25.47.png

str.format()メソッド

year = 2024
place = 'Tokyo'
# {} = フォーマットフィールドと言う
'I was born in {} in {}'.format(year, place)

スクリーンショット 2024-11-09 21.27.52.png

括弧の中の数字がオブジェクトの位置を示している

# 括弧の中の数字がオブジェクトの位置を示している
year = 2024
place = 'Tokyo'
'I was born in {1} in {0}'.format(place, year)

スクリーンショット 2024-11-09 21.31.28.png

キーワード引数も使える

# キーワード引数も使える
'I was born in {place} in {year}'.format(place='Tokyo', year=2024)

スクリーンショット 2024-11-09 21.33.21.png

位置引数 + キーワード引数

'I was born in {place} in {0}'.format(2024, place='Tokyo')

スクリーンショット 2024-11-09 21.35.17.png

辞書を引数に渡して、'[]'を使って辞書のキーで参照できる

dict1 = {'year': 2024}
dict2 = {'place': 'Tokyo'}
'I was born in {1[place]} in {0[year]}'.format(dict1, dict2)

スクリーンショット 2024-11-09 21.42.19.png


長い書式文字列があり、それを分割したくない場合は、変数を名前で参照できると良い
→位置引数は可読性が落ちるため、キーワード引数が推奨されている

**記法を使ってキーワード引数として渡す方法(ディクショナリのアンパック)

# **記法を使ってキーワード引数として渡す方法(ディクショナリのアンパック)
dict = {'year': 2024, 'place': 'Tokyo'}
'I was born in {place} in {year}'.format(**dict)

スクリーンショット 2024-11-09 22.32.18.png

vars()関数

スクリーンショット 2024-11-09 22.33.48.png
スクリーンショット 2024-11-09 22.34.01.png


スクリーンショット 2024-11-09 22.35.09.png
Something went wrong


スクリーンショット 2024-11-09 22.35.48.png

手作業でのフォーマット

str.rjust()、str.ljust()、str.center()

スクリーンショット 2024-11-10 10.39.48.png

入力文字が長すぎる場合、文字列を切り詰めることはせず、値をそのまま返す

スクリーンショット 2024-11-10 10.42.02.png

どうしても切り詰めたい場合は、スライス表記を使う

スクリーンショット 2024-11-10 10.43.30.png

str.format()のように出力しているのではなく、新しい文字列を生成している

スクリーンショット 2024-11-10 10.46.25.png

str.zfill()メソッド

数値文字列の左側を0詰めする(正負の符号を正しく扱う)
スクリーンショット 2024-11-10 10.51.40.png

87日目_2024/11/10

古い文字列書式設定方法

# 'string'の中の%はvaluesの余りの要素に置き換えられる
'string' % values

スクリーンショット 2024-11-10 10.55.19.png

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)

スクリーンショット 2024-11-10 11.37.46.png

バイナリモード

bytesモードで読み書きする(以下画像のように、先頭に「b」がついているものがbytesモード)
スクリーンショット 2024-11-10 11.39.43.png

使い方:open関数で、rbにする
スクリーンショット 2024-11-10 11.41.06.png

bytesモードはエンコーディングを指定できない

スクリーンショット 2024-11-10 11.42.02.png

バイナリデータはバイナリモードで

・テキストモードの読み取りでは、行末記号(Unixでは¥n、Windowsでは¥r¥n)を¥nに変換するのがデフォルト
・テキストモードの書き込みでは、¥nをプラットフォーム固有の行末記号に戻すのがデフォルト(open関数のnewlineで変換することができる)
・テキストファイルは問題ないが、バイナリファイルはデータを破壊する恐れがある

withキーワード = 処理中に例外が発生しても必ず最後にファイルを閉じる

スクリーンショット 2024-11-10 11.48.15.png

try-finallyブロックを使って書くよりずっと簡潔に書ける

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?