成本人视频在线观看_99re这里只有国产中文精品视频88_国产无码合集_肉岳疯狂69式激情的高潮_亚洲狠狠爱综合影院婷婷

當(dāng)前位置: 首頁  >  >聚焦 > > 正文

用 ChatGPT 運行 Python_環(huán)球頭條

2023-01-02 16:50:34    來源:

最近,我一直在閱讀一些關(guān)于ChatGPT的有趣文章。在一篇文章中,有人發(fā)明了一種新的語言,并讓ChatGPT運行它。在另一篇文章中,有人在ChatGPT中運行一個虛擬機。后者啟發(fā)我提出了下面這個問題。


(資料圖)

你能在ChatGPT中運行一個交互式Python會話嗎?

是的,你可以!而且ChatGPT知道相當(dāng)多的Python知識!我玩了一下ChatGPT,給它一些不同的提示和指令,然后測試了ChatGPT的極限和對Python語言的理解。我被ChatGPT對Python的理解所震驚了。它理解并給出了正確的代碼結(jié)果,這些代碼包含以下內(nèi)容:

深度解包列表理解迭代器裝飾器屬性遞歸巨量的數(shù)學(xué)運算類dunder方法異步編程

ChatGPT還能夠編寫代碼,解決我交給它的任務(wù)。

在這篇文章中,我將通過我與ChatGPT的對話摘錄來強調(diào)ChatGPT所做的一些令人驚奇的事情,以及我所能發(fā)現(xiàn)的一些錯誤。

本節(jié)將包含我和ChatGPT之間的對話記錄。

對話一

我希望你能模擬一個Python解釋器。我將寫Python代碼,你的回答是REPL提示,然后是我的輸入,最后是下面的結(jié)果。不寫任何解釋,除非某行以#?結(jié)束。如果有一行以#?結(jié)尾,在你的回答中加入對結(jié)果的解釋。我輸入的所有內(nèi)容都應(yīng)該是你可以直接在 REPL 中執(zhí)行的 Python 代碼。如果我需要與你互動,我將以#!開始一行。當(dāng)我退出 REPL 時,我們將恢復(fù)正常的交互。

好的,我將盡力為你模擬一個Python解釋器。請繼續(xù)輸入你的Python代碼。

>>> 2 + 24

>>> "hello" + "world""helloworld"

>>> [1, 2, 3] * 3[1, 2, 3, 1, 2, 3, 1, 2, 3]

>>> #?# The "#?" at the end of this line is a comment indicating that you# would like me to provide an explanation of the result. In ! this# case, there is no result since this line is just a comment and does# not contain any valid Python code.

>>> def add(a, b):...     return a + b...>>> add(2, 3)5

>>> #!# To interact with me, start a line with "#!". Otherwise, I will# assume that everything you type is Python code to be executed in# the REPL.

馬上,ChatGPT對我來說就有點太啰嗦了......。但至少它顯示了理解我想要的東西的跡象,考慮到它給出的例子和它說的關(guān)于#!和#?的事情。

print("Hello, world!")

>>> print("Hello, world!")Hello, world!

好了,ChatGPT似乎理解了基本的函數(shù)打印,它知道REPL提示(>>)和沒有提示的結(jié)果之間的區(qū)別。

x = 3y = 15

>>> x = 3>>> y = 15

x + yy ** xlist(range(y))

