
$ pip install openai$ pip install python-dotenv$ pip install gradiopython-dotenv库将用于安全地存储OpenAI API密钥,而不需要直接将其插入到代码中。代码将从环境文件中读取API密钥。
gradio库是一个非常有用的库,可以基于Python函数快速创建Web界面。

import openaiimport osfrom dotenv import load_dotenvload_dotenv()openai.api_key = os.getenv("OPENAI_API_KEY")def generate_code(prompt, temperature=0.5, max_tokens=256): response = openai.Completion.create(engine="text-davinci-003", prompt=prompt, max_tokens=max_tokens, temperature=temperature) return response.choices[0].text.strip()prompt = ( "编写一个python函数,该函数以字符串作为输入,并返回字符串中字母元音的计数")code = generate_code(prompt)print(code)

现在你可以在编辑器中右键单击,然后选择CodeGPT | Ask ChatGPT选项。这允许你像在Web界面上一样向ChatGPT提出一般性的查询。然而,你还可以选择代码的部分,右键单击以进行上下文敏感的ChatGPT调用。



import statisticsdef calculate_stats(numbers): """ 计算数字列表的平均值、中位数和标准差。 参数: numbers(list):数字列表。 返回: tuple:包含平均值、中位数和标准差的元组。 """ # 计算平均值 avg = sum(numbers) / len(numbers) # 计算中位数 median = statistics.median(numbers) # 计算标准差 stdev = statistics.stdev(numbers) return avg, median, stdevnumbers = [1, 2, 3, 4, 5]avg, median, stdev = calculate_stats(numbers)print(f"平均值: {avg}")print(f"中位数: {median}")print(f"标准差: {stdev}")
生成了一个用于保存输出值的类SummaryStatistics.py
import statisticsclass SummaryStatistics: def __init__(self, lst): if len(lst) < 2: # 只有一个元素的情况 self.average = None self.median = lst[0] if lst else None self.stdev = None else: self.average = sum(lst) / len(lst) self.median = statistics.median(lst) self.stdev = statistics.stdev(lst)编写单元测试test_summary_statistics.py
import unittestimport statisticsfrom SummaryStatistics import SummaryStatisticsclass TestSummaryStatistics(unittest.TestCase): def setUp(self): self.data = [1, 2, 3, 4, 5] self.stats = SummaryStatistics(self.data) def test_average(self): self.assertEqual(self.stats.average, statistics.mean(self.data)) def test_median(self): self.assertEqual(self.stats.median, statistics.median(self.data)) def test_stdev(self): self.assertAlmostEqual(self.stats.stdev, statistics.stdev(self.data), places=2) def test_single_element(self): single_data = [6] # 创建只包含一个元素的列表 single_stats = SummaryStatistics(single_data) # 使用单个元素数据创建SummaryStatistics实例 if len(single_data) < 2: self.assertIsNone(single_stats.stdev) # 断言当只有一个元素时,stdev为None else: self.assertEqual(single_stats.stdev, statistics.stdev(single_data)) # 断言多个元素的标准差 def test_empty_list(self): empty_data = [] # 创建一个空列表 empty_stats = SummaryStatistics(empty_data) # 使用空列表创建SummaryStatistics实例 if len(empty_data) == 0: self.assertIsNone(empty_stats.average) # 断言空列表的平均值为None self.assertIsNone(empty_stats.median) # 断言空列表的中位数为None self.assertIsNone(empty_stats.stdev) # 断言空列表的标准差为Noneif __name__ == '__main__': unittest.main()标准差用于表示整个群体的偏离程度。小的标准差意味着数字围绕平均值密集地聚集在一起。大的标准差意味着数字与平均值更分散。
两种使用标准差的方法
样本标准差往往略大于总体标准差,因为它考虑到我们在处理样本而不是整个人口时信息更少的事实。这两种方法在统计学中广泛使用,并可以为数据集的分散程度和变异性提供有益的见解。
calculate_grade_curve.py
import statisticsdef calculate_grade_curve(scores): # 计算平均分 avg_score = sum(scores) / len(scores) # 为每个字母等级定义分数范围 a_range = (avg_score + 1.5 * statistics.stdev(scores), float('inf')) b_range = (avg_score + 0.5 * statistics.stdev(scores), avg_score + 1.5 * statistics.stdev(scores)) c_range = (avg_score - 0.5 * statistics.stdev(scores), avg_score + 0.5 * statistics.stdev(scores)) d_range = (avg_score - 1.5 * statistics.stdev(scores), avg_score - 0.5 * statistics.stdev(scores)) f_range = (float('-inf'), avg_score - 1.5 * statistics.stdev(scores)) # 创建一个包含每个字母等级分数范围的字典 grade_ranges = { "A": a_range, "B": b_range, "C": c_range, "D": d_range, "F": f_range } return grade_rangesscores = [70, 85, 90, 92, 95, 98, 100]grade_ranges = calculate_grade_curve(scores)print(grade_ranges)输出结果
{'A': (105.22333734763833, inf), 'B': (95.0744457825461, 105.22333734763833), 'C': (84.9255542174539, 95.0744457825461), 'D': (74.77666265236167, 84.9255542174539), 'F': (-inf, 74.77666265236167)}使用的算法是基于标准偏差离平均分的分数区间。然而,这个实现存在问题。首先要注意的是A等级的范围实际上从100以上开始和结束,而100是可能的最高分。在这个数据集中,样本分数都相当高,然而,对一个测验得到90分以上而没有得到A等级的学生来说,这似乎并不公平。
重新缩放或调整分数是一种将测试分数调整到100点制上反映整个班级表现的技术。基本上,这涉及将最高分数转换为100分,然后相应地调整所有其他分数。
因此,创建一个分级曲线的简单方法是将每个分数增加到将最高分数提升到100所需的量。
SG = OG * 100/MG
import statisticsdef grading_curve(test_scores): # 计算列表中的最高分 max_score = max(test_scores) # 计算缩放后的成绩和字母等级 grades = [] for score in test_scores: scaled_grade = score * 100 / max_score if scaled_grade >= 90: letter_grade = 'A' elif scaled_grade >= 80: letter_grade = 'B' elif scaled_grade >= 70: letter_grade = 'C' elif scaled_grade >= 60: letter_grade = 'D' else: letter_grade = 'F' grades.append((scaled_grade, letter_grade)) # 定义每个字母等级的分数范围 grade_ranges = {'A': (90, 100), 'B': (80, 89), 'C': (70, 79), 'D': (60, 69), 'F': (0, 59)} # 计算每个字母等级范围内的学生人数 grade_counts = {grade: len([sg for sg, lg in grades if rg[0] <= sg <= rg[1]]) for grade, rg in grade_ranges.items()} # 计算每个字母等级范围内学生的百分比 total_students = len(grades) grade_percentages = {grade: count * 100 / total_students for grade, count in grade_counts.items()} # 将成绩、分数范围和百分比作为字典返回 return {'Grades': grades, 'Grade Percentages': grade_percentages}test_scores = [70, 81, 90, 72, 85, 92, 67]print(grading_curve(test_scores))print(grade_ranges)输出
{ 'Grades': [(76.08695652173913, 'C'), (88.04347826086956, 'B'), (97.82608695652173, 'A'), (78.26086956521739, 'C'), (92.3913043478261, 'A'), (100.0, 'A'), (72.82608695652173, 'C')], 'Grade Percentages': { 'A': 42.857142857142854, 'B': 14.285714285714286, 'C': 42.857142857142854, 'D': 0.0, 'F': 0.0 }}可能这样看并不明显,编写分数对应曲线等级表
import statisticsdef calculate_grade_curve(scores): # 计算平均分 avg_score = sum(scores) / len(scores) # 为每个字母等级定义分数范围 a_range = (avg_score + 1.5 * statistics.stdev(scores), float('inf')) b_range = (avg_score + 0.5 * statistics.stdev(scores), avg_score + 1.5 * statistics.stdev(scores)) c_range = (avg_score - 0.5 * statistics.stdev(scores), avg_score + 0.5 * statistics.stdev(scores)) d_range = (avg_score - 1.5 * statistics.stdev(scores), avg_score - 0.5 * statistics.stdev(scores)) f_range = (float('-inf'), avg_score - 1.5 * statistics.stdev(scores)) # 创建一个包含每个字母等级分数范围的字典 grade_ranges = { "A": a_range, "B": b_range, "C": c_range, "D": d_range, "F": f_range } return grade_rangesdef grading_curve(test_scores): # 计算列表中的最高分 max_score = max(test_scores) # 计算缩放后的成绩和字母等级 grades = [] for score in test_scores: scaled_grade = score * 100 / max_score if scaled_grade >= 90: letter_grade = 'A' elif scaled_grade >= 80: letter_grade = 'B' elif scaled_grade >= 70: letter_grade = 'C' elif scaled_grade >= 60: letter_grade = 'D' else: letter_grade = 'F' grades.append((scaled_grade, letter_grade)) # 定义每个字母等级的分数范围 grade_ranges = {'A': (90, 100), 'B': (80, 89), 'C': (70, 79), 'D': (60, 69), 'F': (0, 59)} # 计算每个字母等级范围内的学生人数 grade_counts = {grade: len([sg for sg, lg in grades if rg[0] <= sg <= rg[1]]) for grade, rg in grade_ranges.items()} # 计算每个字母等级范围内学生的百分比 total_students = len(grades) grade_percentages = {grade: count * 100 / total_students for grade, count in grade_counts.items()} # 将成绩、分数范围和百分比作为字典返回 return {'Grades': grades, 'Grade Percentages': grade_percentages}def display_grades(test_scores, grades): if not grades: print("No grades available") return if len(grades["Grades"]) != len(test_scores): print("Number of grades does not match number of test scores") return # Print the header row of the table print(f"{'Test Score':<12} {'Curved Score':<15} {'Letter Grade':<12}") # Print each row of the table for i, score in enumerate(test_scores): curved_score, letter_grade = grades["Grades"][i][0], grades["Grades"][i][1] print(f"{score:<12} {curved_score:<15.2f} {letter_grade:<12}")test_scores = [75, 88, 92, 60, 81, 70, 85, 76, 90]grade_data = grading_curve(test_scores)display_grades(test_scores, grade_data)输出
Test Score Curved Score Letter Grade75 81.52 B 88 95.65 A 92 100.00 A 60 65.22 D 81 88.04 B 70 76.09 C 85 92.39 A 76 82.61 B 90 97.83 A $ python calculate_grade_curve.py Running on local URL: http://127.0.0.1:7860
我们希望数据以结构化格式进行创建。明确指定所需的输出格式。
将您的响应格式化为JSON列表。
JSON列表中的每个对象应采用以下格式: {"Question": ..., "A": ..., "B": ..., "C": ..., "D": ..., "Answer": ..., }
import openaiimport osfrom dotenv import load_dotenvload_dotenv()def generate_trivia_questions(topic): # 设置 OpenAI API 密钥 openai.api_key = os.getenv("OPENAI_API_KEY") # 定义提示生成旗题的问题 prompt = """Generate two trivia questions on the topic of U.S. Presidents. For each question, provide four possible answers labeled A, B, C, and D, and indicate which is the correct answer. Format your response as a JSON list. Each object in the JSON list should have the format: {"Question": ..., "A": ..., "B": ..., "C": ..., "D": ..., "Answer": ..., }""" # 使用ChatGPT生成问题和答案 response = openai.Completion.create( engine="text-davinci-003", prompt=prompt, max_tokens=1024, temperature=0.7, ) return response.choices[0].textquiz_topic = "U.S. Presidents"questions = generate_trivia_questions(quiz_topic)print(questions)

