ChatGPTにプログラミングをやってもらう方法と、Pythonを勉強する方法
ChatGPTを使えば簡単にプログラムを作れるようになるだけでなく、自分がプログラミングを学ぶのにも使えます。
プログラマーやエンジニアではなくても、ちょっとはプログラミングの知識を持っておきたい、業務の自動化に使えそうだから勉強したいと思っている人は少なくないはず。
では、実際にどうやったらChatGPTでプログラミングを学んだり、プログラムを作ったりできるのでしょうか。
今回は発売前に増刷の決まった新刊『ChatGPTと学ぶPython入門 「Python×AI」で誰でも最速でプログラミングを習得できる!』(翔泳社)から、ChatGPTを使ってプログラムを作る方法と、Pythonのプログラミングを学ぶ方法を紹介します。
Pythonには便利な機能が揃っており、Webアプリ制作やデータ分析などさまざまな用途で使えるだけでなく、人気の言語のため日本語での情報も豊富です(エラーで困ったときにありがたい!)。そのため、初心者が最初に覚える言語としておすすめです。
なお、本書およびこの記事ではPythonの実行環境としてGoogle Colabを利用します。Google Colabでノートブックを新規作成し、準備をお願いします。
カウントダウンタイマーを作る
何度も繰り返すプログラム
まずはPythonで「何度も同じことを繰り返す」プログラムを作ってみましょう。
具体的には、指定した時間が終わるまで、処理を続けるカウントダウンタイマーのプログラムを作ります。このタイマーは、時間が経つごとにメッセージを出し続け、指定した時間が来たら最後のメッセージを出して終わります。
この演習の目的は、Pythonで「何度も同じことを繰り返す」ためのforやwhileというツールを試すことです。これらのツールは、「何度も同じことを繰り返す」プログラムを作る時にとても重要な役割を果たします。
ChatGPTにプロンプトを入力
ChatGPTに下記プロンプトを入力してみましょう。
◆返答例
import time
def countdown_timer(seconds):
while seconds > 0:
print(seconds)
time.sleep(1)
seconds -= 1
print("Time's up!")
# カウントダウンする秒数を入力します
seconds = int(input("カウントダウンする秒数を入力してください: "))
countdown_timer(seconds)
プログラムの中に「# カウントダウンする秒数を入力します」という文字列がありますが、これを「コメント」と言います。プログラムの処理に影響するものではなく、プログラムの補足や説明をするメモだと思ってください。
パスワード生成をしてみる
モジュールを使う
Pythonの標準ライブラリに含まれる「モジュール」を使ってみましょう。モジュールは、Pythonの機能を拡張するためのツールで、特定のタスクを簡単にこなすことができます。
Pythonにはたくさんのモジュールがあり、それぞれに特別な機能があります。今回はrandomモジュールを使って、ばらばらの文字を組み合わせて強力なパスワードを作成するプログラムを作ります。
この演習の目的は、randomモジュールを使って、ランダムな数字や文字を作る方法を試すことです。具体的には、大文字と小文字のアルファベット、数字、記号をランダムに組み合わせて文字列を作ります。それを新しいパスワードとして使うことで、強力で予想しにくいパスワードを作ることができます。
ランダムな値は、テストデータの生成、シミュレーション、ゲーム、セキュリティ関連のタスクなど、様々な場面で利用されます。しかし、Pythonのrandomモジュールが作るランダムな数や文字は、ある種のルールに基づいています。
そのため、予想しにくいランダムな数や文字が必要な場合、例えば物理シミュレーションや高度なセキュリティが必要な場面では、他の方法を使うことがあります。「ランダムな数や文字を作る方法」についてもっと詳しく知りたい方は、ぜひChatGPTに聞いてみてください。
ChatGPTにプロンプトを入力
ChatGPTに下記プロンプトを入力してみましょう。
◆返答例
import random
import string
def generate_password(length):
letters = string.ascii_letters + string.digits + string.punctuation
password = ''.join(random.choice(letters) for i in range(length))
return password
length = int(input("パスワードの長さを入力してください: "))
password = generate_password(length)
print("生成されたパスワードは {0} です。".format(password))
パスワードは、オンライン上で機密情報を保護する最も基本的な手段の1つですが、その「強度」がしばしば問題となります。短いパスワードや一般的な単語を使用すると、攻撃者による総当たり攻撃(Brute-force attack)や辞書攻撃(Dictionary attack)に簡単に破られる可能性が高くなります。
強度の高いパスワードとは、長さ、複雑性、予測不可能性が備わっているものを指します。具体的には、16文字以上かつ、大文字、小文字、数字、記号を組み合わせ、かつ一般的な単語やフレーズを避けたものなどがあります。このようなパスワードは、一見面倒に思えるかもしれませんが、その効果は非常に大きいと言われています。
また、強度の高いパスワードを設定したからといって、それを複数のサービスで使いまわすのは避けるべきです。1つのサービスでパスワードが漏洩した場合、使いまわしていた他のサービスも同時に危険に晒されます。
さらに、セキュリティ強化を目的に、定期的にパスワードの変更が推奨されるサービスもありますが、定期的にパスワードを変更する前に、強度の高いパスワードを適切に使うことを忘れないでください。
強度が高いパスワードの管理には、信頼性のあるパスワードマネージャーを使用することも1つの方法です。これにより、強度の高いパスワードを効率的に管理し、それぞれのサービスで異なるパスワードを使用することが容易になります。
人工知能(AI)技術も、パスワードの強度を評価したり、ユーザにより安全な選択を促したりする場面で役立っています。しかし、AIは攻撃者にも利用されており、より高度な攻撃手法で弱いパスワードを見つけ出す能力も持っています。このような背景から、強いパスワードの設定は、現代のセキュリティ環境では不可欠なものと言えるでしょう。
Pythonの基礎:変数
それでは、次にPythonのプログラミングを勉強する方法を解説します。最初は最も重要な基礎である「変数」からです。
ChatGPTに質問してみよう
変数とはプログラミングにおいて、何度も使う情報を入れておく、名前付きの箱のようなもののことを言います。
箱の中には何でも入れること(代入)ができ、必要な時に確認(参照・取得)できます。
この箱、つまり変数の中身はいつでも変更できます。ですから、中身が変わる可能性がある「変数」と呼ばれるわけです。
例えば、ある数字をプログラム内で何度も使用するとします。その度に数字を直接書くのではなく、その数字を変数に代入しておけば、その後はその変数名を使ってその数字を利用することができます。
変数の基本
Pythonの変数名はアルファベットの文字(大文字・小文字どちらも可)、数字、アンダースコア(_)を使用できますが、数字から始まる変数名は作ることはできません。
また、Pythonの予約語(特別な意味を持つ単語、例えばfor、while、ifなど)は変数名として使用できません。
Pythonでは変数へ値を代入するには等号(=)を使用します。これを「代入演算子」と言います。例えば以下のように使用します。
a = 5
print(a) # 5
print("a") # a 変数aではなく文字aを表示
これは、変数aに値5を代入する、という意味になります。この操作を行うことで、変数aは値5を「覚えておく」ことができます。
その後、aという名前が出てきたら、それは「5」を意味します。
また、aではなく"a"と書くと文字列型の「a」として扱われるので注意が必要です。
変数は数値だけでなく、文字列やリストといった値も持つことができます。例えば以下のような代入も可能です。
name = "田中"
food_list = ["寿司", "すき焼き", "天ぷら"]
この場合、変数nameは文字列"田中"を、food_listはリスト["寿司","すき焼き","天ぷら"]をそれぞれ記憶しています。
変数の利点
プログラミングにおける変数の利点は、何度も同じ操作を行う際や、多くのデータを一括で処理する際に、そのデータを変数として扱うことで、手間を省いたり、プログラムを整理したりできます。
また、変数を使うことで、プログラムの動作を柔軟に変更することも容易になります。
例えば、ある計算式の中に直接数値を入力すると、その数値が変われば、その都度、全ての計算式を直接修正する必要があります。
しかし、数値を変数として設定しておけば、その変数の値を変更するだけで、全ての計算結果を一度に変えることができます。
以上が、Pythonにおける変数の基礎ですが、一言で言うと、「変数はプログラミングにおけるメモ帳のようなもの」と考えても良いでしょう。
何かを一時的に保存したり、何度も使用する値を覚えておいたりするために使います。
プログラミングを学ぶ上では、この変数という概念をしっかりと理解することが非常に重要です。
まずは、変数をどのように使うか、そして変数がどのように動作するのかを理解し、実際に変数を使ってみましょう。
注意点
リストや辞書などの可変オブジェクト(Mutable objects)と呼ばれるデータ型を利用する際に、変数の代入の仕組みを正しく理解していないと意図しない不具合が発生する可能性があります。
文字列型、整数型などの不変オブジェクト(Immutable)はこの挙動が異なるため、混乱しやすい箇所になりますので、簡単に説明します。
変数に値を代入する時、オブジェクトの可変性・不変性に関わらず、値をコピーするのではなく、メモリ上のオブジェクトを指す"参照"を共有することを意味します。
つまり変数はメモリ上のデータが格納されている"場所情報"が記録されます。
可変オブジェクトが代入されている変数の一部を変更すると、同じ可変オブジェクトが代入されている他の変数も同様に変更されてしまいます。このような場合は、copyモジュールの利用を検討してください。
一方、不変オブジェクトに対して変更を試みる場合、実際にはそのオブジェクト自体は変更されません。
代わりに新しいオブジェクトが生成されるので、変数に新しいオブジェクトを代入することになります。
そのため、元のオブジェクトやそれを参照している他の変数は影響を受けません。
下記がこの挙動を簡単に表現したサンプルコードです。
# リストaを定義
a = [1, 2, 3]
# aの参照をbにコピー
b = a
print("初期状態")
print("a:", a) # [1, 2, 3]
print("b:", b) # [1, 2, 3]
# bの最初の要素を変更
b[0] = 10
print("\n")
print("bの最初の要素を変更後")
print("a:", a) # [10, 2, 3] <- aも変わってしまう
print("b:", b) # [10, 2, 3]
# bに新しいリストを代入
b = [4, 5, 6]
print("\n")
print("bに新しいリストを代入後")
print("a:", a) # [10, 2, 3] <- aは変わらない
print("b:", b) # [4, 5, 6]
変数と反対に、中身が変わらないものは「定数」と呼ばれますが、Pythonでは言語仕様としての「定数」は定義されていません。
中身が変更できない「定数」を使いたい時は、変更しないように変数名を変えておくか、定数利用をサポートするライブラリ(Python3.8以降の標準ライブラリ「typingモジュール」のfinal修飾子など)を用いることで、値を変更できない「定数」の機能を実現します。
定数として変数を利用する時は、変数名にアルファベットの大文字のみ、もしくはアンダースコア(_)のみ使用します。
また、変数同様Pythonの予約語(特別な意味を持つ単語、例えばfor、while、ifなど)は変数名として使用できません。ただし、モジュールやメソッドの名前は変数名として上書きできてしまうため、十分注意が必要です。
先述の通り、変数には数字だけではなく文字やリストも代入できます。それなのに、変「数」と呼ばれるのは、数学の変数という概念が由来であるためです。
Pythonの基礎:条件分岐
ChatGPTに質問してみよう
ChatGPTに下記プロンプトを入力してみましょう。
「条件分岐」とは、道路の分岐点のようなものです。どちらの道を進むかは、その時の条件によります。
例えば、「もし雨が降っていたら傘を持って出かける。そうでなければ、傘は持たない」という判断をするように、プログラミングでも同じように、ある条件が満たされている時だけ特定の操作を行うように指示することができます。
Pythonでは、「if」、「elif」、「else」というキーワードを使って条件分岐を作ります。
それぞれ、「もしも」、「それ以外で、もしも」、「それ以外なら」を意味しています。
if文の基本的な構文
まずは、if文の基本的な構文を見てみましょう。
if 条件式1:
処理1
elif 条件式2:
処理2
else:
処理3
この構文では、まず「条件式1」をチェックします。
もし「条件式1」が真(True、条件を満たしている状態)であれば、「処理1」が実行されます。
もし「条件式1」が偽(False、条件を満たしていない状態)であれば、「条件式2」をチェックします。
もし「条件式2」が真であれば、「処理2」が実行されます。そして、どの条件式も偽であれば、「処理3」が実行されます。
elif(else if の略)やelseは省略することが可能です。
その場合、条件式が真(True、条件を満たしている状態)の場合にだけ実行する処理を書くことができます。
具体的な例を見てみましょう。
以下のプログラムでは、変数scoreの値によって、成績を評価しています。
score = 75
if score >= 90:
print("優秀です!")
elif score >= 70:
print("良い成績です!")
elif score >= 50:
print("合格です")
else:
print("残念、不合格です")
このプログラムでは、scoreが90以上の場合「優秀です!」、70以上の場合「良い成績です!」、50以上の場合「合格です」、それ以外の場合「残念、不合格です」と出力されます。
条件分岐は、何かを入力した時や計算の結果によって、何をするかを決める時にとても便利です。
例えば、所持金によって購入できる商品が変わる時や、点数によって評価を決める時など、様々な場面で使うことができます。
ネストされた条件分岐
そして、ifの中にさらにifを入れることもできます。これを「ネスト」と言います。
次の例では、好きな食事のタイプ(meal_type)とアレルギーの有無(allergy)によって、どの料理を提供するかを決めています。
meal_type = "和食"
allergy = "なし"
if meal_type == "和食":
if allergy == "あり":
print("あなたにはアレルギー対応の美味しい寿司をご提供します!")
elif allergy == "なし":
print("あなたには様々な種類の天ぷらをご提供します!")
else:
if allergy == "あり":
print("あなたにはアレルギー対応のベジタリアンピザをご提供します!")
elif allergy == "なし":
print("あなたには特製ビーフステーキをご提供します!")
このプログラムでは、まず好きな食事のタイプ(meal_type)が和食かそれ以外かで条件分岐を行い、次にアレルギーの有無(allergy)があるかないかでさらに条件分岐を行っています。
これらの情報に基づいて、提供する料理が決まります。
このように、条件分岐を組み合わせることで、様々な状況に対応した料理を提供することができます。
プログラミングをしているとネストの中でさらにネストをしたいこともあるでしょう。
そうしてネストを繰り返される状況を「ネストが深い」と表現します。
ネストの中にさらにネストを作ることで複雑な条件を実現することができるようになりますが、プログラムが読みにくくなることもあるので、適度な深さと簡潔さを保つことが大切です。
def choose_menu(budget, alcohol, cuisine_type):
if budget >= 1000:
if alcohol == "あり":
if cuisine_type == "和食":
return "刺身と日本酒"
elif cuisine_type == "洋食":
return "ステーキとワイン"
else:
if cuisine_type == "和食":
return "天ぷらセット"
elif cuisine_type == "洋食":
return "ハンバーガーセット"
else:
return "カップラーメン"
result = choose_menu(1200, "あり", "和食")
print(result)
Pythonの条件分岐では、ifやelif の後ろの条件式が真(True)であるかどうかを判断します。
しかし、Pythonでは数値の0、空の文字列、空のリスト、None なども偽(False)として扱われます。
例えば、以下のプログラムでは、変数xが0でなければNon-zeroを、0であればZeroを表示します。
x = 0
if x:
print("Non-zero")
else:
print("Zero")
この記事が気に入ったらサポートをしてみませんか?