ChatGPT运用事例之写代码
可以关于许多开发者而言又惊又喜的是咱们可以运用ChatGPT 去帮咱们完结一些代码,或许是测验用例的编写,可是正如咱们说到的又惊又喜
,或许开心的是可以解放一部分劳动力,将自己的精力从繁琐无聊的一些任务中脱离出来,可是忧虑的又是假如ChatGPT真的能做到写代码,那咱们开发的小伙伴又何去何从呢,引用之前在[数仓建模] 专栏里的一句话
年代的变迁,存亡的轮回,历史长河滔滔,没有什么是永久的,只有变化才是不变的,技术亦是如此,当你选择互联网的那一刻,你就相当于乘坐了一个滚滚向前的年代列车,开往不知道的方向,不论什么样的技术架构只有放在当时的年代背景下,才是有意义的,人生亦是如此。
已然革新或许变革是必然的,咱们还不如早点拥抱!
事例一 SQL
SQL 是咱们日常工作中,触摸最频繁的编程言语了,不论你是数据开发、后端开发都需求了解SQL,下面咱们就看一下ChatGPT 能不呢帮咱们写一些简单的SQL呢,以及质量怎么样
简单SQL
下面是我给它的prompt ,也便是提示信息
我有一张表customers, 有这些列CustomerId, FirstName, LastName, Company, Address, City, State, Country, PostalCode, Phone, Fax, Email, SupportRepId
帮我写一句SQL 查询State是Texas,FirstName 是Jane 的记录
下面是它给我的回来,几乎完美,由于还提示了我假如只需求特定列,就可以写列名字进去,而不是运用*
复杂SQL
上面的比如比较简单,下面咱们看一个逻辑复杂一些的SQL,其实你可以自己写一下看自己能不能写出来,需求用多就
我有一张数据表,叫做 user_events,有两个字段分别叫做 user_id 以及 event_date
请帮我写一句SQL,核算每天的新用户数。新用户的定义是,初次在表内呈现,或许接连90天没有在表内呈现之后再一次呈现。
这是它给我的回来,并且还给了一些解说
下面是它针对它给出的代码的解说,其实很明显这个代码是有问题的逻辑不对,可是应该是可以运转的,至于哪里有问题你可以思考一下
这个查询句子运用了一个子查询来核算每个用户的第一次事情日期(假如用户之前未呈现,则为 null)。然后,它核算了每个用户在每个事情日期之前是否契合新用户的定义。最终,查询按照事情日期进行分组,核算每天契合条件的新用户数。
具体来说,子查询中的 MIN(event_date) OVER (PARTITION BY user_id) 核算出每个用户的第一次事情日期。然后,DATEDIFF(day, first_event_date, event_date) 函数核算出每个用户的第一次事情日期和当时事情日期之间的天数差。假如这个差值小于等于90天,或许第一次事情日期为null,则该用户契合新用户的定义。
最终,查询运用 GROUP BY 子句按照事情日期进行分组,并运用 COUNT(*) 函数核算每天契合条件的新用户数。
当我发现有问题的时分,这个时分你可以去提示它,可是我没有,我把这个问题重新输入了一下,这是它给我的回来
SELECT
event_date,
COUNT(*) as new_users
FROM (
SELECT
user_id,
MIN(event_date) as first_event_date
FROM
user_events
GROUP BY
user_id
) as t1
WHERE
first_event_date = event_date OR DATEDIFF(day, first_event_date, event_date) > 90
GROUP BY
event_date
我只能说它比上次聪明晰一点点,可是这次的代码不能运转,由于子查询中根本没有把event_date
字段带出来,后面还屡次运用了,必定报错,可是聪明在哪里呢?
- 子查询里边做了数据去重,使得数据量减少了
- 接连90天 的条件写对了,是大于90 不是小于等于90
这儿我还是再次输入了上面的问题,这次它终于对了
SELECT
event_date,
COUNT(DISTINCT user_id) AS new_user_count
FROM (
SELECT
user_id,
event_date,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY event_date) AS row_num,
LAG(event_date, 1) OVER (PARTITION BY user_id ORDER BY event_date) AS prev_event_date
FROM
user_events
) AS user_events_with_row_num
WHERE
row_num = 1 OR DATEDIFF(day, prev_event_date, event_date) > 90
GROUP BY
event_date;
它还给出了解说,重点是LAG
函数
这个查询首要运用了一个子查询来给每个用户的事情数据分配一个行号(运用 ROW_NUMBER() 函数),并将每个用户的前一个事情日期(运用 LAG() 函数)与当时事情日期一同作为一个成果列回来。在外部查询中,咱们依据以下条件来筛选新用户:
用户是表中的第一个事情,也便是 row_num = 1。
用户在曩昔90天内没有呈现过,也便是当时事情日期与前一个事情日期之间的天数大于90天。
最终,咱们运用 GROUP BY 子句和 COUNT(DISTINCT ...) 函数来核算每天的新用户数。
咱们可以看到这个代码是正确的,所以咱们可以看到ChatGPT 尽管可以帮咱们写代码,可是咱们还是需求自己去判别写的对不对
事例二 Java
这儿咱们直接去力扣上找两个题让ChatGPT 来做
简单标题
输入:
给你一个整数 x ,假如 x 是一个回文整数,回来 true ;否则,回来 false 。 回文数是纠正序(从左向右)和倒序(从右向左)读都是相同的整数。 例如,121 是回文数,而 123 不是。 请帮我写一段Java 代码实现上述办法
输出:
以下是一个Java办法,可以判别一个整数是否为回文数:
public boolean isPalindrome(int x) {
if (x < 0) { // 负数不是回文数
return false;
}
int temp = x;
int reverse = 0;
while (temp != 0) {
int digit = temp % 10;
reverse = reverse * 10 + digit;
temp /= 10;
}
return x == reverse;
}
下面是它的解说
该办法首要查看输入整数是否为负数,由于负数不是回文数。
接下来,将输入整数的每个数字提取出来并回转它们。这可以通过取模运算和整数除法来完结。在每一次循环中,将提取的数字添加到一个回转的数字中。例如,假如输入整数为 123,首要将提取数字 3 并将其添加到回转数字中,变成 3。接下来,提取数字 2 并将其添加到回转数字中,变成 32。最终,提取数字 1 并将其添加到回转数字中,变成 321。
最终,比较原始整数和回转后的整数是否相等,假如相等,则回来 true,否则回来 false。
这个代码写的是对的,咱们直接在力扣上测验
复杂标题
咱们在力扣上找了一个相对复杂的标题,咱们的prompt 如下
数字 n 代表生成括号的对数,请你规划一个函数,用于可以生成一切或许的并且有效的括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
请帮我写一段Java代码实现上述办法
ChatGPT 竟然写出来了,并且它还给你写在了一个类中,那我简单提示一下它,写个办法就行
提示之后,咱们就不验证这个代码的正确性了,直接提交试试看
咱们发现测验顺利通过
事例三 Python
还会上面那个标题,咱们略微修改一下提示,也便是让ChatGPT 用python 写出来
def generateParenthesis(n):
if n == 0:
return ['']
ans = []
for c in range(n):
for left in generateParenthesis(c):
for right in generateParenthesis(n-1-c):
ans.append('({}){}'.format(left, right))
return ans if n > 0 else []
这个代码在力扣上报错,提示找不到generateParenthesis
,咱们值需求略微改动一下,将generateParenthesis
改成self.generateParenthesis
即可,即可通过测验
总结
这一节咱们主要测验运用ChatGPT去给咱们写代码,可以看到常见的代码它得确能帮咱们写出来,可是许多时分或许或多或少是有点问题的,这个时分咱们可以测验改动咱们的prompt 引导ChatGPT 产生一个正确的成果。
后面咱们持续测验ChatGPT 的其他场景,以到达解放咱们的生产力的意图,尽管有时分写出的代码或许存在bug,可是只需咱们稍加调整即可,并且关于ChatGPT而言它不像咱们,它拿手各种编程言语。