共计 9653 个字符,预计需要花费 25 分钟才能阅读完成。
举荐:将 NSDT 场景编辑器退出你的 3D 工具链
大型语言模型基本上是一台能够了解和生成文本的机器。取决于它的训练形式,有时模型能够生成文本以外的内容。ChatGPT 就是这样一个大型语言模型。如果您正确提醒,它能够生成编程代码。在这篇文章中,您将学习如何使 ChatGPT 为您生成程序。具体来说,您将学习如何使 ChatGPT
- 疏导您的编程我的项目
- 如何应用 ChatGPT 作为您的编程助手
让咱们开始吧。
应用 ChatGPT 作为您的编程助手作者应用稳固扩散生成的图片。保留局部权力。
概述
这篇文章分为两局部; 它们是:启动编程我的项目理解代码和生成函数片段启动编程我的项目让咱们思考一个简略的我的项目:你想要设置一个 REST API 服务器,它能够帮忙你对提供的 URL 的整个网页进行“屏幕截图”。(可选)REST API 能够承受电子邮件地址的其余可选参数。在这种状况下,屏幕捕捉不会返回,而是通过电子邮件发送进来。
这是一个波及多个组件的我的项目。你须要一些能够像 REST API 服务器一样监听 HTTP 申请并做出相应响应的货色。您还须要一些货色来获取 URL 并像一般 Web 浏览器一样截取屏幕截图。其中还有一个逻辑,取决于是否提供了电子邮件地址; 输入能够是返回的图像文件,也能够是发送带有附件的电子邮件。
如果您不相熟如何创立 REST API 服务器或不晓得可用的工具,能够向 ChatGPT 寻求帮忙。只需在提醒中写下所有细节并询问:
我须要创立一个 REST API 服务器,该服务器承受 URL 作为输出,将网页屏幕截图捕捉为 JPEG 格局并将其作为输入返回。(可选)用户能够提供电子邮件地址作为附加输出。在这种状况下,屏幕截图应通过电子邮件发送而不是返回。你能帮我这个程序吗?
有了这个,ChatGPT 产生以下倡议:
当然!我能够帮你。要创立捕捉网页屏幕截图并解决可选电子邮件性能的 REST API 服务器,您能够应用 Node.js 以及一些其余包。以下是您能够遵循的步骤的概述:
- 设置一个新的 Node.js 我的项目并应用 npm 对其进行初始化:
1. mkdir screenshot-api
2. cd screenshot-api
3. npm init
2. 装置必要的软件包。您须要 API 服务器、捕捉屏幕截图和发送电子邮件:
1. expresspuppeteernodemailer1
2. npm install express puppeteer nodemailer
-
应用 Express 创立文件并设置根本服务器 index.js
const express = require('express'); const app = express(); const port = 3000; app.get('/screenshot', async (req, res) => { const url = req.query.url; const email = req.query.email; // Capture the screenshot using Puppeteer // Handle the response based on whether an email is provided});app.listen(port, () => {console.log(`Server is running on port ${port}`);});
-
在路由内,应用 Puppeteer 捕捉网页截图并相应地解决响应:/screenshot
const puppeteer = require('puppeteer'); app.get('/screenshot', async (req, res) => { const url = req.query.url; const email = req.query.email; // Launch Puppeteer const browser = await puppeteer.launch(); const page = await browser.newPage(); // Navigate to the provided URL await page.goto(url); // Capture the screenshot const screenshotBuffer = await page.screenshot({fullPage: true}); // Close the browser await browser.close(); // Handle the response based on whether an email is provided if (email) {// Send the email with the screenshot attachment using Nodemailer} else {// Send the screenshot as the response res.type('image/jpeg'); res.send(screenshotBuffer); }});
5. 要解决发送带有屏幕截图附件的电子邮件,请在块内增加以下代码:if
const nodemailer = require('nodemailer');
// Create a transporter using your email service provider's details
const transporter = nodemailer.createTransport({service: 'your-email-service-provider', auth: { user: 'your-email@example.com', pass: 'your-email-password',},});
// Define the email options
const mailOptions = {from: 'your-email@example.com', to: email, subject: 'Web Page Screenshot', text: 'Please find the attached screenshot.', attachments: [ { filename: 'screenshot.jpg', content: screenshotBuffer,}, ],};
// Send the email
transporter.sendMail(mailOptions, (error, info) => {if (error) {console.error(error); res.status(500).send('Failed to send email.'); } else {console.log(`Email sent: ${info.response}`);
res.send('Screenshot emailed successfully!'); }});
确保将、替换为理论电子邮件服务提供商的详细信息。’your-email-service-provider”your-email@example.com”your-email-password’
- 最初,启动服务器:1node index.js 当初,当您向 收回 GET 申请时,服务器将捕捉所提供 URL 的屏幕截图。如果电子邮件地址也作为 提供,服务器会将屏幕截图作为电子邮件附件发送,而不是间接返回。http://localhost:3000/screenshot?url={URL}email={EMAIL}
请记住处理错误,并依据您的要求增加任何必要的谬误查看或验证。
就是这样!您当初有一个根本的 REST API 服务器,该服务器能够捕捉网页屏幕截图并选择性地通过电子邮件发送它们。请随时依据您的须要进一步加强它。
这是一个十分具体的后果,告诉您如何实现此编程工作。响应涵盖了所有要求,但您应该留神到,当您没有在提醒中明确指定时,ChatGPT 将为您做出一些设计决策,例如应用哪种编程语言。
在第一次运行时思考所有细节并不容易,但 ChatGPT 的性质容许您提供后续提醒来批改答案,例如:
对于上述问题,我想应用 Python 和 FastAPI 作为 Web 框架,Selenium 作为 Web 浏览器。你能重写这个吗?
来自 ChatGPT 的响应当初变为:
当然!以下是该解决方案的订正版本,应用 Python,FastAPI 作为 Web 框架,Selenium 用于 Web 浏览器自动化。
- 装置必要的软件包。您须要 来运行服务器和治理 Web 驱动程序:
fastapiuvicornseleniumwebdriver_manager
install fastapi uvicorn selenium webdriver_manager
- 创立一个名为的新文件并导入所需的模块:main.py
from fastapi import FastAPI, HTTPExceptionfrom fastapi.responses import FileResponsefrom pydantic import BaseModelfrom selenium import webdriverfrom webdriver_manager.chrome import ChromeDriverManagerfrom selenium.webdriver.chrome.options import Optionsfrom selenium.common.exceptions import WebDriverExceptionfrom io import BytesIOapp = FastAPI()
- 定义一个申请模型来解决输出数据:
class ScreenshotRequest(BaseModel):
url: str email: str = None
4. 创立捕捉网页屏幕截图的路线:
app.get("/screenshot")async def capture_screenshot(request: ScreenshotRequest):
options = Options()
options.headless = True
try:
# Set up the Chrome webdriver
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options) driver.set_window_size(1280, 720)
# Navigate to the provided URL
driver.get(request.url)
# Capture the screenshot
screenshot = driver.get_screenshot_as_png()
screenshot_buffer = BytesIO(screenshot)
# Close the browser
driver.quit() if request.email:
# Send the email with the screenshot attachment r
eturn "Screenshot emailed successfully!"
else:
# Return the screenshot as a response
return FileResponse(screenshot_buffer, media_type="image/png")
except WebDriverException:
raise HTTPException(status_code=400, detail="Failed to capture screenshot.")
- 应用 Uvicorn 启动服务器
1uvicorn main:app –reload
当初,当您向 收回 GET 申请时,服务器将捕捉所提供 URL 的屏幕截图。如果电子邮件地址也以 模式提供,则能够应用申请中的字段解决发送带有屏幕截图附件的电子邮件。
http://localhost:8000/screenshot?url={URL}email={EMAIL}email 请记住处理错误,并依据您的要求增加任何必要的谬误查看或验证。
留神:此解决方案假设您的计算机上安装了 Chrome。如果您应用的是其余浏览器,则须要相应地调整网络驱动程序。
就是这样!您当初有一个应用 Python、FastAPI 和 Selenium 的 REST API 服务器来捕捉网页屏幕截图并解决可选的电子邮件性能。
您能够看到,除了援用“上述问题”之外,您在后续提醒中没有提供任何不必要的细节,但 ChatGPT 能够精确地将 Node.js 实现“翻译”为 Python 并应用您指定的库。
这是一个很棒的后果,只管您可能依然须要欠缺代码。一个例子是浏览器屏幕大小必定会影响网页的出现形式,但大小在下面是硬编码的,因为您没有指定它应该在提醒中调整。欠缺生成的代码的另一个潜在起因是捕捉其余编码款式问题或增加针对平安问题的进攻措施。
总之,与其余用例一样,您在提醒中输出的足够清晰的细节越多,是有用响应的要害。在编程工作的状况下,安排细节至关重要。
- 指标是什么
- 输出和输入格局
- 程序应该应用哪些工具
- 程序可能遇到的不同状况是什么,以及应该如何解决这些状况
理解代码和生成函数片段
有时,您要编写的不是大型程序,而是较小的函数。你能够要求 ChatGPT 应用相似于下面的提醒为你生成一个函数,只是你须要指定输入格局,比方函数或类。
事实上,你也能够反过来做,即向 ChatGPT 提供一个代码,并要求它用英语解释。它有时很有用,尤其是破译其他人的代码。让咱们思考以下示例:
请解释以下代码在做什么:
{
float s = 1,
ret = 0,
**b;
int i, j, m, n, c;
if (k == 1)
{return a[0][0];
}
else {b = (float**) malloc(sizeof(float*)*k);
for (i = 0; i < k; i++)
b[i] = (float*) malloc(sizeof(float)*k);
ret = 0;
for (c = 0; c < k; c++)
{
m = 0;
n = 0;
for (i = 0; i < k; i++)
{for (j = 0; j < k; j++)
{b[i][j] = 0;
if (i != 0 && j != c)
{b[m][n] = a[i][j];
if (n < (k - 2))
n++;
else {
n = 0;
m++;
}
}
}
}
ret = ret + s * (a[0] * det(b, k - 1));
s = s * -1;
};
for (i = 0; i < k; i++)
free(b[i]);
};
free(b);
return ret;
}
这个提醒很简略:只有一个关键字,“解释”。但请留神如何向 ChatGPT 提供代码:反引号的应用遵循 Markdown 的代码围栏语法来援用程序。这有助于确定哪些是您的指令,哪些不是。
尽管这不是一个很长的程序,但 ChatGPT 十分具体地解释了代码。它还在高层次上确定了用意,即计算矩阵的行列式。以下是响应:
您提供的代码是应用拉普拉斯开展计算方阵行列式的递归实现。
以下是代码性能的分步细分:
- 该函数采纳两个参数:指向示意矩阵的 2D 数组()和矩阵大小的指针()。detfloat** afloat k
- 它申明了一些变量:符号、行列式值和长期矩阵。sret**b
- 它查看是否等于 1。如果是这样,则意味着咱们曾经达到了 1×1 矩阵的根本状况,并且该函数返回矩阵中的单个值,这是行列式。k
- 如果大于 1,则持续计算。k
- 它为大小为 x 的长期矩阵动静分配内存。bkk
- 它初始化为 0。ret
- 它进入一个循环,循环遍历矩阵第一行的每一列。a
- 在循环外部,它将索引重置为 0。mn
- 它进入一个嵌套循环,该循环遍历矩阵的每个元素。a
- 在嵌套循环中,它将长期矩阵中地位 的元素设置为 0。bmn
- 它查看以后元素是否不在第一行()中,也不在当前列()中。i != 0j != c
- 如果元素不在第一行或当前列中,它将值从矩阵复制到地位,的长期矩阵。abmn
- 它更新索引,并依据下一个元素在 中的地位。mnb
- 在嵌套循环之后,它通过应用长期矩阵和大小递归调用函数来计算子矩阵的行列式。bdetbk – 1
- 它将子矩阵的行列式乘以符号(交替符号)。s
- 它将符号乘以 -1 以将符号切换为下一次迭代。s
- 它将符号的乘积、第一行()中的元素和子矩阵的行列式增加到运行和中。a0ret
- 循环持续到下一列。
- 循环后,它开释为长期矩阵的每一行调配的内存。b
- 它开释了为长期矩阵调配的内存。b
- 最初,它返回计算出的行列式值。ret
总之,该代码通过沿第一行执行拉普拉斯开展来递归计算方阵的行列式。它应用长期矩阵来存储通过排除第一行和所选列取得的子矩阵。递归始终继续到达到 1×1 矩阵的基数。
跟进以改良代码
乍一看,这段代码并不容易了解。可能有一种办法能够使其更易于浏览。事实上,ChatGPT 在这种状况下能够做得很好,只需一个非常简单的后续提醒:
为了分明起见,您能够重写此代码并增加正文吗?这里的关键字是“为了分明起见”和“增加评论”。ChatGPT 提供以下内容作为响应:
当然!上面是代码的修订版 -
float determinant(float** matrix, int size)
{
float sign = 1; // Sign of the determinant
float result = 0; // Determinant value
float** submatrix; // Temporary submatrix
int i, j, m, n, c; // Loop variables
// Base case: 1x1 matrix
if (size == 1) {return matrix[0][0];
}
else {
// Allocate memory for the temporary submatrix
submatrix = (float**)malloc(sizeof(float*) * size);
for (i = 0; i < size; i++)
{submatrix[i] = (float*)malloc(sizeof(float) * size);
}
// Calculate the determinant
for (c = 0; c < size; c++)
{
m = 0;
n = 0;
// Create the submatrix by excluding the first row and the current column
for (i = 0; i < size; i++)
{for (j = 0; j < size; j++)
{submatrix[i][j] = 0;
// Copy values to the submatrix
if (i != 0 && j != c)
{submatrix[m][n] = matrix[i][j];
// Update submatrix indices
if (n < (size - 2))
{n++;}
else {
n = 0;
m++;
}
}
}
}
// Calculate the determinant of the submatrix recursively
result += sign * matrix[0] * determinant(submatrix, size - 1);
// Flip the sign for the next iteration
sign *= -1; }
// Free the memory allocated for the submatrix
for (i = 0; i < size; i++) {free(submatrix[i]);
}
free(submatrix);
return result;
}
}
我在代码的每个重要局部上方增加了正文,以解释它的作用。这应该使代码更具可读性和更易于了解。
这个版本无疑更容易浏览。
此外,您能够要求更多。例如要求捕捉代码中的谬误或潜在的平安问题。让咱们让 ChatGPT 生成一些单元测试代码:
你能给我几个单元测试用例来确保这个函数运行良好吗?
不须要任何进一步的解释,以下是响应:
当然!以下是一些单元测试用例,用于验证函数的正确性:determinant
测试用例 1:2×2 矩阵
float matrix1[2][2] = {{2, 3},
{1, 4}};
float** ptrMatrix1 = (float**)matrix1;
float det1 = determinant(ptrMatrix1, 2);
// Expected output: 5
测试用例 2:3×3 矩阵
float matrix2[3][3] = {{6, 1, 1},
{4, -2, 5},
{2, 8, 7}};
float** ptrMatrix2 = (float**)matrix2;float det2 = determinant(ptrMatrix2, 3);
// Expected output: -306
测试用例 3:4×4 矩阵
float matrix3[4][4] = {{1, 0, 2, -1},
{3, 0, 0, 5},
{2, 1, 4, -3},
{1, 0, 5, 0}};
float** ptrMatrix3 = (float**)matrix3;float det3 = determinant(ptrMatrix3, 4);
// Expected output: -20
这些测试用例涵盖不同大小(2×2、3×3 和 4×4)的矩阵,并包含正、负和零行列式值。通过将计算出的行列式值与预期输入进行比拟,能够验证函数是否失常工作。determinant
但很显著,单元测试代码脱漏了一个极其状况:1×1 矩阵。这表明 ChatGPT 并不总是完满的。您应该仅将其用作助手,而不应将其用作替代品。您应始终验证后果。
总结
在这篇文章中,您看到了 ChatGPT 如何帮忙您编程。它不仅能够生成代码作为对您的问题的答复的一部分,还能够找出您提供的代码的用意。具体来说,您曾经理解到:
- 您能够应用 ChatGPT 为您的软件我的项目生成初始代码,或为函数生成测试代码
- 你能够让 ChatGPT 向你解释代码
- 你能够利用 ChatGPT 来重构和清理代码
原文链接:https://www.mvrlink.com/shi-yong-chatgptzuo-wei-nin-de-bian-c…