最近プログラム言語のPythonを久々に触っているのですが、ChatGPT先生はかなり使える家庭教師です。

一般的によくあるような疑問はうまいこと教えてくれて、サンプルコードまで示してくれます。

 

■質問してみた例

以下、ちょっとした正規表現での文字列置換について聞いたところ。

 

pythonの文字列しょりで、文字列が "数字+)" ではじまる場合はその部分を削除って、どう書けばいいですか? 例:  11) ABC → ABC

ChatGPT4

Pythonの標準ライブラリである正規表現を使って、この問題を解決することができます。次のスニペットを参考にしてください:

 

import re

def remove_prefix(text):
    return re.sub('^\d+\)', '', text).strip()

text = '11) ABC'
print(remove_prefix(text))  # 出力: ABC

 

条件をちょっと変えたい質問も、コンテキスト(前に聞いた質問を引き継いでる)質問として認識し、うまいこと教えてくれました。

 

条件を、"数字+)" の他に "数字." も含めたい場合は? 例:  11.ABC → ABC

ChatGPT4

その場合は正規表現を少し修正して、"数字.)" または "数字." を捉えるようにします。以下にそのように修正したコードを示します。

 

import re

def remove_prefix(text):
    return re.sub('^\d+[\.\)]', '', text).strip()

text1 = '11) ABC'
text2 = '11. ABC'
print(remove_prefix(text1))  # 出力: ABC
print(remove_prefix(text2))  # 出力: ABC

text1 = '11) ABC'
text2 = '11. ABC'
print(remove_prefix(text1))  # 出力: ABC
print(remove_prefix(text2))  # 出力: ABC

 

単に大量の文章を学習しただけでこんな受け答えができるというのが未だ私には理解できません。知能があるように思えてしまう。

ただ、以下のようにいつものシラっとウソを言う場合もありました。

 

■何かウソっぽい回答

何個か聞いた中でたまにウソっぽい回答もありました。Pythonについて

 

pythonで関数の戻り値型を自分のクラス型にしたいのですが以下はエラーにります。どう直せばいいですか?→ class MyClass(): pass @staticmethod def getInstance() -> MyClass: mc = MyClass() return mc

ChatGPT4

Pythonの型マーキングにおける前方参照を使用することでこの問題を解決することができます。これは、Pythonの型チェッカーが型ヒントを評価するとき、すべてのクラスと関数の名前がまだ利用可能ではない可能性があるためです。具体的には、クラスが完全に定義される前にクラス内部で自身を参照する場合には、前方参照を使う必要があります。

 

...略(正しいコード例とその解説)

 

上記のコードはPython 3.7以降で次のように書くこともできます。

 

class MyClass:
    @staticmethod
    def getInstance() -> MyClass:
        mc = MyClass()
        return mc

python 3.10ですが最後のコードは NameError: name 'MyClass' is not defined というエラーになります

ChatGPT4

すみません、私の説明が間違っていました。クラス本体の中でそのクラス自体を参照するためには、依然として前方参照('MyClass'のような文字列)を使用する必要があります。以下が修正版のコードです。

 

class MyClass:
    @staticmethod
    def getInstance() -> 'MyClass':
        mc = MyClass()
        return mc

 

from __future__ import annotationsがPython 3.7以降ではデフォルトで有効になっていると誤って述べました。...略

 

ということでChatGPT4先生、100%信頼はできませんが、

シラっとウソを言うフィリピン人みたいな感じで付き合うとよいのではないでしょうか。

(例えば隣町に行くバス停を教えてください、って聞いて、知らないのに適当に回答する人がそれないの割合存在する→論理的に間違いを教えたらその人が困る、と考えるよりもあなたの期待に答えたいという親切心?が勝る感じ)