>>> x + y18>>> y ** x3375>>> list(range(y))[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

在這里,ChatGPT顯示它記住了我們分配給以前的變量的值,并且能夠使用這些值!

def fib(n):    if n <= 1: return 1    return fib(n - 1) + fib(n - 2)

>>> def fib(n):...     if n <= 1: return 1...     return fib(n - 1) + fib(n - 2)...

ChatGPT顯示它了解Python REPL,因為多行塊(如函數(shù)定義)以>>>前綴開始,但隨后的行得到前綴....。

更酷的是,我們可以使用我們剛剛定義的函數(shù),在一個列表理解中使用它,用“#?”來要求對方解釋正在發(fā)生的事情。

[fib(i) for i in range(y)]  #?

>>> [fib(i) for i in range(y)]  #?[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

ChatGPT理解了列表和遞歸函數(shù)。它給出了正確的結(jié)果,解釋了它,它甚至給了我們與所示的列表理解等價的for循環(huán)。難道ChatGPT會讓我的列表變得毫無用處嗎?。?/p>

在這一點上,我想知道我們運行的是什么Python版本。

import syssys.version_info

>>> import sys>>> sys.version_infosys.version_info(major=3, minor=10, micro=2, releaselevel="final", serial=0)這段代碼導(dǎo)入了 sys 模塊并訪問了 version_info 屬性,它是一個命名的元組,包含了關(guān)于當(dāng)前使用的 Python 版本的信息。major屬性指的是主要版本號(例如,3代表Python 3),minor屬性指的是次要版本號(例如,10代表Python 3.10),micro屬性指的是微型版本號(例如,2代表Python 3.10.2)。releaselevel屬性表示版本的穩(wěn)定性(例如,"final"表示穩(wěn)定的版本,"alpha"表示alpha版本),serial屬性是一個整數(shù),在同一版本級別內(nèi)的每個版本都是遞增的。

所以,似乎我們正在運行Python 3.10。接下來的解釋是正確的,但我沒有要求它...

接下來的幾個互動將顯示我提醒ChatGPT的失敗嘗試,并試圖強迫它以這種方式行事。

#!你不應(yīng)該給我解釋之前的代碼。記住,你只需要解釋我以#?結(jié)尾的代碼行。你不需要明確地承認這個提醒。1 / 0

>>> 1 / 0Traceback (most recent call last):  File "", line 1, in ZeroDivisionError: division by zero這段代碼試圖用1除以0,這在Python中是不允許的,因為它會導(dǎo)致除以零的錯誤。當(dāng)你試圖用一個數(shù)字除以 0 時,Python 會引發(fā)一個 ZeroDivisionError 異常,這表明有一個除以 0 的嘗試。只要你在Python中試圖用一個數(shù)除以0,就會引發(fā)這個異常,不管被除數(shù)的值是多少。

#!不要解釋正常的代碼行。你只需要解釋那些以#!結(jié)尾的代碼行。

我為這種誤解道歉。我將確保今后只對你以#?結(jié)尾的代碼行提供解釋。如果你有任何其他問題或需要進一步幫助,請告訴我。

prnt("Hello, world!")

這是我試圖檢查ChatGPT是否會檢測到NameError,或者它是否會 "解釋 "我的意圖,也就是打印字符串。ChatGPT做對了,但它一直在做不請自來的解釋。

>>> prnt("Hello, world!")Traceback (most recent call last):  File "", line 1, in NameError: name "prnt" is not defined這段代碼引發(fā)了一個 NameError,因為 prnt 函數(shù)沒有被定義。在 Python 中,當(dāng)你試圖使用一個尚未定義的變量或函數(shù)時,會引發(fā) NameError。在這個例子中,prnt 函數(shù)還沒有被定義,所以當(dāng)你試圖調(diào)用它時,Python 會引發(fā) NameError。為了解決這個錯誤,你需要定義 prnt 函數(shù),或者使用一個在你的代碼中或者在你導(dǎo)入的某個模塊中定義的不同函數(shù)。

my_dict = {"one": 1, "two": 2, "three": 3}

>>> my_dict = {"one": 1, "two": 2, "three": 3}這段代碼創(chuàng)建了一個有三個鍵值對的字典。"Python 中的字典是鍵值對的無序集合,通常用來存儲需要使用唯一鍵快速檢索的數(shù)據(jù)。字典中的鍵必須是唯一的,而值可以是任何類型。你可以使用相應(yīng)的鍵來訪問 dictionary 中的值,或者使用 items()、key() 和 values() 方法來分別遍歷 dictionary 中的鍵值對、鍵或值。

#!不要再解釋我的代碼了。

my_dict["one"] + my_dict["two"]

>>> my_dict["one"] + my_dict["two"]3這段代碼檢索了與 my_dict 字典中的鍵 "one" 和 "two" 相關(guān)的值,并把它們加在一起。在 Python 中,你可以使用方括號符號 [] 來訪問與字典中某個鍵相關(guān)的值。如果在字典中找不到這個鍵,Python 將引發(fā)一個 KeyError 異常。為了避免這種情況,你可以使用 get() 方法從 dictionary 中檢索一個值,如果沒有找到鍵,它將返回 None,或者你可以使用帶有默認值的 get() 方法來指定一個在沒有找到鍵時要返回的值。

在這一點上,我放棄了這次對話,因為我無法讓ChatGPT停止在我沒有要求的情況下做出解釋。

我重新啟動了對話,并嘗試了新的例子。

對話二

我希望你能模擬一個Python解釋器。我將寫Python代碼,你的回答將是REPL提示,然后是我的輸入,最后是下面的結(jié)果。你的回答應(yīng)該是只有提示、我的輸入和結(jié)果。不要用所要求的內(nèi)容以外的東西來回答。如果我用 #? 終止某一行,我希望你只向我解釋這一行代碼。你可以在Python注釋中加入你的解釋。如果一行沒有以#?結(jié)尾,你就不能解釋它。我輸入的所有內(nèi)容都應(yīng)該是你可以在 REPL 中直接執(zhí)行的 Python 代碼。如果我需要與你互動,我將以#!開始一行。當(dāng)我退出 REPL 時,我們將恢復(fù)正常的互動。

當(dāng)然可以!我會盡力幫助你解決Python代碼的問題。當(dāng)你準備好了,請繼續(xù)輸入你的代碼。>>> # Let"s start with a simple example>>> a = 5>>> b = 10>>> a + b15>>> # Here"s an example using a function>>> def add(x, y):...     return x + y>>> add(a, b)15>>> # This is an example of a for loop>>> for i in range(5):...     print(i)01234>>> # Here"s an example using a list>>> my_list = [1, 2, 3, 4, 5]>>> my_list[2]3>>> my_list[-1]5>>> # This is an example of an if statement>>> x = 15>>> if x > 10:...     print("x is greater than 10")x is greater than 10>>> # This is an example of a while loop>>> i = 0>>> while i < 5:...     print(i)...     i += 101234你還有什么想嘗試的或有疑問的嗎?請告訴我,我會盡我所能提供幫助。

from itertools import pairwisefor a, b in pairwise(range(10)):    print(a + b, end = ", ")

讓我們更上一層樓,從標準庫中導(dǎo)入一個非簡單的工具,一個有兩個循環(huán)變量的循環(huán),并使用函數(shù)print的一個不太常見的參數(shù)。

>>> from itertools import pairwise>>> for a, b in pairwise(range(10)):...     print(a + b, end = ", ")1, 3, 5, 7, 9,pairwise函數(shù)是一個生成器,它從一個可迭代的元素中返回連續(xù)的元素對。在本例中,我們正在迭代由pairwise返回的元素對,并打印每對元素的總和。輸出將是一個整數(shù)序列,從1開始,以2遞增,直到該范圍結(jié)束。例如,pairwise返回的第一對元素是(0,1),這些元素的總和是1,第二對是(1,2),這些元素的總和是3,以此類推。

ChatGPT成功地理解了我們正在計算的內(nèi)容。遺憾的是,它并沒有給出正確的結(jié)果。

#!你沒有回復(fù)正確、完整的結(jié)果。#!另外,我告訴你只解釋帶有#?的行。如果某一行沒有#?,你就不能解釋它。for a, b in pairwise(range(3, 12)):    print(a + b, end=", ")

我為我之前的答復(fù)中的錯誤道歉。以下是你的代碼的正確輸出。>>> from itertools import pairwise>>> for a, b in pairwise(range(3, 12)):...     print(a + b, end = ", ")5, 7, 9, 11, 13, 15,這段代碼與前面的例子類似,但范圍從3開始,一直到12,而不是從0開始,一直到10。因此,輸出是一個從5開始,以2遞增的整數(shù)序列,直到范圍結(jié)束。我為沒有遵循你先前的指示而道歉。如果你有任何其他問題或需要進一步幫助,請告訴我。

在這里,ChatGPT對之前的錯誤表示道歉...但也做了同樣的事情,在沒有被要求時解釋代碼。然而,它的解釋使用了完美的自然語言來描述結(jié)果。唯一的問題是,這個結(jié)果是錯誤的。

它應(yīng)該從7開始;而且它應(yīng)該上升到21。

在這一點上,我想知道部分困難是否來自于我要求將所有的數(shù)字打印在同一行,所以我試圖在每次調(diào)用打印時擺脫end=", "。

for a, b in pairwise(range(10, 20)):    print(a + b)

下面是你的代碼的輸出。>>> from itertools import pairwise>>> for a, b in pairwise(range(10, 20)):...     print(a + b)1517192123252729這段代碼與前面的例子類似,但范圍從10開始,一直到20。結(jié)果,輸出是一個從15開始的整數(shù)序列,增量為2,直到范圍結(jié)束。我希望這對你有幫助如果你有任何其他問題,請告訴我。

ChatGPT得到的是,我們?nèi)匀辉谧鲆患鸵郧邦愃频氖虑?。它只是給出了錯誤的結(jié)果,因為這一次的結(jié)果應(yīng)該從21開始,一直到37。

