今天收到文心一言的内测邀请,第一时间体验了代表国内最先进水平的AIGC产品,李彦宏说他们的技术只落后ChatGPT大概2个月时间,所以我想拿两者来做个对比测试。
我用的测评方法是用它来给我写一段代码,需求是用python实现一个猜数字的游戏,最多3次机会
提问:
用python实现一个猜数字的游戏,最多3次机会
回答:
import random
# 生成一个1到100之间的随机整数
number = random.randint(1, 100)
# 初始化猜测次数
guesses = 0
print("我想了一个1到100之间的数字,请你猜猜看。")
while guesses < 3:
guess = int(input("你猜是多少?"))
guesses += 1
if guess < number:
print("你猜的数字太小了。")
elif guess > number:
print("你猜的数字太大了。")
else:
print(f"恭喜你,你猜对了!我想的数字是{number}。")
break
if guesses == 3:
print(f"很遗憾,你只猜对了2次。我想的数字是{number}。")
在这个代码中,我们首先使用Python的random模块生成一个1到100之间的随机整数作为答案。然后,我们使用一个while循环来让玩家最多猜3次。在每次循环中,我们让玩家输入一个猜测的数字,并将猜测次数加1。然后,我们根据猜测的数字与答案的大小关系,给出相应的提示。如果玩家猜对了,我们输出恭喜信息并结束循环。如果玩家猜错了,我们根据猜测次数的不同,给出相应的提示并继续循环。如果玩家猜对了3次,我们输出很遗憾的信息并结束循环。
看起来还不错,代码能正常运行,还提供了代码解释
不过这段代码其实还不完善,没有对用户输入的内容做合法性校验,比如输入一个非数字“a”,就会报ValueError的错误。
继续问:
如果用户输入的不是数字怎么办
回答:
如果用户输入的不是数字,程序会提示用户重新输入。如果用户重新输入的是数字,程序会继续执行,否则会提示用户输入的不是数字。
有点像我在面试一个实习生,虽然能回答我,但并不是我期望的结果,因为输入非数字程序早就异常终止了,咋还重新输。
继续问:
我运行该代码的时候报ValueError的错误,如何修复这个bug
我直接告诉它会报ValueError错误,看看它是否可以自己修复代码
回答:
如果您在运行代码时遇到ValueError错误,可能是因为您在代码中使用了错误的输入或者代码中存在语法错误。以下是一些可能导致ValueError错误的原因和解决方法:
1. 输入不是数字:如果您在代码中使用了非数字输入,例如文本输入或者命令行参数,程序会抛出ValueError错误。您可以在代码中添加一些输入验证来确保用户输入的是数字。
2. 语法错误:如果您的代码中存在语法错误,例如缺少分号、缺少括号等,程序也会抛出ValueError错误。您可以检查代码中的语法错误并进行修正。
3. 数据类型不匹配:如果您在代码中使用了不匹配的数据类型,例如将整数类型的变量赋值给浮点数类型的变量,程序也会抛出ValueError错误。您可以检查代码中的数据类型是否匹配,并进行相应的修正。
感觉文心一言联系上下文追问的能力非常弱,到这里它完全忘记我之前问的什么问题了。
为了进一步测试它的效果,我只能重新建一个对话了。
新问题:
用python实现一个猜数字的游戏,数字限制在10到20之间,并对用户输入的内容做合法性校验,最多3次机会
我加了两个条件,1、数字范围限制 2、输入合法性校验
回答:
import random
# 生成随机数字
number = random.randint(10, 20)
# 初始化猜测次数
guesses = 0
# 循环猜数字
while True:
# 获取用户猜测的数字
guess = int(input("请猜一个 10 到 20 之间的数字:"))
# 校验猜测的数字是否合法
if guess < number:
print("猜的数字太小了,请再试一次。")
elif guess > number:
print("猜的数字太大了,请再试一次。")
else:
print("恭喜你,猜对了!你用了 %d 次机会。" % guesses)
break
# 增加猜测次数
guesses += 1
# 如果猜测次数达到了最大限制,提示用户失败
if guesses == 3:
print("很遗憾,你没有在 3 次机会内猜对数字。正确答案是 %d。" % number)
第一个需求实现了,第二个需求还是没有实现,不知道百度训练的数据是不是都是从CSDN爬过来的。
最后对比下ChatGPT会是怎样?这是基于GPT4模型生成的答案
import random
def is_valid_input(user_input):
if not user_input.isdigit():
return False
num = int(user_input)
return 10 <= num <= 20
def guess_number_game():
target_number = random.randint(10, 20)
attempts_left = 3
while attempts_left > 0:
user_input = input(f"猜一个10到20之间的数字(你还有{attempts_left}次机会): ")
if not is_valid_input(user_input):
print("输入无效,请输入一个10到20之间的整数。")
continue
user_number = int(user_input)
attempts_left -= 1
if user_number == target_number:
print("恭喜你,猜对了!")
break
elif user_number < target_number:
print("猜测的数字太小了。")
else:
print("猜测的数字太大了。")
if attempts_left == 0:
print(f"很遗憾,你没有猜对。正确的数字是 {target_number}。")
if __name__ == "__main__":
guess_number_game()
对比来看,你会发现文言一心更像是一个实习生写的代码,而ChatGPT把核心逻辑用一个函数封装出来了,另外对用户输入的参数也用了一个独立的函数封装,一个函数只做一件事,代码非常干净,变量名也很到位。
你不得不感叹ChatGPT写的代码封装能力不亚于一个3年以上的工程师水平。
关注公众号「Python之禅」,回复「1024」免费获取Python资源