import sqlite3# 连接数据库conn = sqlite3.connect('db.sqlite3')# 创建一个游标对象来与数据库交互c = conn.cursor()# 创建一个表格c.execute('''CREATE TABLE quiz(id TEXT PRIMARY KEY,name TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)''')# 保存更改conn.commit()创建 quiz 表并添加一条记录
$ sqlite3 db.sqlite3SQLite version 3.40.1 2022-12-28 14:03:47Enter ".help" for usage hints.sqlite> .tablesquizsqlite> .schemaCREATE TABLE quiz(id TEXT PRIMARY KEY,name TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);sqlite> insert into quiz values ('1', 'Test Quiz', time());$ sqlite3 quizdb.sqliteSQLite version 3.40.1 2022-12-28 14:03:47Enter ".help" for usage hints.sqlite> CREATE TABLE questions ( question_id TEXT PRIMARY KEY, question_text TEXT NOT NULL, option_a TEXT NOT NULL, option_b TEXT NOT NULL, option_c TEXT NOT NULL, option_d TEXT NOT NULL, correct_answer TEXT NOT NULL, quiz_id INTEGER NOT NULL, FOREIGN KEY (quiz_id) REFERENCES quiz(id));sqlite> .tablesquestionsget_quiz_list.py
import sqlite3class Quiz: def __init__(self, id, name, created_at): self.id = id self.name = name self.created_at = created_atdef get_quiz_list(): conn = sqlite3.connect('db.sqlite3') c = conn.cursor() c.execute("SELECT * FROM quiz") rows = c.fetchall() quiz_data = [] for row in rows: quiz = Quiz(row[0], row[1], row[2]) quiz_data.append(quiz) conn.close() return quiz_datafrom get_quiz_list import get_quiz_listquizzes = get_quiz_list()for quiz in quizzes: print(vars(quiz))输出结果
{'id': '1', 'name': 'Test Quiz', 'created_at': '12:09:03'}$ pip install bottleapp.py
# app.pyfrom bottle import Bottle, run# Create a Bottle app instanceapp = Bottle()# Define a route handler for the root URL@app.route('/')def hello(): return "Hello, World!"# Run the Bottle appif __name__ == '__main__': run(app, host='localhost', port=8080, debug=True)$ python app.pyBottle v0.12.25 server starting up (using WSGIRefServer())...Listening on http://localhost:8080/Hit Ctrl-C to quit.127.0.0.1 - - [11/Jul/2023 08:02:37] "GET / HTTP/1.1" 200 13127.0.0.1 - - [11/Jul/2023 08:02:37] "GET /favicon.ico HTTP/1.1" 404 742import openaiimport osimport gradio as grfrom dotenv import load_dotenvload_dotenv()openai.api_key = os.getenv("OPENAI_API_KEY")messages = [ {"role": "system", "content": "您是一位有帮助的AI助手,可以讨论日常话题。"},]def chatbot(input): if input: messages.append({"role": "user", "content": input}) chat = openai.ChatCompletion.create( model="gpt-3.5-turbo", message=messages ) reply = chat.choices[0].message.content messages.append({"role": "assistant", "content": reply}) return replyinputs = gr.inputs.Textbox(lines=7, label="Talk to me")outputs = gr.outputs.Textbox(label="Reply")gr.Interface(fn=chatbot, inputs=inputs, outputs=outputs, title="Your friendly AI Chatbot", description="We can talk about whatever you like", theme="compact").launch(share=True)$ python chatbot.pyRunning on local URL: http://127.0.0.1:7861Running on public URL: https://91525be2a5899eb91c.gradio.live