
AIプログラミング講座③
ChatGPT:
他にも試したいことや質問があれば、どうぞ聞いてくださいね!
ネル:
次は計算内容に入ってくと思うんだけど def convert_to_era(year): っていうのは?
ChatGPT:
def convert_to_era(year): は、関数 convert_to_era を定義するための行です。この関数は、引数として与えられた year(西暦年)をもとに、日本の元号(例えば「令和」や「平成」など)を計算して返します。
関数の構造
def: 関数を定義するキーワードです。
convert_to_era: 関数名です。この名前で関数を呼び出します。例えば、convert_to_era(2023)のように使います。
year: 関数の引数(パラメータ)です。ここでは西暦年が入力として渡され、関数内でその年が使われます。
実際の動作の流れ
関数内部では、入力された西暦年に基づき、対応する元号と年数を計算し、その結果を返します。以下のようなロジックが含まれています:
エラーチェック(例: 文字列が入力された場合など): 入力値が数字以外の場合にエラーが発生しないようにします。
条件分岐: yearが2019年以降であれば「令和」、1989年から2018年であれば「平成」など、時代ごとの条件を設定します。
元号と年数の計算: 対応する元号と年数を計算し、例えば「平成3年」のような形式で返します。
具体的なコード例
以下のコードは、この関数の具体的な処理内容です。
def convert_to_era(year):
try:
year = int(year) # 入力された西暦を整数に変換
if year >= 2019:
era = "令和"
era_year = year - 2018
elif year >= 1989:
era = "平成"
era_year = year - 1988
elif year >= 1926:
era = "昭和"
era_year = year - 1925
elif year >= 1912:
era = "大正"
era_year = year - 1911
elif year >= 1868:
era = "明治"
era_year = year - 1867
else:
return "明治以前の元号には対応していません"
# 元年の場合は「元」に変換
if era_year == 1:
era_year = "元"
return f"{era}{era_year}年" # 元号と年数を組み合わせた結果を返す
except ValueError:
return "無効な入力です。数値の西暦を入力してください。"
各部分の説明
year = int(year):yearを整数に変換し、数字以外が入力されたときにはエラーが発生します。
if ... elifの条件分岐で、西暦がどの元号に対応するかを判定します。
era_year = year - <開始年 - 1>:西暦から元号の開始年を引き、元号の年数を求めています。
if era_year == 1: era_year = "元":元年を「1年」ではなく「元」と表示します。
最後に、元号と年数を組み合わせた文字列を返します。
この関数を使うと、西暦年を簡単に元号に変換できるようになります。さらに深く知りたい部分があれば、続けて説明しますね!
ネル:
頭がこんがらがりそうです!^^;
ChatGPT:
少しずつ進めていきましょう!関数や条件分岐は最初は難しく感じるかもしれませんが、順を追っていくと理解しやすくなると思います。
もし関数の定義やif文の使い方など、どこから理解したいかリクエストがあればそこから説明しますね。
ネル:
defの命令は関数なら何でも扱えるんですか?
ChatGPT:
はい、defを使って、さまざまな種類の関数を自由に定義できます!どんな処理でも関数としてまとめることができるので、コードを整理してわかりやすくしたり、同じ処理を繰り返し使えるようにしたりするのにとても便利です。
defでできること
defを使えば、以下のような関数を作成できます。
引数なしの関数
引数を受け取らず、決まった処理だけを行う関数も作れます。
def greet():
print("こんにちは!")引数を使う関数
引数を使って、動的に異なる処理ができる関数です。今回のconvert_to_era関数のように、引数に応じた元号を返すなど、処理に幅が出ます。
def square(number):
return number ** 2複数の引数を使う関数
引数が複数ある場合もdefで定義できます。
def add(x, y):
return x + yデフォルト値を持つ引数
特定の引数にデフォルト値を設定し、指定がない場合でも動くようにできます。
def greet(name="ゲスト"):
print(f"こんにちは、{name}さん!")処理が複雑な関数
関数内に条件分岐やループを組み込んで、複雑な処理を行わせることもできます。
def check_number(number):
if number > 0:
return "正の数です"
elif number < 0:
return "負の数です"
else:
return "ゼロです"
使い分けのポイント
コードの再利用: 同じ処理を複数箇所で使いたい場合に、関数としてまとめると便利です。
コードの整理: 長いコードを関数ごとに分けると、読みやすく理解しやすくなります。
色々な使い方がありますが、慣れると簡単に関数が作れるようになりますよ!興味があれば、さらに例を見てみましょう。
ネル:
まず関数の種類と数が知りたいかな
ChatGPT:
Pythonには、関数の基本形だけでもさまざまな種類があり、用途に合わせて使い分けられるようになっています。ここでは、Pythonでよく使われる関数の種類とその特徴を紹介しますね!
関数の主な種類
組み込み関数(Built-in Functions)
Pythonに最初から用意されている関数です。特別な設定やインポートなしで使えます。
例:print()、len()、type()、int()、str()など。
数: Pythonには、80種類以上の組み込み関数があります。
ユーザー定義関数(User-defined Functions)
defを使って自分で定義する関数です。
特定の処理をまとめて、再利用できるようにしたいときに作成します。
例:
def greet(name):
print(f"Hello, {name}!")
ラムダ関数(匿名関数)
lambdaキーワードを使い、一行で定義できる関数です。
名前を持たないため、短い処理で使い捨てとして使用されます。
例:
square = lambda x: x ** 2
print(square(4)) # 出力: 16
再帰関数(Recursive Functions)
関数内部で自分自身を呼び出す関数です。
再帰を使うことで、分割して解決するような問題(例えば階乗計算やフィボナッチ数列)を効率的に処理できます。
例:
def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n - 1)
ジェネレーター関数(Generator Functions)
yieldキーワードを使い、返す値を一度に全てではなく、順次生成する関数です。
メモリ効率が良く、大量のデータを処理する際に有効です。
例:
def count_up_to(n):
count = 1
while count <= n:
yield count
count += 1
コルーチン関数(Coroutine Functions)
async defで定義する非同期処理用の関数で、処理を中断しながら進めるのに向いています。
イベントループ内で非同期のタスクを実行する際に使用されます。
例:
import asyncio
async def say_hello():
print("Hello!")
await asyncio.sleep(1)
print("Hello again!")
関数の数
組み込み関数:80種類以上。
ユーザー定義関数:制限なし(プログラマーが自由に作成)。
モジュール・ライブラリの関数:Python標準ライブラリや外部ライブラリには、さらに数え切れないほどの関数が含まれています(例:math、random、osライブラリなど)。
それぞれの関数は用途に応じて使い分けられ、効率的にプログラムを作成するための大切な道具になります。どれか具体的に試してみたい種類があれば、お伝えください!
ネル:
まず、ユーザー定義関数だけど def greet(name): これはgreetって関数にnameという引数を渡して print(f"Hello, {name}!")によってHello ほにゃらら(name)を表示させるって計算?
ChatGPT:
その通りです!def greet(name):で定義される greet 関数に、name という引数を渡しています。
処理の流れ
関数の定義: def greet(name): で greet 関数が定義され、引数 name を受け取れるようにします。
引数の受け取り: name に任意の値(例えば "Alice" や "Bob" など)を渡します。
出力処理: print(f"Hello, {name}!") が実行され、name の値を文字列内に組み込んで、 "Hello, Alice!" のような挨拶メッセージを表示します。
実行例
ddef greet(name):
print(f"Hello, {name}!")
# 関数を呼び出し
greet("Alice") # 出力: Hello, Alice!
greet("Bob") # 出力: Hello, Bob!
このように、name に異なる名前を渡せば、それぞれの名前に応じたメッセージが表示されます。これは「計算」というより「メッセージ表示」と捉えられますが、name に応じて変化する動的な処理をしていると考えると、近いものがあるかもしれませんね!
ネル:
関数の呼び出しは簡単でありがたい
greet()は条件付きで呼び出すように指示できますか?
ChatGPT:
はい、関数を条件付きで呼び出すこともできます!たとえば、if文を使って条件を満たした場合にのみ greet() を呼び出すように制御できます。
例: 条件付きで greet() を呼び出す
次のコードは、name が空文字列でない場合にのみ greet() を呼び出す例です。
def greet(name):
print(f"Hello, {name}!")
# 条件付きで関数を呼び出す
name = "Alice"
if name: # nameが空でないときにTrue
greet(name)
else:
print("名前が入力されていません")
処理の流れ
name に名前(または空文字列)が代入されます。
if name: という条件で、name に何か文字が入っているかどうかを確認します。
name が空でない場合は True になり、greet(name) が呼び出されます。
もし name が空なら else の処理に移り、「名前が入力されていません」と表示します。
実行結果
name = "Alice" の場合、greet("Alice") が呼び出されて Hello, Alice! と表示されます。
name = "" の場合は、「名前が入力されていません」と表示されます。

このように、条件によって関数を呼び出すかどうかを柔軟に制御できます!
ネル:
なるほど!ついでにif文にも触れられてわかりやすかったです
ChatGPT:
そう言ってもらえて嬉しいです!if文は、プログラムで条件に応じた動作をさせるためにとても重要な要素です。関数の呼び出しや、さまざまな処理の制御に活用されるので、使い方に慣れておくととても役立ちます。もし他にも気になる部分があれば、どんどん聞いてくださいね!