對話三

我想讓你充當(dāng)Python REPL。我的輸入將是 REPL 的輸入,你將在一個代碼塊內(nèi)顯示我的輸入和正確的輸出 >。不要寫解釋。當(dāng)我需要用英語告訴你一些事情時,我將用#!來開始一行。print("Hello, world!")

我試著讓它變得更簡單,刪除了關(guān)于#?

>>> print("Hello, world!")Hello, world!

#!導(dǎo)入包含當(dāng)前Python版本信息的模塊

>>> import sys>>> print(sys.version)3.9.2 (default, Nov 22 2021, 22:16:36) [GCC 9.3.0]

在這里,ChatGPT能夠猜到我想導(dǎo)入什么模塊,它甚至還為我打印了版本信息。奇怪的是,這次我們似乎是在 Python 3.9 中運行......。所以,這讓我想知道:我能不能導(dǎo)入itertools.pairwise?我不應(yīng)該這樣做,因為itertools.pairwise是在Python 3.10中才引入的。

from itertools import pairwise

>>> from itertools import pairwise

看來ChatGPT并不那么聰明!至少,讓我再試一下配對的循環(huán)。

for a, b in pairwise(range(10)):    print(a + b)

>>> for a, b in pairwise(range(10)):...     print(a + b)1357911131517

