Open70

【学習メモ】独習 Python

赤神青空赤神青空

printの区切り文字

値を任意の区切り文字、例えば「+」区切りで出力したいならば、以下のように「sep='区切り文字'」を指定する。

name = '赤神'
print('こんにちは',  name, 'さん!', sep='+')

出力:

こんにちは+赤神+さん!

赤神青空赤神青空

printの末尾文字

printによる出力の末尾には、規定の改行が付与される。この改行を除きたい、他の文字に変えたい場合は、以下のように「end='末尾文字'」を追加する。

print('こんにちは', end=' ')
print('こんばんは')

出力:

こんにちは こんばんは

改行の代わりに、半角スペースが付く!

赤神青空赤神青空

識別子の記法

記法 概要
camelCase記法 先頭文字は小文字。以降、単語区切りは大文字で表記 userName
Pascal記法 先頭文字を含めて、すべての単語の先頭を大文字で表記 UserName
アンダースコア記法 すべての文字は小文字/大文字で表記し、単語の区切りはアンダースコア(_)で表す user_name、USER_NAME
  • Pascal記法は、Upper CamelCase記法とも呼ぶ
  • アンダースコア記法は、スネークケース記法とも呼ぶ
赤神青空赤神青空

変数の破棄

del命令を利用することで、宣言済みの変数を破棄することができる。

name = 'Python'
print(name) # 出力: Python

# 変数 name を破棄
del name
print(name)

出力:

NameError: name 'name' is not defined

赤神青空赤神青空

型の性質の呼称

  • ミュータブル:変更可能
  • イミュータブル:変更不可
  • イテラブル:反復可能
  • シーケンス:順序を持つ(インデックスでのアクセスが可)
  • コンテナー:配下に複数の値を格納可能
赤神青空赤神青空

数値セパレーター

Python3.6以降で桁数の大きな数値の可読性を改善するために、数値リテラル中に桁区切り文字(_)を記述できるようになった。

value = 1_234_567
pi = 3.141_592_653_59
num = 0.123_456e10
  • 「,」でないのは、Pythonにおいて別の意味をすでに持っているから
  • あくまで可読性を助けるための機能なので、3桁ごとに区切らなくてはいけないわけではない
赤神青空赤神青空

エスケープシーケンス

  • 「\〜」がエスケープシーケンス
  • 「'」「"」をはじめ、改行/タブ文字など特別な意味を持つ文字を表すために利用
エスケープシーケンス 概要
\ バックスラッシュ
' シングルクォート
" ダブルクォート
\b バックスペース
\f フォームフィード(改ページ)
\n 改行(ラインフィード)
\r 復帰(キャリッジリターン)
\↩️ バックスラッシュと改行文字を無視
\t 水平タブ
\v 垂直タブ
\XX 8進数の文字XX
\xXX 16進数の文字XX
\uXXXX 16bit(4桁)の16進数の文字XXXX
\UXXXXXXXX 32bit(8桁)の16進数の文字XXXXXXXXX
赤神青空赤神青空

フォーマット文字列

  • Python3.6以降では、文字列リテラルの先頭に「f」または「F」を付けることで、文字列の中に{...}の形式で変数を埋めることができ、これのことをフォーマット文字列という
name = "山田"
print(f'こんにちは、{name}さん!')

出力:

こんにちは、山田さん!

赤神青空赤神青空

divmod

Pythonによる除算において、整数部の商と剰余をまとめて得たい場合は、divmodという関数を利用する

print(divmod(5, 3))

出力:

(1,2)

