はじめに
Python の組み込み関数に関する実験(Lab)へようこそ。Python インタープリタは、インポートを必要とせずに常時利用可能な豊富な関数と型を提供します。これらの関数は、データ操作から入出力操作に至るまで、一般的なタスクを実行するための基本的な構成要素です。
この実験では、論理的なグループに分類された、最も重要な組み込み関数の一部について実践的な経験を積みます。この実験を終える頃には、これらの関数を効果的に使用して、より効率的で読みやすい Python コードを書くことができるようになるでしょう。
データ型変換と検査
このステップでは、int(), str(), list(), dict(), type(), isinstance() のような関数を使用して、異なるデータ型への変換とオブジェクトの検査について学習します。これらは Python でデータを扱うための基本となります。
注記: WebIDE (VS Code のようなもの) の使用に慣れていない場合は、まずこちらの実験 (lab) で学習してください。
まず、左側のファイルエクスプローラーからファイル step1_conversion.py を開きます。このファイルにコードを記述していきます。
step1_conversion.py に以下のコードを追加します。このコードは、文字列を整数に、タプルをリストに、ペアのリストを辞書に変換する方法を示しています。また、オブジェクトの型を確認する方法も示しています。
## step1_conversion.py
## int(): 数値または文字列から整数オブジェクトを返します。
num_str = "123"
num_int = int(num_str)
print(f"String '{num_str}' as integer: {num_int}")
## str(): オブジェクトの文字列バージョンを返します。
int_val = 456
str_val = str(int_val)
print(f"Integer {int_val} as string: '{str_val}'")
## list(): イテラブルから新しいリストを作成します。
my_tuple = ('a', 'b', 'c')
my_list = list(my_tuple)
print(f"Tuple {my_tuple} as list: {my_list}")
## dict(): 新しい辞書を作成します。
my_pairs = [('x', 1), ('y', 2)]
my_dict = dict(my_pairs)
print(f"List of pairs {my_pairs} as dict: {my_dict}")
## type(): オブジェクトの型を返します。
print(f"Type of num_int: {type(num_int)}")
## isinstance(): オブジェクトがクラスのインスタンスである場合に True を返します。
is_list = isinstance(my_list, list)
print(f"Is my_list an instance of list? {is_list}")
次に、ファイルを保存し、ターミナルから実行します。
python3 step1_conversion.py
データ型の変換と検査が成功したことを確認する、以下の出力が表示されるはずです。
String '123' as integer: 123
Integer 456 as string: '456'
Tuple ('a', 'b', 'c') as list: ['a', 'b', 'c']
List of pairs [('x', 1), ('y', 2)] as dict: {'x': 1, 'y': 2}
Type of num_int: <class 'int'>
Is my_list an instance of list? True
数学および数値演算
このステップでは、組み込み関数を使用して一般的な数学的計算を実行します。abs(), sum(), min(), max(), round(), および pow() について扱います。
ファイルエクスプローラーからファイル step2_math.py を開いてください。
step2_math.py に以下のコードを追加します。このスクリプトは、様々な数学関数を数値や数値のリストに適用する方法を示しています。
## step2_math.py
numbers = [5, -10, 15, -2, 8]
## abs(): 数値の絶対値を返します。
print(f"Absolute value of -10: {abs(-10)}")
## sum(): イテラブルの要素を合計します。
print(f"Sum of numbers {numbers}: {sum(numbers)}")
## min(): イテラブル内の最小の要素を返します。
print(f"Minimum of numbers: {min(numbers)}")
## max(): イテラブル内の最大の要素を返します。
print(f"Maximum of numbers: {max(numbers)}")
## round(): 指定された精度に数値を丸めた値を返します。
pi_approx = 3.14159
print(f"Rounding {pi_approx} to 2 decimal places: {round(pi_approx, 2)}")
## pow(): base を exp 乗した値を返します。
print(f"2 to the power of 3: {pow(2, 3)}")
ファイルを保存し、ターミナルで実行します。
python3 step2_math.py
出力には、各数学的演算の結果が表示されるはずです。
Absolute value of -10: 10
Sum of numbers [5, -10, 15, -2, 8]: 16
Minimum of numbers: -10
Maximum of numbers: 15
Rounding 3.14159 to 2 decimal places: 3.14
2 to the power of 3: 8
シーケンスとイテラブルの操作
このステップでは、リストやタプルなどのシーケンスを操作および処理する方法を学習します。len(), sorted(), reversed(), enumerate(), map(), filter(), および zip() について扱います。これらの関数の多くはイテレータ(iterator)を返します。イテレータは効率的でメモリを節約するオブジェクトです。
ファイル step3_sequences.py を開いてください。
step3_sequences.py に以下のコードを追加します。このスクリプトは、リストの長さを取得する方法、リストをソートする方法、逆順にする方法、そして map、filter、zip を使用したより複雑な変換を実行する方法を示します。
## step3_sequences.py
my_list = [3, 1, 4, 1, 5, 9]
print(f"Original list: {my_list}")
## len(): オブジェクトの長さ(要素の数)を返します。
print(f"Length of the list: {len(my_list)}")
## sorted(): イテラブル内の要素から新しいソートされたリストを返します。
print(f"Sorted list: {sorted(my_list)}")
## reversed(): 逆順のイテレータを返します。表示するためにリストに変換します。
print(f"Reversed list: {list(reversed(my_list))}")
## enumerate(): enumerate オブジェクト(インデックスと値のペアのイテレータ)を返します。
print(f"Enumerated list: {list(enumerate(my_list))}")
## map(): イテラブルのすべての項目に関数を適用するイテレータを返します。
squared_numbers = map(lambda x: x*x, my_list)
print(f"Squared numbers (map): {list(squared_numbers)}")
## filter(): 関数が True を返すイテラブルの要素からイテレータを構築します。
even_numbers = filter(lambda x: x % 2 == 0, my_list)
print(f"Even numbers (filter): {list(even_numbers)}")
## zip(): 複数のイテラブルを並行してイテレートします。
list_a = ['a', 'b', 'c']
list_b = [1, 2, 3]
zipped = zip(list_a, list_b)
print(f"Zipped lists: {list(zipped)}")
ファイルを保存して実行します。
python3 step3_sequences.py
様々なシーケンス操作の結果が出力されます。reversed、map、filter、zip のような関数がイテレータを返すため、それらの内容を表示するために list() を使用してリストに変換している点に注目してください。
Original list: [3, 1, 4, 1, 5, 9]
Length of the list: 6
Sorted list: [1, 1, 3, 4, 5, 9]
Reversed list: [9, 5, 1, 4, 1, 3]
Enumerated list: [(0, 3), (1, 1), (2, 4), (3, 1), (4, 5), (5, 9)]
Squared numbers (map): [9, 1, 16, 1, 25, 81]
Even numbers (filter): [4]
Zipped lists: [('a', 1), ('b', 2), ('c', 3)]
入出力とオブジェクト表現
このステップでは、基本的な入出力操作と、オブジェクトが文字列としてどのように表現されるかを制御する方法を学びます。print(), open(), repr(), および format() に焦点を当てます。また、input() についても簡単に触れます。
ファイル step4_io.py を開いてください。
input() 関数はコンソールから一行を読み取り、それを文字列に変換して返します。例:name = input("Enter your name: ")。実行を一時停止するのを避けるため、このスクリプトでは使用しませんが、知っておくべき重要な関数です。
それでは、step4_io.py に以下のコードを追加します。このスクリプトはファイルへの書き込み、ファイルからの読み取り、およびオブジェクトを文字列として表現・フォーマットするさまざまな方法を実演します。
## step4_io.py
import datetime
## open(): ファイルを開き、対応するファイルオブジェクトを返します。
## ファイルが確実に閉じられるように 'with' ステートメントを使用します。
file_path = "/home/labex/project/my_file.txt"
with open(file_path, "w") as f:
f.write("Hello, LabEx!\n")
f.write("This is a test file.")
print(f"Successfully wrote to {file_path}")
## ファイルからの読み取り
with open(file_path, "r") as f:
content = f.read()
print("--- File Content ---")
print(content)
print("--------------------")
## repr(): オブジェクトの、曖昧さのない印刷可能な表現を含む文字列を返します。
now = datetime.datetime(2023, 10, 27, 10, 30, 0)
print(f"str(now): {str(now)}")
print(f"repr(now): {repr(now)}")
## format(): 値を「フォーマットされた」表現に変換します。
formatted_string = format(123.4567, ".2f")
print(f"Formatted number (123.4567 to .2f): {formatted_string}")
ファイルを保存し、ターミナルから実行します。
python3 step4_io.py
スクリプトは my_file.txt を作成・書き込みし、それを読み戻して内容を出力します。また、datetime オブジェクトに対する str() と repr() の違いを示し、数値のフォーマットを実演します。
Successfully wrote to /home/labex/project/my_file.txt
--- File Content ---
Hello, LabEx!
This is a test file.
--------------------
str(now): 2023-10-27 10:30:00
repr(now): datetime.datetime(2023, 10, 27, 10, 30)
Formatted number (123.4567 to .2f): 123.46
オブジェクトのイントロスペクションとメタプログラミング
この最終ステップでは、オブジェクトの属性や名前空間と対話するための高度な関数を探ります。これはしばしばイントロスペクション(introspection)またはリフレクション(reflection)と呼ばれます。getattr(), hasattr(), setattr(), dir(), globals(), および locals() を使用します。
ファイル step5_introspection.py を開いてください。
簡単なクラスを定義し、その後、イントロスペクション関数を使用してそのインスタンスを動的に検査および変更します。step5_introspection.py に以下のコードを追加してください。
## step5_introspection.py
class Person:
species = "Homo sapiens"
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 30)
## hasattr(): オブジェクトが指定された名前の属性を持つ場合に True を返します。
print(f"Does person have 'name' attribute? {hasattr(p, 'name')}")
print(f"Does person have 'height' attribute? {hasattr(p, 'height')}")
## setattr(): これは getattr() の対になる関数です。オブジェクトの属性を設定します。
print("Setting attribute 'height' to 175...")
setattr(p, 'height', 175)
print(f"Does person have 'height' attribute now? {hasattr(p, 'height')}")
## getattr(): オブジェクトの指定された名前の属性の値を返します。
print(f"Person's name: {getattr(p, 'name')}")
print(f"Person's height: {getattr(p, 'height')}")
## dir(): 現在のローカルスコープ、またはオブジェクトの属性内の名前のリストを返します。
## 'height' が属性のリストに現在含まれているかを確認します。
print(f"Is 'height' in dir(p)? {'height' in dir(p)}")
## globals(): 現在のグローバルシンボルテーブルの辞書を返します。
## 'Person' クラスが globals に含まれているかを確認します。
print(f"Is 'Person' in globals? {'Person' in globals().keys()}")
## locals(): 現在のローカルシンボルテーブルの辞書を返します。
def a_func():
x = 10
print(f"Is 'x' in locals()? {'x' in locals().keys()}")
a_func()
ファイルを保存し、実行します。
python3 step5_introspection.py
出力は、文字列名を使用してオブジェクトの属性を動的にチェック、設定、取得する方法を示しています。また、オブジェクトの属性や、グローバルスコープおよびローカルスコープで利用可能な変数を検査する方法も示しています。
Does person have 'name' attribute? True
Does person have 'height' attribute? False
Setting attribute 'height' to 175...
Does person have 'height' attribute now? True
Person's name: Alice
Person's height: 175
Is 'height' in dir(p)? True
Is 'Person' in globals? True
Is 'x' in locals()? True
まとめ
この実験(Lab)の完了、おめでとうございます!Python の必須の組み込み関数群について、実践的な経験を積むことができました。
この実験(Lab)では、以下の方法を学びました。
- データ型間の変換とオブジェクトの検査(
int,str,type,isinstance)。 - 一般的な数学的操作の実行(
abs,sum,min,max,round)。 - シーケンスとイテラブルの操作と処理(
len,sorted,map,filter,zip)。 - 基本的なファイル I/O とオブジェクトの文字列表現の処理(
open,repr,format)。 - オブジェクトと名前空間の検査および動的な変更(
hasattr,getattr,setattr,dir)。
これらの関数は、日常的な Python プログラミングにおいて基礎となるものです。これらを習得することで、コーディングの効率と可読性が大幅に向上します。引き続き、他の組み込み関数を探求し、ご自身のプロジェクトでそれらを使用する練習を続けてください。