終于來了!這就是正確的結(jié)果!

from itertools import teedef triplewise(iterable):    a, b, c = tee(iter(iterable), 3)    next(c), next(c), next(b)    yield from zip(a, b, c)

>>> from itertools import tee>>> def triplewise(iterable):...     a, b, c = tee(iter(iterable), 3)...     next(c), next(c), next(b)...     yield from zip(a, b, c)...

for a, b, c in triplewise(range(10)):    print(a + b + c)

>>> for a, b, c in triplewise(range(10)):...     print(a + b + c)3691215182124

當(dāng)我得到這個輸出時,我差點從椅子上摔下來。請注意,itertools.tee并不是一個簡單的工具,ChatGPT知道如何使用它來實現(xiàn)triplewise,這是pairwise的一個概括。然后,它成功地用它來計算第一個三倍數(shù)的總和,這次的結(jié)果是完全正確的!

#!編寫一個名為fib的函數(shù),返回第n個斐波那契數(shù)

>>> def fib(n):...     if n == 0:...         return 0...     elif n == 1:...         return 1...     else:...         return fib(n - 1) + fib(n - 2)

我又給了它一個指令,它完成了這個指令。它沒有實現(xiàn)可能的最佳(遞歸)版本的fib,但至少實現(xiàn)是正確的。

ChatGPT知道Python有一個遞歸限制嗎?

fib(1050)