結果は、(5 // 3, 5 % 3)形式のタプルとなる

赤神青空赤神青空

浮動小数点数の演算の注意

浮動小数点数を含んだ演算では、意図した結果が得られない場合がある

print(0.2 * 3)

出力:

0.6000000000000001

これはPythonが内部的には数値を2進数で演算しているための誤差である。
つまり、以下の等式はPythonではFalseになる。

print(0.2 * 3 == 0.6)

このような問題を避け、厳密な結果を要求するような状況では、Decimal型を利用すると良い。Decimal型は10進数の浮動小数点数をサポートする型である。

import decimal

d1 = decimal.Decimal('0.2')
d2 = decimal.Decimal('3')
d3 = decimal.Decimal('0.6')

print(d1 * d2) # 出力: 0.6
print(d1 * d2 == d3) # 出力: True
赤神青空赤神青空

主な代入演算子

演算子 概要
**= 左辺を右辺でべき乗した結果を、左辺に代入 x = 5; x **= 2 → 25
&= 左辺と右辺をビット論理積した結果を、左辺に代入 x = 10; x &= 2 → 2
^= 左辺と右辺をビット排他論理和した結果を、左辺に代入 x = 10; x ^= 2 → 8
| = 左辺と右辺をビット論理和した結果を、左辺に代入 x = 10; x
>>= 左辺を右辺の値だけ右にシフトした結果を左辺に代入 x = 10; x >>= 2 → 2
<<= 左辺を右辺の値だけ左にシフトした結果を左辺に代入 x = 10; x <<= 2 → 40

※知らなかったものだけピックアップ

赤神青空赤神青空

「=」演算子による代入は参照の引き渡し

具体例

num1 = 10
num2 = num1

print(id(num1)) # 出力: 4309494352
print(id(num2)) # 出力: 4309494352
  • idは、オブジェクトの参照(識別値)を返す関数
  • 識別値が同じであれば、同じオブジェクトであることを表す
  • 変数 num1に格納されているのはあくまで識別値なので、コピーされるのも識別値である
赤神青空赤神青空

ミュータブルとイミュータブル

  • ミュータブルとは、オブジェクトをそのままに中身だけを変更できることを意味する
  • イミュータブルでは、一度作成したオブジェクトの中身を書き換えることはできない
  • 型がミュータブル/イミュータブルのいずれであるかによって、値を操作したときの影響範囲が変化する点がポイント
赤神青空赤神青空

アンパック代入

アンパック代入とは、リストや辞書などを分解し、配下の要素を個々の変数に分解するための構文であり、左辺の数だけ変数を列挙する。

data = [1, 2, 3, 4, 5]
a, b, c, d, e = data

これによって、右辺のリストが個々の要素に分解(unpack)されて、それぞれに対応する変数a〜eに代入される。

変数にアスタリスクを付与することで、個々の変数に分解されなかった残りの要素をまとめてリストとして切り出すことも可能

data = [1, 2, 3, 4, 5]
m, n, *o = data

print(m) # 出力: 1
print(n) # 出力: 2
print(o) # 出力: [3, 4, 5]

アンパック代入で一部の要素がいらない場合は、アンダースコア(_)を利用するのが一般的である(構文として決まりがあるわけではない)

入れ子のリストをアンパック代入することもできる

data = [1, 2, [31, 32, 33]]

a, b, c = data
print(a) # 出力: 1
print(b) # 出力: 2
print(c) # 出力: [31, 32, 33]

x, y, (z1, z2, z3) = data
print(x) # 出力: 1
print(y) # 出力: 2
print(z1) # 出力: 31
print(z2) # 出力: 32
print(z3) # 出力: 33

アンパック代入を利用することで、変数の値を入れ替えること(スワッピング)もできる。もしもアンパック代入を利用しないのであれば、いずれかの変数をいったん別の変数に退避させる必要がある。

x = 15
y = 38
x, y = y, x
print(x, y) # 出力: 38 15
赤神青空赤神青空

新しい代入演算子「:=」

Pythonでは以下のコードはエラーになる。

y = (x = 20) / 10

これは、Pythonの代入は式ではなく文であるからである。これでは不便だということで、Python3.8から導入されたのが「:=」演算子である。セイウチ演算子とも呼ばれる(らしい)。

y = (x := 20) / 10
赤神青空赤神青空

リストの比較

リスト同士の比較にも、比較演算子を利用することが可能である。考え方は文字列と同じで、先頭から要素を比較していき、最初に異なる要素が見つかった場合に、その大小でリスト全体の大小を決定する。

data1 = [1, 2, 3]
data2 = [1, 5]
data3 = [1, 2]

print(data1 < data2) # 出力: True
print(data1 < data3) # 出力: False
赤神青空赤神青空

浮動小数点数の比較

前述した通り、浮動小数点数は内部的には2進数として扱われるため、厳密な演算には不向きである。浮動小数点数を比較するには、以下のような方法を利用する。

  1. Decimal型
    Decimal型は厳密な浮動小数点数の演算/比較を可能にする
  2. 丸め単位による比較
EPSILON = 0.00001
x = 0.2 * 3
y = 0.6
print(abs(x - y) < EPSILON) # 出力: True

ここで、EPSILONは誤差の許容範囲を表す。

  1. isclose関数
    mathモジュールのisclose関数を利用することで、2.のような近似比較をシンプルに表現することが可能。
import math

print(math.isclose(0.2 * 3, 0.6)) # 出力: True
赤神青空赤神青空

同一性と同値性

比較演算子を利用する上で、同一性(Identity)と同値性(Equivalance)を区別することが重要

  • 同一性:参照値が同じオブジェクトを参照していること
  • 同値性:オブジェクトが同じ値を持っていること
赤神青空赤神青空

論理演算子

主な論理演算子(例のxはTrue、yはFalseを表すものとする)

演算子 概要
and 論理積。左右の式がともにTrueの場合にTrue x and y → False
or 論理和。左右の式のいずれかがTrueの場合にTrue x or y → True
^ 排他的論理和。左右の式のいずれかがTrueで、かつ、ともにTrueでない場合にTrue x ^ y → True
not 否定。式がTrueの場合はFalse。Falseの場合はTrue not x → False

※「^」は正しくはビット演算子に分類されるべき演算子であるが、論理積、論理和と比較した方が理解が容易のため、ここでまとめている

赤神青空赤神青空

演算子の優先順位

優先度 演算子
高い (...), [...], {...}
x[i], x[i:i], x(args...), x.attr
await
**
+x, -x, ~x
*, @, /, //, %
+, -
<<, >>
&
^
|
in, not in, is, is not, <, <=, >, >=, !=, ==
not
and
or
if...else
lambda
低い :=
赤神青空赤神青空

構造化プログラミング

一般的に、プログラミングの構造は以下のように分類できる。

  • 順次(順接):記述された順に実行
  • 選択:条件によって処理を分岐
  • 反復:特定の処理を繰り返し実行

この3つを組み合わせながらプログラミングを組み立てていく手法のことを構造化プログラミングという

赤神青空赤神青空

if命令と複合文

if命令は複合文の一種である。複合文(Compound Statement)とは、配下に複数の文を持ち、それらの文を実行するかどうかを決めるための文のことである。

複合文は、より具体的には1つ以上の節(clause)から構成される。節は、さらにヘッダー(header)とスイート(suite)とに分類される。

赤神青空赤神青空

インデントの注意

  1. 空のブロックはpass命令で表す
    開発中などの理由で空のブロックを用意したい場合には、以下のようにpass命令を利用する。
if i == 10
    pass

passは「なにもしない」を表す命令である。何もしないが、意味のある分としてはみなされるので、これで空ブロックを表現できる。

  1. 複数行コメントもインデントする
    複数行コメント("""〜""")を用いる際、コメントもインデントの対象である。これは、複数行コメントの実態は、あくまで文字リテラルだからである。
赤神青空赤神青空

try命令

構文:try...except命令

try:
    ...例外が発生するかもしれないコード
except 例外の種類 as 例外変数:
    ...例外発生時の処理...

try:
    num = input('数字を入力してください:')
    print('2倍すると...', float(num) * 2)
except ValueError as ex:
    print('エラー発生:', ex)
赤神青空赤神青空

except節のさまざまな記法

  1. 例外変数を参照しない場合
    except節の中で例外変数を参照する必要がない場合には、「as 〜」は省略しても構わない。
except ValueError:
    print('エラーが発生しました!')
  1. 複数の例外処理をまとめて捕捉したい場合
    たとえば、ValueError、TypeErrorに対して、同じ例外処理を実装したい場合には、以下のように列挙する
except (ValueError, TypeError) as ex
  1. すべての例外を捕捉する
    例外名そのものを省略することも可能
except:
    print('エラーが発生しました!')
赤神青空赤神青空

例外が発生した場合、しなかった場合の処理を定義する

try...except命令では、後処理を行うための節としてelse/finallyを用意してある。

構文:try...except...else...finally命令

try:
    ...例外がが発生するかもしれないコード...
except 例外の種類 as 例外変数:
    ...例外発生時の処理...
else:
    ...例外が発生しなかった時の処理...
finally:
    ...例外の有無に関わらず実行する処理...

else節は例外なしでtry節が終了した場合に、finally節は例外の有無に関わらずtry/except節が終了した後に、それぞれ実行される

赤神青空赤神青空

組み込みライブラリとモジュール

  • Pythonインタープリターに組み込まれている関数/型を組み込み関数/組み込み型(総称して、組み込みライブラリ)と言い、特別な準備なしで呼び出すことが可能
  • Builtin でない型/関数は、モジュールという枠で束ねられて、提供される
赤神青空赤神青空

  • 型をより専門的な用語ではクラスという
  • 型に対して具体的な値を与えて、コードの中で利用できるようにすることをインスタンス化と呼ぶ
  • このような型に基づく値のことをオブジェクト、またはインスタンスともいう
msg = 'こんにちは'

'こんにちは'という文字リテラルによって、str型(クラス)のインスタンス(オブジェクト)を生成し、変数 msg に代入するという意味

赤神青空赤神青空

一般的なインスタンス化

構文:インスタンス化

型名(引数, ...)

型名を関数のように呼び出すことで、インスタンスを作成することができる(インスタンスを生成するための仕組みということで、従来の関数と区別してコンストラクターと呼ぶこともある)。

赤神青空赤神青空

型に属する関数

型は専用の関数を持っており、これを型に属さない関数と区別してメソッドと呼ぶ。

構文:メソッドの呼び出し

インスタンス.メソッド(引数, ...)
赤神青空赤神青空

型に属する情報

型に属する変数を、普通の変数と区別して属性(アトリビュート)と呼ぶ。属性にアクセスするための一般的な構文は以下の通りである。

構文:属性へのアクセス

インスタンス.属性

属性/メソッドなど、クラスに属する要素のことを総称して、メンバーと呼ぶこともある。

赤神青空赤神青空

インスタンスを生成せずに利用できるメソッド

メソッド/変数の種類によっては、例外的にインスタンスを生成せずに呼び出せるものがある。このようなメソッド/変数のことをクラスメソッド、クラス変数と呼ぶ。

構文:クラスメソッド/クラス変数の呼び出し

型名.メソッド名(引数, ...)
型名.変数

例えば、datetime.date型のtodayメソッドで今日の日付を求める例

import datetime
current = datetime.date.today()
print(current) #出力: 2025-04-16

todayは(インスタンスを操作するのではなく)インスタンスそのものを生成するためのメソッドなので、インスタンスを生成せずに利用でき、また、できなければならない。クラスメソッド/クラス変数に対して、インスタンス経由で呼び出すメソッド/変数のことをインスタンスメソッド/インスタンス変数と呼ぶ。

  • インスタンスメソッド/変数は、インスタンスの情報を取得/操作するためのもの
  • クラスメソッド/変数は、クラスの情報を取得/操作するためのもの
赤神青空赤神青空

文字列を大文字↔︎小文字で変換数る

メソッド 概要
lower() 大文字→小文字に変換
upper() 小文字→大文字に変換
swapcase() 大文字と小文字を反転
capitalize() 先頭文字を大文字に、以降を小文字に変換
title() 単語の先頭文字を大文字に、それ以外を小文字に変換
casefold() 大文字小文字の区別を除去

casefold() の挙動は lower() に似ているが、大文字小文字の区別をなくすという意味で、より積極的な小文字化である。例えば、ドイツ語のßは「ss」を表すので、lowerでは変換されないが、casefoldは「ss」に変換する

赤神青空赤神青空

インデックス/スライス構文

構文:インデックス/スライス構文

txt[index]
txt[start:end:step]
赤神青空赤神青空

文字の種類を判定

メソッド 概要
isalnum() 英数字であるか
isalpha() 英字であるか
isascii() ASCII文字であるか
isdecimal() 10進数であるか
isdigit() 数値であるか
isnumeric() 数値文字であるか
isidentifier() 有効な識別子であるか
islower() 小文字であるか
isupper() 大文字であるか
istitle() 単語の先頭文字だけが大文字であるか
isprintable() 印字可能な文字であるか
isspaca() 空白文字であるか

文字種による結果の比較('\u2078'は上付き数字「{}^8」)

文字種 isdigit isdecimal isnumeric
半角数字('15') True True True
上付き数字('\u2078') True False True
全角数字('15') True True True
ローマ数字('XV') False False True
漢数字('一参億') False False True
バイト文字(b'15') False エラー エラー
赤神青空赤神青空

文字列を数値に変換する

数値文字を判定するのではなく、数値(int or float)に変換するのであれば、unicodedataモジュールのdigit/numeric関数を利用する。

import unicodedata

print(unicodedata.digit('5')) # 出力: 5
print(unicodedata.numeric('参')) # 出力: 3.0
print(unicodedata.numeric('Ⅷ')) # 出力: 8.0
赤神青空赤神青空

予約済みの識別子を確認する

isidentifier メソッドは、与えられた文字列が識別子として認められている文字のみで構成されているかを判断するだけである。文字列が予約済みの識別子(キーワード)であるかを判定する場合は、keywordモジュールのiskeyword関数を利用する。

赤神青空赤神青空

文字列の検索

ある文字列の中で、特定の文字列が登場する文字位置を取得sるには、find/rfindメソッドを利用する。findメソッドは検索を前方から、rfindメソッドは後方から、それぞれ開始する。

構文:find/rfindメソッド

s.find(sub[, start[, end]])
s.rfind(sub[, start[, end]])
  • 返り値は、先頭からも文字位置を返す
  • 引数subが見つからなかった場合には、-1を返す
赤神青空赤神青空

例外を返すindex/rindexメソッド

検索文字列が見つからなかった場合に、find/rfindメソッドが-1を返すのに対して、例外(ValueError)を返すのがindex/rindexメソッドである。構文はfind/rfindメソッドと同じである。

赤神青空赤神青空

部分文字列の登場回数をカウント

文字位置を検索するfind/indexメソッドに対して、countメソッドを利用することで、部分文字列が登場する回数をカウントすることも可能である。

構文:countメソッド

s.count(sub[, start[, end]])
赤神青空赤神青空

文字列の前後から空白を除去

strip/lstrip/rstripメソッドを利用することで、文字列前後の空白を除去することができる。

  • strip:前後双方
  • lstrip:前方だけ
  • rstrip:後方だけ

構文:strip/lstrip/rstripメソッド

s.strip([chars])
s.lstrip([chars])
s.rstrip([chars])

ただし、除去すべき空白とは、いわゆる半角空白だけではなく、以下のものも含んでいる。

  • 全角空白
  • タブ文字(\t, \v)
  • 改行文字(\r, \n)
  • フォームフィード(\f)
赤神青空赤神青空

文字列に特定の文字列が含まれるかを判定

文字列に指定された部分文字列が含まれるかを判定するには、in演算子を利用する。単に含まれるかだけでなく、ある文字列が先頭/末尾に位置するかを判定するならば、startswith/endswithメソッドも利用できる。

構文:in演算子、startswith/endswithメソッド

substr in s
s.startswith(prefix[, start[, end]])
s.endswith(suffix[, start[, end]])
赤神青空赤神青空

(おまけ)Pythonのドキュメントによくある[, start]←こんなのの意味

Pythonのドキュメントでよく使われる形式で、角括弧 [ ] で囲まれたパラメータはオプション(省略可能)であることを示している

赤神青空赤神青空

一般的な分割(split/rsplitメソッド)

一般的な分割の用途には、split/rsplitメソッドを利用する。splitメソッドは文字列は前方から、rsplitメソッドは後方から、それぞれ分割する。

構文:split/rsplitメソッド

s.split(sep=None, maxsplit=-1)
s.rsplit(sep=None, maxsplit=-1)
赤神青空赤神青空

改行文字で文字列を分割(splitlinesメソッド)

splitlinesメソッドで認識する改行

改行文字 概要
\n 改行(ラインフィード)
\r 復帰(キャリッジリターン)
\r\n 改行+復帰
\x85 改行(C1制御コード)
\v, \x0c 改ページ
\x1c ファイル区切り
\x1d グループ区切り
\x1e レコード区切り
\u2028 行区切り
\u2029 段落区切り
赤神青空赤神青空

区切り文字で文字列を2分割

区切り文字が最初に見つかった位置で文字列を分割するのがpartitionメソッドである。一方で、rpartitionは最後に見つかった位置で分割するメソッドである。

赤神青空赤神青空

リストの結合

リスト(正しくはイテラブルな型)は、joinメソッドを利用することで、指定の区切り文字で連結することが可能である。

構文:joinメソッド

s.join(iterable)

非文字列のリストを連結する場合は、リスト内包表記でstr型に変換してからjoinメソッドに渡すようにする

赤神青空赤神青空

文字列の置き換え

文字列に含まれる特定の文字列を別の文字列で置き換えるには、replaceメソッドを利用する。

構文:replaceメソッド

s.replace(old, new [, count])

最初のn個だけ置き換えたい場合には、引数countを指定する

赤神青空赤神青空

特定の文字を変換/削除する

表記などを揃えるなどの目的で、文字列に含まれる特定の文字(群)を変換/削除したい、というケースがある。そのような場合は、replaceメソッドよりtranslateメソッドを利用することが推奨される。

msg = '今日の, あなたの運勢は, ●よい感じ●です. '
print(msg.translate(str.maketrans({
    ', ': '、',
    '. ': '。',
    '●': ''
})))
print(msg.translate(str.maketrans(',.', '、。', '●')))
赤神青空赤神青空

文字を整形する

formatメソッドを利用することで、指定された書式文字列に基づいて文字列を整形することが可能である。

構文:formatメソッド

txt.format(*args, **kwards)

基本的な使い方

# インデックスを使用
print("私は {} 歳で、名前は {} です。".format(25, "太郎"))
# 出力: 私は 25 歳で、名前は 太郎 です。

# キーワード引数を使用
print("私は {age} 歳で、名前は {name} です。".format(age=25, name="太郎"))
# 出力: 私は 25 歳で、名前は 太郎 です。

*args の使用例(位置引数のアンパック):

values = (25, "太郎")
print("私は {} 歳で、名前は {} です。".format(*values))
# 出力: 私は 25 歳で、名前は 太郎 です。

**kwargs の使用例(キーワード引数のアンパック):

data = {"age": 25, "name": "太郎"}
print("私は {age} 歳で、名前は {name} です。".format(**data))
# 出力: 私は 25 歳で、名前は 太郎 です。
赤神青空赤神青空

書式の指定

  • めんどくさいので省略
  • ただし、使いこなせるとかなり便利そうなので絶対に復習すること
赤神青空赤神青空

コレクション

型の中でも、複数の値を束ねるための仕組みを持つものを総称して、コレクション、コンテナーなどと呼ぶ

  • シーケンス型
    • リスト、タプル、レンジ
    • インデックスで管理
    • 値の重複はOK
  • セット(集合)型
    • 順番は持たない
    • 値の重複はNG
  • 辞書(マッピング)型
    • キーと値のペアで管理
    • キーの重複はNG
赤神青空赤神青空

リストに要素を追加/削除する

構文:append/insert/popメソッド

lists.appned(x) # 末尾に追加
lists.insert(i, x) # i番目の直前に挿入
lists.pop([i]) # i番目を削除
赤神青空赤神青空

リストのないの要素を削除する

構文:remove/clearメソッド

lists.remove(x) # 要素xを削除する
lists.clear() # リストを空にする
赤神青空赤神青空

複数要素を追加/置換/削除する

data = ['あ', 'い', 'う', 'え', 'お']

要素の置き換え:

data[1:3] = ['1', '2', '3']
print(data) # 出力: ['あ', '1', '2', '3', 'え', 'お']

これを利用して、からのリストを代入することで、範囲要素の削除をすることが可能

data[2:4] = [] # 出力: ['あ', 'い', 'お']

別解として、del命令を利用してもいい

del data[2:4] # 出力: ['あ', 'い', 'お']

特殊な範囲指定として、以下のような書き方もある

data[1:1] = ['1', '2', '3']
# 出力: ['あ', '1', '2', '3, 'い', 'う', 'え', 'お']
赤神青空赤神青空

リストを複製する

copyメソッドを利用する。

data = ['鈴木', '田中', '井上', '加藤']
data2 = data.copy()
print(data == data2) # 出力: True
print(data is data2) # 出力: False

これは、data2の中身はdataと同じであるが、実体は別物であることを表している。

赤神青空赤神青空

シャローコピーとディープコピー

copyメソッドによるコピーは、いわゆるシャローコピーである。つまり、配下の要素がミュータブルである場合、コピー先の変更はコピー元にも影響を及ぼす。これを避けるには、copyモジュールのdeepcopy関数を利用する必要がある。そうすることで、互いの変更が双方に影響しないようにすることができる。このようなコピーのことをディープコピーと呼ぶ。

赤神青空赤神青空

リストの連結

リストを連結するには、文字列と同じく「+」「」演算子を利用する。ただし、「」連結はあくまで参照のコピーでしかないので値そのものをコピーしているわけではない点に注意。

赤神青空赤神青空

既存のリストの拡張

既存のリストに対して、要素を連結したいという場合、extend メソッドを利用する。これは、「+=」演算子を利用しても代替することが可能である。

赤神青空赤神青空

任意のキーで並べ替える

ラムダ式を用いることで独自のルールで並べ替えることが可能である。たとえば、役職(部長→課長→係長→主任)順に、辞書ソートすることも可能である。

title = ['部長', '課長', '係長', '主任']
data = [
    {'name': '山田太郎', 'position': '主任'},
    {'name': '鈴木次郎', 'position': '部長'},
    {'name': '田中花子', 'position': '課長'},
    {'name': '佐藤恵子', 'position': '係長'},
]

data.sort(key=lambda x: title.index(x['position']))
print(data)
赤神青空赤神青空

ソート順を保ちながら要素を挿入する(bisectモジュール)

bisect モジュールを用いることで、リストのソート順を保ちながら、新規の要素を挿入することが可能である。bisect とは配列二分法アルゴリズムの意味で、挿入箇所を特定するためにこれが使われていることから、そう呼ばれている。

赤神青空赤神青空

複数のリストをまとめて処理する

zip 関数wp利用することで、複数のリストを束ねて処理することが可能である。

ただし、リストの個数が異なる場合、zip関数は最も要素の少ないリストに合わせて処理を行う。

もしも最も要素数の多いリストに合わせて処理するならば、itertools モジュールの zip_longest 関数を利用する・

赤神青空赤神青空

リストないの要素を加工する

組み込み関数 mapを利用することで、リストから順に要素を取得&加工し、新たなリストを生成することが可能である。

構文:map 関数

map(function, iterable, ...)

例:個々のリストの要素を磁場したリストを返す

data = [1, 3, 5]
result = map(lambda v: v * v, data)
print(list(result))
赤神青空赤神青空

複数のリストを処理する

map 関数では、引数iterable に複数のリストを私ことで、それぞれの要素を統合することも可能である。

data = [1, 3, 5]
data2 = [2, 7, 10]

result = map(lambda v1, v2: v1 * v2, data1, data2)
print(list(result))

引数として渡すリストの要素数は同じである必要はない。 要素数が小さい方のリストに合わせて処理が進み、リストが読み取れなくなったところで処理は終了する。

赤神青空赤神青空

リストの内容を特定の条件で絞り込む

組み込み関数 filter を利用することで、リストの内容を関数で判定し、その中で True と判定された要素だけを取得することができる。

構文:filter関数

filter(function, iterable)
赤神青空赤神青空

リストないの要素を順に処理して1つにまとめる

functools モジュールの reduce 関数を利用する。

構文:reduce関数

reduce(function, iterable[, initializer])
赤神青空赤神青空

イミュータブルなリストを生成

list とよく似た型として、タプル(tuple)という型がある。タプルとは、要は「変更できない(イミュータブルな)リスト」である。

赤神青空赤神青空

ハッシュ表とキー

辞書(dict)は内部的にハッシュ表(ハッシュテーブル)と呼ばれるリストを持つ。要素を保存する際に、キーからハッシュ値を求めることで 、ハッシュ表のどこに値(オブジェクト)を保存するかを決定する。

しかし、ハッシュ値のすべてのパターンに対応するサイズのハッシュ表をあらかじめ用意しておくのは現実的ではない。よって、一般的には任意サイズのハッシュ表を用意しておいて、ハッシュ表を表サイズ未満の値に丸め、格納先を決定する。

その性質上、ハッシュ値は重複する可能性もある。その場合には、決められたルールでハッシュ表ないの別の場所に値を格納する。

以上のような性質から、辞書のキーは、ハッシュ値を算出可能な型でなければならない。このような性質を hashable(ハッシュ可能)と呼ぶ。

組み込み型では、例えば、以下のような型がhashableである。

  • int
  • str
  • bytes
  • tuple
  • frozenset
赤神青空赤神青空

関数名でよく利用する動詞

動詞 役割
add 追加
get 取得
insert 挿入
begin 開始
start 開始
open 開く
read 読み込み
send 送信
create 生成
is 〜であるか
remove/delete 削除
set 設定
replace 置換
end 終了
stop 終了
close 閉じる
write 書き込み
receive 受信
initialive, init 初期化
can 〜できるか