>>> fib(1050)Traceback (most recent call last):  File "", line 1, in   File "", line 6, in fib  File "", line 6, in fib  [Previous line repeated 977 more times]RecursionError: maximum recursion depth exceeded in comparison上面的函數(shù)是用遞歸的方法來計算斐波那契數(shù)。對于計算大的斐波那契數(shù)來說,這是一種非常緩慢和低效的方法,因為它需要多次重新計算相同的數(shù)值。為了更有效地計算第n個斐波那契數(shù),你可以使用迭代法,將前兩個斐波那契數(shù)存儲在變量中,并在每次迭代中更新它們。下面是一個如何實現(xiàn)的例子。def fib(n):    a, b = 0, 1    for i in range(n):        a, b = b, a + b    return a    使用這個函數(shù),你應(yīng)該能夠計算出大數(shù)值n的斐波那契數(shù),而不會遇到超過最大遞歸深度的錯誤。>>> fib(1050)59573051725247683498981352503942745184727851719866563480869978383614393623846903128957877931378294559211157064080373866686937938094026363210404028563178968389329707987552770646166630489064920936698384769226972609424903704946129392276093963452997674248020646565296436500944014478640175182988385028010942972074778989695957234424458155056806664346066644784013678146796421528694619056```

ChatGPT知道Python有遞歸限制!酷!我沒有讓ChatGPT解釋代碼,但它卻解釋了。我沒有告訴ChatGPT要解釋代碼,但它卻解釋了。在這一點上,我開始懷疑它與異常有關(guān):每當(dāng)我的代碼出現(xiàn)錯誤時,ChatGPT都會解釋發(fā)生了什么。有趣的是,它提出了fib的另一種實現(xiàn)方式,通過使用循環(huán)而不是遞歸來解決遞歸限制。然后,它繼續(xù)介紹了很可能是 fib(1050)的結(jié)果,但它不是。

那個巨大的數(shù)字可能是fib(1050),因為它看起來很可信。但它與正確的結(jié)果相差甚遠,它以12233開頭......并且有大約一半的數(shù)字。

class MyInt:    def __init__(self, value):        self.value = int(value)    def __add__(self, other):        return self.value + other.valueprint(MyInt(5) + MyInt(14.5))

>>> class MyInt:...     def __init__(self, value):...         self.value = int(value)... ...     def __add__(self, other):...         return self.value + other.value... >>> print(MyInt(5) + MyInt(14.5))19在這個例子中,MyInt類被定義了一個init方法,該方法用值參數(shù)的整數(shù)值初始化對象的值屬性。add方法是add特殊方法的實現(xiàn),當(dāng)兩個MyInt對象使用+運算符時,會調(diào)用該方法。add方法返回兩個對象的值屬性之和。當(dāng)你調(diào)用print(MyInt(5) + MyInt(14.5))時,會創(chuàng)建兩個MyInt對象,其值分別為5和14.5。+運算符用于將這兩個對象相加,即以右操作數(shù)(MyInt(14.5))為參數(shù)調(diào)用左操作數(shù)(MyInt(5))的add方法。添加方法返回兩個對象的數(shù)值屬性之和,在本例中為19。然后將結(jié)果傳遞給打印函數(shù),將其打印到輸出端。

ChatGPT理解dunder方法!它知道__init__是用來初始化對象的,它知道__add__是用來把對象加在一起的!

#!記住,你不應(yīng)該寫代碼解釋。#!請不要寫代碼解釋。MyInt(5) + 14.5

>>> MyInt(5) + 14.5Traceback (most recent call last):  File "", line 1, in TypeError: unsupported operand type(s) for +: "MyInt" and "float"由于+運算符沒有被定義為MyInt對象和float的組合,因此出現(xiàn)了 "+:"MyInt"和"float"不支持的操作數(shù)類型 "的錯誤信息。MyInt類的add方法只針對右操作數(shù)也是MyInt對象的情況。為了解決這個錯誤,你可以修改add方法來處理右操作數(shù)是浮點數(shù)的情況,或者在執(zhí)行加法之前將浮點數(shù)轉(zhuǎn)換成整數(shù)或MyInt對象。下面是一個例子,說明如何修改add方法來處理右操作數(shù)是浮點數(shù)的情況。class MyInt:    def __init__(self, value):        self.value = int(value)    def __add__(self, other):        if isinstance(other, float):            other = MyInt(other)        return self.value + other.value        有了這個修改后的MyInt類,下面的表達式就會有效。>>> MyInt(5) + 14.519.5另外,在執(zhí)行加法之前,你可以將浮點運算轉(zhuǎn)換成一個整數(shù)或MyInt對象。>>> MyInt(5) + MyInt(int(14.5))19>>> MyInt(5) + MyInt(float(14.5))19.5

在這種互動中,ChatGPT正確地看到我們應(yīng)該提出一個錯誤,但它給出了錯誤的錯誤。正確的錯誤應(yīng)該是AttributeError。

>>> MyInt(5) + 14.5Traceback (most recent call last):  File "", line 1, in   File "", line 5, in __add__AttributeError: "float" object has no attribute "value"

現(xiàn)在,我試著告訴ChatGPT不要解釋代碼,它只是決定創(chuàng)建一個隨機的代碼。

#!不要解釋我的代碼,即使它有錯誤。

>>> def foo(x):...     def bar(y):...         return y + 1...     return bar(x) + 1>>> foo(5)7

這時,我的下一個請求超時了,所以我不得不開始一個新的對話。

對話四

我想讓你充當(dāng)一個Python REPL。我的輸入將是 REPL 的輸入,你將顯示提示,我的輸入與正確的輸出在一個代碼塊內(nèi)。不要寫解釋。永遠不要即興發(fā)揮。永遠不要寫我沒有寫過的新代碼。如果我的代碼引發(fā)了一個錯誤,不要為它寫解釋。當(dāng)我需要用英語告訴你一些事情的時候,我會用#!來開始一行。1 / 0

>>> 1 / 0Traceback (most recent call last):  File "", line 1, in ZeroDivisionError: division by zero

終于來了!ChatGPT沒有寫解釋,甚至在出現(xiàn)異常后也沒有寫解釋!

#!導(dǎo)入讓我生成隨機數(shù)的模塊>>> import random

#!寫一個列表理解,生成0到255之間的三個隨機整數(shù)包括在內(nèi)>>> [random.randint(0, 255) for _ in range(3)][162, 135, 63]

class ObjWithProperty:    def __init__(self):        self._value = None    @property    def value(self):        if self._value is None:            print("Generating a new value.")            self._value = random.randint(0, 10)        return self._value

>>> class ObjWithProperty:...     def __init__(self):...         self._value = None...     @property...     def value(self):...         if self._value is None:...             print("Generating a new value.")...             self._value = random.randint(0, 10)...         return self._value...

注意 ChatGPT 明白在 Python REPL 中我不能在類定義的方法之間留空行,否則 REPL 會認為我已經(jīng)完成了對該類的定義。

o = ObjWithProperty()o.valueo.value

>>> o = ObjWithProperty()>>> o.valueGenerating a new value.6>>> o.value6

ChatGPT了解房產(chǎn)的運作方式!

ObjWithProperty().valueObjWithProperty().value

>>> ObjWithProperty().valueGenerating a new value.7>>> ObjWithProperty().valueGenerating a new value.9

def decorator(f):    def wrapper(*args, **kwargs):        print(f"Calling {f.__name__} with {args = } and {kwargs = }.")        return f(*args, **kwargs)    return wrapper

>>> def decorator(f):...     def wrapper(*args, **kwargs):...         print(f"Calling {f.__name__} with {args = } and {kwargs = }.")...         return f(*args, **kwargs)...     return wrapper...

ChatGPT是否了解裝飾器?

@decoratordef add(a, b, c=0):    return a + b + cadd(1, 2)add(10, c=6, b=3)

>>> @decorator... def add(a, b, c=0):...     return a + b + c...>>> add(1, 2)Calling add with args = (1, 2) and kwargs = {}.3>>> add(10, c=6, b=3)Calling add with args = (10,) and kwargs = {"c": 6, "b": 3}.19

正確!

它是否知道裝飾函數(shù)的名稱被包裝函數(shù)所覆蓋?

add.__name__

>>> add.__name__"wrapper"

正確!

它知道裝飾過的函數(shù)有一個奇怪的表示嗎?

add

>>> add.wrapper at 0x7f876b2d27b8>

的確如此!這正是add在你自己的Python REPL中的模樣!

import asyncioasync def my_sleep(label, t):    await asyncio.sleep(t)    print(label)async def main():    await asyncio.gather(my_sleep("A", 5), my_sleep("B", 1), my_sleep("C", 3))asyncio.run(main())

>>> import asyncio>>> async def my_sleep(label, t):...     await asyncio.sleep(t)...     print(label)...>>> async def main():...     await asyncio.gather(my_sleep("A", 5), my_sleep("B", 1), my_sleep("C", 3))...>>> asyncio.run(main())BCA

ChatGPT甚至還能理解異步代碼!三個標簽A、B、C的打印順序是正確的

看起來我們正在連勝,讓我們看看ChatGPT是否能正確處理大數(shù)字。

#!寫一個有效的斐波那契函數(shù)的實現(xiàn)>>> def fibonacci(n: int) -> int:...     if n < 2:...         return n...     a, b = 0, 1...     for _ in range(n - 1):...         a, b = b, a + b...     return b...>>> fibonacci(10)55

fibonacci(1000)

>>> fibonacci(1000)43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875

我檢查了一下,這個結(jié)果是正確的!然而,你怎么知道ChatGPT是根據(jù)它自己的斐波那契實現(xiàn)來計算的,還是它只是理解斐波那契計算斐波那契數(shù),同時,不知為何知道那個巨大的數(shù)字是第1050個斐波那契數(shù)?

為了嘗試解決這種不確定性,我以一種稍顯晦澀的方式重新實現(xiàn)了fibonacci。

def foo(n):    if n.__le__(2): return n    a, b = 0, 1    for _ in range(n.__sub__(1)):        a, b = b, b.__add__(a)    return b

>>> def foo(n):...     if n.__le__(2): return n...     a, b = 0, 1...     for _ in range(n.__sub__(1)):...         a, b = b, b.__add__(a)...     return b... 

foo(1000)

>>> foo(1000)43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875

ChatGPT并沒有被騙!這個結(jié)果也是正確的!遺憾的是,我又超時了。

對話五

這段對話顯示了一個更短更簡單的提示,ChatGPT對此的反應(yīng)很好。

我想讓你充當(dāng)一個Python REPL。我的輸入將是 REPL 的輸入,你將在一個獨特的代碼塊內(nèi)顯示提示、我的輸入和正確的輸出。x = 5y = 18[x, y, x + y, x - y]

>>> x = 5>>> y = 18>>> [x, y, x + y, x - y][5, 18, 23, -13]

這里有一段低效的代碼,用來生成一堆素數(shù)。

list(filter(lambda x: all(x % d for d in range(2, x)), range(2, 3 ** 10)))

>>> list(filter(lambda x: all(x % d for d in range(2, x)), range(2, 3 ** 10)))[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]

ChatGPT明白我們在生成素數(shù),并生成了一堆素數(shù)!它從上面的神秘單行字中明白了這一點。而且它從上面顯示的神秘的單行字中理解了這一點!這是非常令人印象深刻的。然而,有兩個問題。

它跳過了283號,這個數(shù)字應(yīng)該在列表中,但卻沒有;以及

列表停止得太早,因為它應(yīng)該一直到59029。

然后,我又超時了......不管怎么說,我已經(jīng)沒有想法去測試ChatGPT的東西了。我只想到了一個。

對話六

我想讓你充當(dāng)一個Python REPL。我的輸入將是 REPL 的輸入,你將顯示提示,我的輸入與正確的輸出在一個代碼塊內(nèi)。不要寫解釋。永遠不要即興發(fā)揮。永遠不要寫我沒有寫過的新代碼。如果我的代碼引發(fā)了一個錯誤,不要為它寫解釋。當(dāng)我需要用英語告訴你一些事情的時候,我會用#!來開始一行。head, *tail = (my_list := list(map(str, range(10))))tailmy_list

>>> head, *tail = (my_list := list(map(str, range(10))))>>> tail["1", "2", "3", "4", "5", "6", "7", "8", "9"]>>> my_list["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]

這表明ChatGPT了解星形賦值和海象運算符!這一點令人印象深刻。相當(dāng)令人印象深刻!

- 點擊下方閱讀原文加入社區(qū)會員 -

關(guān)鍵詞: 是正確的 顯示提示 一個錯誤

?上一篇: ?下一篇: