• [技术干货] MCP原理与开发详解【python篇】
         1.MCP是什么         Model Context Protocol 模型上下文协议,通过定义统一的通信协议、数据格式和规则,实现LLM与外部资源(如数据库、API、本地文件等)的安全双向连接.        价值:扩展模型能力;标准化协议降低开发门槛;高并发支持;弹性扩展;     2.MCP特性        通信协议:json-rpc2.0,轻量级RPC协议,使用json作为数据格式,实现跨语言通信        mcp host:发起请求的 AI 应用程序,集成了mcp client        mcp client:代表AI模型连接服务器,管理工具调用与权限        mcp server:特定功能的实现,按通信协议把数据返回给client        有状态/无状态:通过mcp-session-id支持状态管理和恢复     3.LLM调用MCP流程描述        用户输入 → Client传递请求至大模型 → 大模型生成工具调用指令 → Client转发指令至MCP Server → Server执行操作 → 结果返回至Client → 大模型生成最终响应     4.开发工具FastMcp        构建MCP服务端和客户端的标准框架,客户端可通过resources/list方法动态发现服务能力,服务端提供的能力如下注解:        @mcp.tool()适用于计算、API调用等        @mcp.resource(“uri“)适用于静态资源、动态资源数据的获取        @mcp.prompt()定义可复用的文本模板或交互模式,用于指导 LLM 如何更有效地使用你的工具和资源    5.代码示例    5.1安装工具fastmcp           pip install fastmcp                 5.2 检查安装是否成功:pip show fastmcp                   5.3 mcp server端代码编写          示例一:获取IP地址 """获取服务器公网 IP 地址    返回:        str: 当前网络的公网 IP 地址"""@db_access.tool(name='get_ip',description='获取本机的IP地址')def get_public_ip_address() -> str:    try:        response = requests.get("http://ip-api.com/json")        response.raise_for_status()  # 检查 HTTP 请求是否成功        content = json.loads(response.text)        return content.get("query", "Unknown IP")  # 提供默认值以防字段缺失    except requests.RequestException as e:        print(f"请求错误: {e}")        return "Request Failed"    except json.JSONDecodeError as e:        print(f"JSON 解码错误: {e}")        return "Invalid Response" 代码示例二:读取本地资源@mcp.resource(name="getPathFile",description="获取path文本文件内容",uri="file:///{path}")def read_file(path: str):    """提供本地文件读取服务"""    file = pathlib.Path("e:\\aaa\\"+path)    if not file.exists():        raise FileNotFoundError(f"{path} not found")    return file.read_text(encoding='utf-8')         5.4运行服务端                     5.5 客户端代码        5.5.1 获取工具列表:async def get_tools(self):        async with self.client:            response = await self.client.list_tools()            tools = [{                    "type": "function",                    "function": {                        "name": tool.name,                        "description": tool.description,                        "input_schema": tool.inputSchema                    }                } for tool in response]            for tool in tools:                print("工具列表:", tool)        return tools      5.5.2 调用服务端async def chat(self, question):        if not self.tools:            self.tools = await self.get_tools()               msg = [{                    "role": "user",                    "content": question            }]          completion = self.llm.chat.completions.create(            model="大模型名称",            messages=msg,            tools=self.tools        )        print("MCP判断:",completion)        if completion.choices[0].finish_reason != "tool_calls":            return completion.choices[0].message        self.messages.append("你是一个智能助手。以下信息分析和总结:\n\n")        for tool_call in completion.choices[0].message.tool_calls:            print(">>>>>>>>>>",tool_call.function.name)            print(">>>>>>>>>>",tool_call.function.arguments)            print(">>>>>>>>>>",json.loads(tool_call.function.arguments))            response = await self.call_service(tool_call.function.name,json.loads(tool_call.function.arguments))            print("调用MCP结果:",response)            print("调用MCP结果:",response[0].text)            self.messages.append(response[0].text)        self.messages.append("严格按照用户的问题进行回答,以上述信息内容进行回答,用户的问题是:")        self.messages.append(question)        message = [{                    "role": "user",                    "content": str(self.messages)            }]            response = await self.call_llm(message)        return response     async def call_llm(self,message):        completion = self.llm.chat.completions.create(            model="大模型名称",            messages=message,            top_p=0.7,            temperature=0.2        )        return completion.choices[0].message             5.5.3启动客户端,查看执行结果:
  • [技术干货] Python Pandas df.to_markdown tablefmt 参数详解
    在 Pandas 的 df.to_markdown() 方法中,tablefmt 参数用于指定 Markdown 表格的格式,它依赖于底层库 tabulate 的支持。以下是常用的 tablefmt 参数选项及其效果说明:1. 常用 tablefmt 参数参数值说明"plain"无对齐,仅保留基础分隔线(最紧凑)。"simple"默认格式,带对齐符号(:),但可能有多余空格。"github"GitHub 风格的表格,对齐符号为 :-:(居中)、:--(左对齐)等。"grid"带边框的表格(非纯 Markdown,可能不兼容所有渲染器)。"pipe"与 GitHub 风格相同。"orgtbl"Org-mode 表格格式(适用于 Emacs Org 文件)。"html"生成 HTML 表格(非 Markdown)。"latex"生成 LaTeX 表格(非 Markdown)。"jira"Jira 兼容的表格格式。"presto"Presto SQL 风格的表格。"psql"PostgreSQL 命令行风格的表格。"rst"生成 ReStructuredText 格式的表格(非 Markdown)。"mediawiki"MediaWiki 表格语法(如 Wikipedia)。"moinmoin"MoinMoin Wiki 表格语法。"youtrack"YouTrack 问题跟踪器的表格格式。"textile"Textile 标记语言的表格。"tsv"生成 TSV(制表符分隔的文本,非 Markdown)。2. 推荐参数(Markdown 兼容)最紧凑:tablefmt="plain"| A | B | |---|---| | 1 | x | GitHub 风格(默认对齐):tablefmt="github"| A | B | | :-- | :-- | | 1 | x | 无多余空格:结合 str.replace() 后处理markdown = df.to_markdown(tablefmt="github").replace("| :-", "| -") 3. 查看所有可用格式通过 tabulate 库直接获取完整列表:from tabulate import tabulate print(tabulate._table_formats) # 输出所有支持的格式 4. 示例代码import pandas as pd df = pd.DataFrame({"A": [1, 2], "B": ["x", "y"]}) # 紧凑格式 print(df.to_markdown(tablefmt="plain", index=False)) # GitHub 风格(默认) print(df.to_markdown(tablefmt="github", index=False)) # 自定义对齐(后处理) github_md = df.to_markdown(tablefmt="github", index=False) compact_md = "\n".join( line if not line.startswith("| :") else "| - | - |" for line in github_md.split("\n") ) print(compact_md) 5. 注意事项Markdown 兼容性:"grid"、"html" 等格式可能不被所有渲染器支持。对齐控制:若需完全移除对齐符号(如 :-:),建议用 "plain" 或后处理字符串。性能:复杂格式(如 "grid")可能比简单格式(如 "plain")生成速度稍慢。根据需求选择合适的 tablefmt 参数即可!
  • [技术干货] python pandas 转为紧凑型 markdown
    在 Python 的 Pandas 库中,to_markdown() 方法默认生成的表格可能包含多余的空格或对齐格式,使其不够紧凑。若要生成紧凑型的 Markdown 表格,可以通过调整参数或后处理实现。以下是几种方法:方法 1:禁用对齐(最简单)通过 tablefmt 参数选择无对齐的格式(如 "plain" 或 ""),并手动调整列宽:import pandas as pd df = pd.DataFrame({"A": [1, 2], "B": ["x", "y"]}) markdown = df.to_markdown(index=False, tablefmt="plain") print(markdown) 输出:| A | B | |---|---| | 1 | x | | 2 | y | 方法 2:后处理字符串移除默认的对齐符号(如 : 和多余空格):markdown = df.to_markdown(index=False) # 替换对齐行(如 | :-- | :--: | --: |)为简洁的分隔行 compact_markdown = "\n".join( line if not line.strip().startswith("| :") else "|---|---|" for line in markdown.split("\n") ) print(compact_markdown) 方法 3:自定义 tabulate 格式Pandas 的 to_markdown() 底层依赖 tabulate 库。直接使用 tabulate 可以更灵活控制格式:from tabulate import tabulate markdown = tabulate(df, headers="keys", tablefmt="github", showindex=False) # 替换对齐行(可选) compact_markdown = markdown.replace("| :- | :- |", "|---|---|") print(compact_markdown) 方法 4:手动拼接字符串(完全控制)若需极致紧凑,可手动构建 Markdown:header = "| " + " | ".join(df.columns) + " |" separator = "| " + " | ".join(["---"] * len(df.columns)) + " |" rows = [ "| " + " | ".join(map(str, row)) + " |" for row in df.values ] compact_markdown = "\n".join([header, separator] + rows) print(compact_markdown) 关键参数说明index=False:禁用行索引列。tablefmt:选择格式(如 "plain"、"github"、"simple")。对齐控制:通过替换 :-:(居中)、:--(左对齐)、--:(右对齐)为 --- 取消对齐。效果对比默认格式(可能较宽松):| A | B | | :---: | :---: | | 1 | x | 紧凑格式:| A | B | |---|---| | 1 | x | 选择适合你需求的方法即可!
  • [技术干货] Python 正则替换 re.sub
    re.sub 是 Python 正则表达式模块(re) 中的一个函数,用于 替换字符串中匹配正则表达式的部分。它的全称是 “Regular Expression Substitute”(正则表达式替换)。re.sub 的基本语法re.sub(pattern, replacement, string, count=0, flags=0) pattern:要匹配的正则表达式(字符串或编译后的正则对象)。replacement:替换成的字符串(可以是函数)。string:要处理的原始字符串。count(可选):最多替换次数(默认 0 表示全部替换)。flags(可选):正则标志(如 re.IGNORECASE)。re.sub 的作用查找并替换:找到字符串中所有匹配 pattern 的部分,替换为 replacement。支持正则表达式:可以用复杂的正则规则匹配(如 \d+ 匹配数字,\s+ 匹配空白字符等)。全局替换:默认替换所有匹配项(除非指定 count)。示例1. 简单替换import re text = "Hello, 2023! Python is great." # 将所有数字替换为 "YEAR" result = re.sub(r"\d+", "YEAR", text) print(result) # 输出: "Hello, YEAR! Python is great." 2. 替换换行符(\r\n 或 \n)text = "Line1\r\nLine2\nLine3" # 替换所有 Windows (\r\n) 和 Unix (\n) 换行符为 <br> result = re.sub(r"\r?\n", "<br>", text) print(result) # 输出: "Line1<br>Line2<br>Line3" 3. 使用函数动态替换def to_upper(match): return match.group(0).upper() text = "hello world" # 将所有单词首字母大写 result = re.sub(r"\b\w", to_upper, text) print(result) # 输出: "Hello World" re.sub vs str.replace特性re.substr.replace替换方式支持正则表达式仅支持固定字符串性能稍慢(需编译正则)更快(直接字符串操作)灵活性高(可匹配复杂模式)低(只能精确匹配)适用场景需要模式匹配时(如换行符)简单固定字符串替换为什么在 Markdown 表格换行处理中推荐 re.sub?在处理换行符时:\r\n(Windows)和 \n(Unix)是不同的,用 str.replace 需要写两次:text = text.replace("\r\n", "<br>").replace("\n", "<br>") 用 re.sub 可以 一步完成:import re text = re.sub(r"\r?\n", "<br>", text) \r? 表示“\r 是可选的”,因此能匹配 \r\n 或 \n。总结re.sub 是正则替换工具,适合复杂匹配(如换行符、数字、特定模式)。str.replace 是简单字符串替换,适合固定文本。在 Pandas 中,可以用 str.replace(regex=True) 替代 re.sub(但底层仍是正则)。如果你只需要处理换行符,re.sub(r"\r?\n", "<br>", text) 是最简洁高效的方式!
  • [技术干货] python 随机一个1-30的整数
    在 Python 中,你可以使用 random 模块来生成一个 1 到 30 的随机整数。以下是几种实现方式:方法 1:使用 random.randint()import random random_number = random.randint(1, 30) # 包含 1 和 30 print(random_number) 方法 2:使用 random.randrange()import random random_number = random.randrange(1, 31) # 起始包含,结束不包含(所以写 31) print(random_number) 方法 3:使用 random.choice()(从范围列表中随机选择)import random random_number = random.choice(range(1, 31)) # range(1, 31) 生成 1-30 的整数 print(random_number) 方法 4:使用 numpy.random.randint()(如果安装了 NumPy)import numpy as np random_number = np.random.randint(1, 31) # 起始包含,结束不包含 print(random_number) 推荐方式最简单直接的方法是 random.randint(1, 30),因为它明确表示生成 1 到 30 的随机整数(包含两端)。示例运行import random for _ in range(5): # 生成 5 个随机数示例 print(random.randint(1, 30)) 输出示例:7 15 23 2 19 注意事项random.randint(a, b) 包含 a 和 b(即 [a, b] 闭区间)。random.randrange(a, b) 不包含 b(即 [a, b) 半开区间)。如果需要可复现的随机结果,可以设置随机种子:random.seed(42) # 任意整数种子
  • [技术干货] Python中的sort()和sorted()用法示例解析【转载】
    一、list.sort()sort()是列表(list)的内置方法,直接对原列表进行排序(原地排序),不返回新列表。参数说明key(可选):指定一个函数(内置或自定义),用于从每个元素中提取比较键(如 key=str.lower)。reverse(可选):布尔值,True 表示降序,False 表示升序(默认)。常用内置函数abs(x):按绝对值排序(适用于数字)。len(x):按长度排序(适用于字符串、列表等)。str.lower(x) 或 str.upper(x):忽略大小写排序(适用于字符串)。int(x) 或 float(x):转换为数值后排序(适用于字符串数字)。ord(x):按字符的 ASCII 码排序(适用于单个字符)。基本用法示例1234567891011121314numbers = [3, 1, 4, 1, 5, 9, 2]# 升序排序(默认)numbers.sort()print(numbers)  # [1, 1, 2, 3, 4, 5, 9]# 降序排序numbers.sort(reverse=True)print(numbers) # [9, 5, 4, 3, 2, 1, 1]# 按绝对值排序numbers = [-3, 1, -4, 2]numbers.sort(key=abs)print(numbers)  # [1, 2, -3, -4]自定义函数示例1234567# 返回元组的第 2 个元素def get_second_element(item):    return item[1]  data = [("Alice", 25), ("Bob", 20), ("Jack", 30)]data.sort(key=get_second_element)  # 按年龄排序print(data)# [('Bob', 20), ('Alice', 25), ('Jack', 30)]lambda表达式示例lambda是一种匿名函数,适用于简单的key逻辑12345# 按字符串的最后一个字符排序words = ["apple", "banana", "cherry"]words.sort(key=lambda x: x[-1]) print(words)# ['banana', 'apple', 'cherry']operator模块的函数示例operator 模块提供了一些高效的 key 函数:operator.itemgetter(n):获取可迭代对象的第 n 个元素(适用于元组、字典等)。operator.attrgetter(‘attr’):获取对象的属性(适用于类实例)。123456from operator import itemgetterdata = [("Alice", 25), ("Bob", 20), ("Jack", 30)]# 按年龄排序(等同于 lambda x: x[1])data.sort(key=itemgetter(1))print(data)# [('Bob', 20), ('Alice', 25), ('Jack', 30)]二、sorted()函数sorted()是Python内置函数,对所有可迭代对象(如列表、元组、字典等)进行排序,返回一个新列表,原对象不变。参数说明iterable:要排序的可迭代对象(如列表、元组、字符串等)。key(可选):同 sort(),指定比较键。reverse(可选):同 sort(),控制排序顺序。基本用法示例123456789101112131415# 对列表排序numbers = [3, 1, 4, 1, 5]sorted_numbers = sorted(numbers)print(sorted_numbers)# [1, 1, 3, 4, 5]# 对字符串排序(按字符的 ASCII 码)word = "python"sorted_word = sorted(word)print(sorted_word)# ['h', 'n', 'o', 'p', 't', 'y']# 对元组排序data = (("Alice", 25), ("Bob", 20), ("Jack", 30))sorted_data = sorted(data, key=lambda x: x[1])  # 按年龄排序print(sorted_data)# [('Bob', 20), ('Alice', 25), ('Jack', 30)]按自定义规则排序示例12345words = ["banana", "watermelon", "apple"]# 按单词长度排序sorted_words = sorted(words, key=len)print(sorted_words)# ['apple', 'banana', 'watermelon']多级排序示例12345people = [("Alice", 25), ("Bob", 20), ("Charlie", 25)]# 先按年龄升序,再按姓名降序sorted_people = sorted(people, key=lambda x: (x[1], -ord(x[0][0])))print(sorted_people)# [('Bob', 20), ('Charlie', 25), ('Alice', 25)]对字典的键或值排序123456789scores = {"Alice": 90, "Charlie": 75, "Bob": 85}# 按键排序sorted_by_name = sorted(scores.items())print(sorted_by_name)# [('Alice', 90), ('Bob', 85), ('Charlie', 75)]# 按值排序sorted_by_score = sorted(scores.items(), key=lambda x: x[1])print(sorted_by_score)# [('Charlie', 75), ('Bob', 85), ('Alice', 90)]三、sort和sorted的排序算法list.sort()和sorted()函数使用的排序算法是Timsort,这是一种混合、稳定的排序算法,结合了归并排序(Merge Sort) 和 插入排序(Insertion Sort)的优点,并且效率极高。Timsort 的核心原理自适应排序:Timsort 根据输入数据的特点自适应地选择排序策略:对小规模数据(通常是 <=64个元素),直接使用插入排序(因为在小数据量上插入排序的常数因子更小,速度更快);对大规模数据,采用归并排序的分治思想,但会利用数据的现有顺序(如部分已排序的子序列)。利用数据的自然有序性:Timsort 会扫描数据,识别并分割已经有序的片段(称为 run),然后通过归并排序将这些 run 合并。如果数据本身有部分有序,Timsort 的效率会显著高于传统归并排序。稳定性:Timsort是稳定排序,即相等元素的相对顺序在排序后保持不变。这对多关键字排序(如先按年龄排序,再按姓名排序)非常有用。时间复杂度:最坏情况:O(nlogn)(与归并排序相同)。最佳情况:O(n)(当输入数据已有序或接近有序时,利用插入排序优化)。平均情况:O(nlogn)。Timsort 的好处实际数据友好:现实中的数据通常部分有序(如日志按时间接近有序),Timsort 能高效利用这一点。平衡性能:对于不同规模和数据分布,Timsort 在平均和最坏情况下均表现良好(平均和最坏时间复杂度均为 O(n log n))。Timsort广泛应用JavaArrays.sort() 和 Collections.sort()JavaScript (V8 引擎)V8 引擎(Chrome、Node.js)Swift标准库的 sort() 方法Rustslice::sort 和 slice::sort_byKotlinsort() 和 sorted() 函数C#(部分场景)Enumerable.OrderBy LINQ 方法
  • [技术干货] python中update()函数的用法和一些例子【转载】
    在 Python 中,update() 函数通常用于字典(dictionary)对象,以更新其键值对。该函数会将另一个字典或可迭代对象中的元素添加到当前字典中,如果键已经存在,则覆盖对应的值;如果键不存在,则添加新的键值对。以下是 update() 函数的详细用法和一些示例:用法1dict.update(other=None, **kwargs)other: 可选参数,必须是一个字典对象或者是一个包含键值对的可迭代对象(如列表的元组对)。**kwargs: 可选参数,通过关键字参数的形式直接传入键值对进行更新。注意事项如果 other 是一个字典,那么它的所有键值对都会被添加到当前字典中。如果 other 是一个可迭代对象,它必须包含形如 (key, value) 的元素对。通过 **kwargs 传入的键值对也会被添加到当前字典中。更新操作会修改原字典,而不是返回一个新的字典。示例示例 1: 使用另一个字典来更新12345678910# 定义初始字典original_dict = {'a': 1, 'b': 2}  # 定义要更新的字典update_dict = {'b': 3, 'c': 4}  # 使用 update() 方法更新original_dict.update(update_dict)  print(original_dict)  # 输出: {'a': 1, 'b': 3, 'c': 4}在这个例子中,original_dict 被 update_dict 中的内容更新了,其中键 'b' 的值被覆盖为 3,并且添加了新的键值对 'c': 4。示例 2: 使用可迭代对象来更新Python12345678910# 定义初始字典original_dict = {'a': 1, 'b': 2}  # 定义要更新的可迭代对象update_iterable = [('b', 5), ('d', 6)]  # 使用 update() 方法更新original_dict.update(update_iterable)  print(original_dict)  # 输出: {'a': 1, 'b': 5, 'd': 6}在这个例子中,original_dict 被 update_iterable 中的内容更新了,其中键 'b' 的值被覆盖为 5,并且添加了新的键值对 'd': 6。示例 3: 使用关键字参数来更新Python1234567# 定义初始字典original_dict = {'a': 1, 'b': 2}  # 使用 update() 方法和关键字参数更新original_dict.update(c=7, d=8)  print(original_dict)  # 输出: {'a': 1, 'b': 2, 'c': 7, 'd': 8}在这个例子中,original_dict 被关键字参数中的内容更新了,添加了新的键值对 'c': 7 和 'd': 8。
  • [技术干货] python连接sqlite3简单用法完整例子【转载】
    1. 连接到数据库在 Python 中使用 sqlite3.connect() 方法连接到 SQLite 数据库。如果数据库文件不存在,会自动创建。import sqlite3  # 连接到数据库文件(如果不存在则自动创建)conn = sqlite3.connect('example.db')解释:connect('example.db'):创建或打开名为 example.db 的数据库文件。返回的 conn 是数据库连接对象,后续操作都需要通过它进行。2. 创建游标对象通过连接对象创建游标(Cursor),用于执行 SQL 语句。1cursor = conn.cursor()解释:游标对象 cursor 用于执行 create table、insert into、select 等 SQL 语句。3. 创建表使用 create table 语句创建表,推荐使用 if not exists 避免重复创建。123456789cursor.execute('''    CREATE TABLE IF NOT EXISTS users (        id INTEGER PRIMARY KEY AUTOINCREMENT,        name TEXT NOT NULL,        age INTEGER,        email TEXT UNIQUE    )''')conn.commit()解释:create table if not exists users:如果表 users 不存在则创建。id integer primary key autoincrement:id 是主键,自动递增。name text not null:name 字段为文本类型且不能为空。email text unique:email 字段必须唯一。conn.commit():提交事务(必须执行,否则表不会被创建)。4. 插入数据使用 insert into 插入数据,推荐使用参数化查询防止 SQL 注入。123456789101112# 单条插入cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)",                ('Alice', 25, 'alice@example.com'))  # 多条插入users_data = [    ('Bob', 30, 'bob@example.com'),    ('Charlie', 35, 'charlie@example.com')]cursor.executemany("INSERT INTO users (name, age, email) VALUES (?, ?, ?)", users_data)  conn.commit()解释:values (?, ?, ?):? 是占位符,Python 会自动替换参数(防止 SQL 注入)。executemany 可一次插入多条数据。conn.commit() 提交事务(插入操作必须提交)。5. 查询数据使用 select 查询数据,结果通过 fetchone() 或 fetchall() 获取。12345678910# 查询所有用户cursor.execute("SELECT * FROM users")rows = cursor.fetchall()for row in rows:    print(row)  # 条件查询cursor.execute("SELECT name, age FROM users WHERE age > ?", (30,))result = cursor.fetchone()print(result)解释:select * from users:查询 users 表的所有字段。fetchall():获取所有查询结果(返回列表)。fetchone():获取单条结果(返回元组)。where age > ?:筛选 age 大于指定值的记录。6. 更新数据使用 update 修改已有数据。12cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, 'Alice'))conn.commit()解释:set age = ?:将 age 字段更新为新值。where name = ?:仅更新 name 为 'Alice' 的记录。conn.commit() 提交事务。7. 删除数据使用 delete from 删除数据。12cursor.execute("DELETE FROM users WHERE name = 'Bob'")conn.commit()解释:delete from users:删除 users 表中的记录。where name = 'Bob':仅删除 name 为 'Bob' 的记录。conn.commit() 提交事务。8. 创建索引(可选)索引可以加速查询,但会降低插入/更新速度。12cursor.execute("CREATE INDEX idx_name ON users (name)")conn.commit()解释:create index idx_name on users (name):为 users 表的 name 字段创建索引。9. 事务处理SQLite 支持事务(begin, commit, rollback),确保操作的原子性。12345678910111213try:    # 开始事务    conn.execute("BEGIN")         # 执行多条操作    cursor.execute("INSERT INTO users (name, age) VALUES (?, ?)", ('David', 28))    cursor.execute("UPDATE users SET age = ? WHERE name = ?", (29, 'David'))         # 提交事务    conn.commit()except Exception as e:    print("事务失败,回滚:", e)    conn.rollback()  # 回滚事务解释:begin:显式开始事务(默认情况下,每条语句都是独立事务)。conn.commit():提交事务(所有操作生效)。conn.rollback():回滚事务(撤销所有未提交的操作)。10. 关闭连接操作完成后,关闭游标和数据库连接。12cursor.close()conn.close()解释:关闭游标和连接释放资源,避免内存泄漏。完整示例代码123456789101112131415161718192021222324252627282930313233343536373839import sqlite3  # 1. 连接数据库conn = sqlite3.connect('example.db')cursor = conn.cursor()  # 2. 创建表cursor.execute('''    CREATE TABLE IF NOT EXISTS users (        id INTEGER PRIMARY KEY AUTOINCREMENT,        name TEXT NOT NULL,        age INTEGER,        email TEXT UNIQUE    )''')conn.commit()  # 3. 插入数据cursor.execute("INSERT INTO users (name, age, email) VALUES (?, ?, ?)",                ('Alice', 25, 'alice@example.com'))conn.commit()  # 4. 查询数据cursor.execute("SELECT * FROM users")rows = cursor.fetchall()for row in rows:    print(row)  # 5. 更新数据cursor.execute("UPDATE users SET age = ? WHERE name = ?", (26, 'Alice'))conn.commit()  # 6. 删除数据cursor.execute("DELETE FROM users WHERE name = 'Alice'")conn.commit()  # 7. 关闭连接cursor.close()conn.close()常见错误与避坑指南忘记提交事务错误:插入/更新/删除后未调用 conn.commit()。修正:每次修改数据后必须调用 conn.commit()。SQL 注入风险错误:直接拼接 SQL 语句(如 f"INSERT INTO users VALUES ({name})")。修正:使用参数化查询(如 VALUES (?, ?))。字段名与保留字冲突错误:使用 order, group 等保留字作为字段名。修正:避免使用保留字,或用引号包裹字段名(如 "order")。未关闭连接错误:程序结束时未关闭 cursor 和 conn。修正:使用 with 上下文管理器自动关闭资源:123with sqlite3.connect('example.db') as conn:    cursor = conn.cursor()    # 执行操作...
  • [技术干货] Python 存根文件(.pyi)简介与实战案例及类型提示的高级指南【转载】
    一、什么是存根文件(.pyi)?存根文件(.pyi) 是Python用于定义接口类型但不包含具体实现的特殊文件。它提供了一种独立于实现的类型定义方式,核心特点:纯接口声明:只包含函数签名、类结构和变量类型注释运行时忽略:Python解释器不会加载执行.pyi文件类型检查器专用:供mypy、pyright等工具执行类型检查三斜杠占位:使用...替代具体实现代码典型应用场景:为C扩展模块添加类型提示对无类型提示的第三方库提供类型支持解耦大型项目的接口定义与实现支持不同Python版本的类型兼容12345# example.pyi - 接口定义def process_data(data: list[dict]) -> pd.DataFrame: ...  # 只有签名没有实现class DatabaseConnection:    timeout: int = 10    def query(self, sql: str) -> list[tuple]: ...二、为什么需要存根文件?2.1 解决类型系统的关键挑战C扩展模块类型化(如NumPy,Pandas核心)无类型库的集成支持(如requests,Django)减少代码冗余(避免实现代码中的重复类型注解)接口版本管理(独立管理接口变更)2.2 性能优化存根文件比普通.py文件:加载速度快10倍以上内存占用降低20-50倍不触发不必要的模块初始化三、存根文件核心语法精要3.1 基础结构规范1234567891011# 模块级变量API_URL: str# 函数定义(无实现体)def fetch_data(url: str, timeout: int = 5) -> bytes: ...# 类定义(方法只有签名)class DataProcessor:    cache_size: int = 100    def __init__(self, config: dict) -> None: ...    @staticmethod    def normalize(input: str) -> str: ...    def process(self, data: Iterable) -> list: ...3.2 特殊语法规则必须使用...替代实现体(不能是pass或其他)1234# 正确def calculate(a: int, b: int) -> float: ...# 错误def calculate(a: int, b: int) -> float: pass  # 不合法允许未定义参数名(当参数名不重要时)1def encrypt(input: bytes, *, key: bytes) -> bytes: ...  # 匿名参数支持条件类型定义12345if sys.version_info >= (3, 10):    from typing import ParamSpec    P = ParamSpec('P')else:    P = TypeVar('P')  # 向后兼容四、高级类型技术实践4.1 泛型类型定义1234567891011from typing import TypeVar, GenericT = TypeVar('T')K = TypeVar('K')V = TypeVar('V')class CustomDict(Generic[K, V]):    def __init__(self) -> None: ...    def __getitem__(self, key: K) -> V: ...    def __setitem__(self, key: K, value: V) -> None: ...class TypedList(list, Generic[T]):    def append(self, item: T) -> None: ...    def first(self) -> T: ...4.2 函数重载精确声明123456from typing import overload@overloaddef parse(input: str) -> dict: ...@overloaddef parse(input: bytes, encoding: str = "utf-8") -> dict: ...def parse(input): ...  # 实际实现存在其他文件4.3 类型别名与透明类型123UserId = intEmail = NewType('Email', str)def register_user(name: str, contact: Email | UserId) -> None: ...4.4 元组精确类型123Point2D = tuple[float, float]Point3D = tuple[float, float, float]def midpoint(a: Point2D | Point3D, b: Point2D | Point3D) -> Point2D | Point3D: ...五、典型应用场景实战5.1 为C扩展模块添加类型12# numpy.core.multiarray.pyidef array(obj: object, dtype: DtypeLike | None = None) -> ndarray: ...5.2 无类型第三方库的存根123456# requests.pyiclass Response:    status_code: int    text: str    def json(self) -> Any: ...def get(url: str, params: dict | None = None, **kwargs) -> Response: ...5.3 解耦大型项目接口123456# database/interface.pyiclass AbstractConnection(Protocol):    def execute(self, sql: str, params: tuple = ...) -> Cursor: ...# database/postgres.py - 实际实现class PostgresConnection(AbstractConnection):    def execute(self, sql: str, params: tuple = ()) -> PG_Cursor: ...六、使用工具生成存根6.1 自动生成工具对比工具适用场景优势stubgen (mypy)已有Python项目快速生成初稿pyright完整项目分析类型推断准确monkeytype运行时跟踪基于实际调用生成6.2 使用stubgen生成基础存根12345678# 为整个包生成存根stubgen -p requests -o ./stubs# 目录结构示例stubs/  requests/    __init__.pyi    api.pyi    sessions.pyi6.3 人工精修存根自动生成后需要人工调整:添加缺失类型(工具标注为Any的字段)删除私有成员(下划线开头的方法/属性)完善泛型参数验证重载准确性七、IDE与工具链集成7.1 PyCharm配置指南自动识别存根:1234// .idea/misc.xml<component name="PyStubPackages">  <package name="requests" path="$PROJECT_DIR/stubs/requests" /></component>重载存根缓存:File > Invalidate Caches7.2 VSCode优化配置12345// settings.json{  "python.analysis.stubPath": "typings",  "python.analysis.useLibraryCodeForTypes": false}7.3 类型检查器配置123456# mypy.ini[mypy]strict = truemypy_path = stubs/[report]generated = true  # 包含自动生成存根八、最佳实践原则分离接口与实现:保持.pyi文件独立实现版本匹配:存根文件需与实现版本兼容最小化声明:仅公开必要接口,不包含内部细节一致性原则:命名、格式与实际代码保持一致8.1 组织规范1234567project/  src/            # 实现代码  stubs/          # 存根目录    numpy/      __init__.pyi  pyproject.toml  mypy.ini8.2 发布到PyPI1234567# 结构示例mypackage-stubs/  package/    __init__.pyi    module1.pyi  py.typed  setup.cfg1234# setup.cfg[metadata]name = mypackage-stubsversion = 1.0.0九、疑难问题解决方案9.1 常见错误处理错误信息解决方案Stub file not found检查路径配置或添加py.typedIncompatible with implementation同步存根与实际代码版本Missing type parameters为泛型类指定参数(如list[str])9.2 调试技巧启用详细日志:1mypy --show-traceback --verbose program.py检查类型传播:1reveal_type(some_variable)  # mypy显示推断类型十、存根文件实战案例10.1 Pandas扩展接口存根1234# custom_pandas.pyiimport pandas as pddef read_bigquery(sql: str, project: str | None) -> pd.DataFrame: ...def to_feather(df: pd.DataFrame, path: PathLike) -> None: ...10.2 Django模型字段扩展12345# fields.pyifrom django.db.models import Fieldclass EncryptedField(Field):    def __init__(self, key: str | bytes, *args, **kwargs) -> None: ...    def deconstruct(self) -> tuple[str, str, list, dict]: ...10.3 FastAPI响应模型123456# responses.pyifrom pydantic import BaseModelclass APIResponse(BaseModel):    success: bool    data: object | None    error: dict | None = None结论Python的存根文件系统是大型专业项目不可或缺的基础设施。通过本文学习,您将掌握:编写符合规范的.pyi文件技巧解决第三方库类型缺失的通用方案提升IDE对项目代码的理解能力构建可维护的接口定义体系存根文件让Python在保持动态语言灵活性的同时,获得了接近静态语言的开发体验和可靠性。
  • [技术干货] python basicConfig()简介及用法举例【转载】
    一、什么是basicConfig?logging.basicConfig() 是 Python logging 模块中最常用的配置函数,用于一次性设置日志系统的基本参数(如日志级别、输出格式、输出位置等)。只需调用一次,后续所有日志输出都会遵循这个配置。二、basicConfig的常用参数参数作用说明示例值level设置日志级别(只显示大于等于该级别的日志)logging.INFO, logging.DEBUGfilename指定日志输出到的文件名(不指定则输出到控制台)‘app.log’filemode文件写入模式,默认为 ‘a’(追加),可设为 ‘w’(覆盖)‘w’format日志输出格式字符串‘%(asctime)s - %(levelname)s - %(message)s’datefmt时间格式字符串‘%Y-%m-%d %H:%M:%S’encoding文件编码(仅当指定 filename 时有效)‘utf-8’三、默认行为如果不调用 basicConfig(),日志系统有默认配置:日志级别为 WARNING,只显示 WARNING 及以上级别的日志。日志输出到控制台。日志格式为:LEVEL:logger_name:message,如:WARNING:root:demo如果调用 basicConfig() 但不传参数,效果与默认配置一致。四、你的代码详解示例1123import logging# logging.basicConfig()logging.warning('demo')这里没有调用 basicConfig(),直接输出一条警告日志。输出结果:WARNING:root:demo只会显示 WARNING 及以上级别的日志。示例2123import logginglogging.basicConfig()  # 日志格式:格式字符logging.warning('demo')这里调用了 basicConfig(),但没有传参数,效果与默认配置一致。输出结果同上:WARNING:root:demo五、常见用法举例1. 设置日志级别123logging.basicConfig(level=logging.INFO)logging.debug('调试信息')   # 不会显示logging.info('普通信息')   # 会显示2. 设置日志格式12345logging.basicConfig(    level=logging.DEBUG,    format='%(asctime)s - %(levelname)s - %(message)s')logging.info('日志格式演示')输出示例:2024-06-08 12:00:00,123 - INFO - 日志格式演示3. 日志写入文件1234567logging.basicConfig(    filename='myapp.log',    level=logging.ERROR,    format='%(asctime)s - %(levelname)s - %(message)s',    encoding='utf-8')logging.error('写入文件的错误日志')六、常用格式化符号占位符说明%(asctime)s日志时间%(levelname)s日志级别%(message)s日志内容%(filename)s文件名%(lineno)d行号%(name)s日志器名称%(thread)d线程ID七、总结basicConfig() 用于一次性设置日志系统的基本参数。不传参数时,效果与默认配置一致:只显示 WARNING 及以上日志,输出到控制台,格式为 LEVEL:root:message。推荐根据实际需求设置日志级别、格式和输出位置。
  • [技术干货] 使用Python创建PowerPoint各种图表的详细教程【转载】
    为什么使用 Python 创建 PowerPoint 图表使用代码生成 PowerPoint 图表有以下优势:自动化:支持定期自动生成图表,减少重复手动操作。动态数据:可基于实时或定期更新的数据源(如数据库或 Excel)动态生成图表。无需图形界面:无需安装 Microsoft Office,也能创建和编辑演示文稿。批量处理:通过简单代码一次性批量生成多个图表或完整演示文稿。使用工具要在PowerPoint中生成图表,需要使用合适的PowerPoint文档处理库。本文所使用的是Spire.Presentation库。该库支持创建、编辑和转换 PowerPoint 文件,兼容 .ppt 和 .pptx 格式,且不依赖于本地安装的 Microsoft PowerPoint 软件。安装方法在项目终端中执行以下命令,安装 Spire.Presentation 库:1pip install spire.presentation安装完成后,即可在 Python 脚本中导入 spire.presentation,开始创建和操作 PowerPoint图表。使用 Python 在 PowerPoint 中创建各类图表Spire.Presentation 支持多种图表类型,包括以下各种常见的类型:柱状图(Column Chart)条形图(Bar Chart)饼图(Pie Chart)环形图(Doughnut Chart)折线图(Line Chart)面积图(Area Chart)散点图(Scatter Chart)股票图(Stock Chart)气泡图(Bubble Chart)雷达图(Radar Chart)漏斗图(Funnel Chart)瀑布图(Waterfall Chart)箱线图(Box and Whisker Chart)直方图(Histogram Chart)帕累托图(Pareto Chart)矩阵树图(TreeMap Chart)旭日图(SunBurst Chart)地图图表(Map Chart)使用 Python 在 PowerPoint 中创建图表的实现步骤创建 Presentation 对象获取目标幻灯片使用 AppendChart() 方法插入所需类型的图表填充图表数据设置图表样式(颜色、图例、标题等)保存演示文稿柱状图柱状图通过垂直柱形来展示各类别的数据大小,是对比不同分类或时间段数据的理想选择。常用于展示季度销售、年度增长、产品对比等。以下代码展示了如何使用Python在PowerPoint中生成柱状图:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364from spire.presentation import *  # 创建演示文稿对象presentation = Presentation() # 获取第一张幻灯片slide = presentation.Slides[0] # 添加簇状柱状图,设置图表的位置和尺寸chart = slide.Shapes.AppendChart(ChartType.ColumnClustered, RectangleF.FromLTRB(100, 80, 620, 440)) # 设置系列标签(季度)chart.ChartData[0, 1].Text = "第一季度"chart.ChartData[0, 2].Text = "第二季度"chart.ChartData[0, 3].Text = "第三季度" # 设置分类标签(地区)chart.ChartData[1, 0].Text = "北美"chart.ChartData[2, 0].Text = "欧洲"chart.ChartData[3, 0].Text = "亚洲"chart.ChartData[4, 0].Text = "南美" # 定义三个系列的销售数据(每列代表一个季度,每行为不同地区的销售额)series_data = {    "系列1": [20000, 22000, 18000, 30000],    "系列2": [15000, 26000, 20000, 26000],    "系列3": [17000, 24000, 22000, 28000]} # 向图表中填充数据for i, (key, values) in enumerate(series_data.items()):    for j, val in enumerate(values):        chart.ChartData[j + 1, i + 1].NumberValue = val # 设置系列标签(即图例中显示的系列名称,B1 至 D1 区域)chart.Series.SeriesLabel = chart.ChartData["B1", "D1"] # 设置分类轴标签(即横轴显示的地区名称,A2 至 A5 区域)chart.Categories.CategoryLabels = chart.ChartData["A2", "A5"] # 分别设置每个系列对应的数值区域chart.Series[0].Values = chart.ChartData["B2", "B5"]chart.Series[1].Values = chart.ChartData["C2", "C5"]chart.Series[2].Values = chart.ChartData["D2", "D5"] # 设置柱状图中柱形之间的间距和重叠程度chart.GapWidth = 219# 负值表示柱子之间有间隙,不重叠        chart.OverLap = -27         # 设置图例位置为底部chart.ChartLegend.Position = ChartLegendPositionType.Bottom # 设置图表标题chart.HasTitle = Truechart.ChartTitle.TextProperties.Text = "季度销售表现"chart.ChartTitle.TextProperties.IsCentered = Truechart.ChartTitle.TextProperties.Paragraphs[0].DefaultCharacterProperties.IsBold = TriState.TFalsechart.ChartTitle.Height = 25 # 保存为PPTX文件并释放资源presentation.SaveToFile("柱状图.pptx", FileFormat.Pptx2016)presentation.Dispose()条形图条形图的结构类似于柱状图,但数据以水平条形呈现,更适合类目名称较长的场景。条形图常用于横向对比,如各地区人口、部门预算等。以下代码展示了如何使用Python在PowerPoint中生成条形图:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455from spire.presentation import * # 创建演示文稿对象presentation = Presentation() # 获取第一张幻灯片slide = presentation.Slides[0] # 向幻灯片中添加一个簇状条形图chart = slide.Shapes.AppendChart(ChartType.BarClustered, RectangleF.FromLTRB(100, 80, 620, 440)) # 定义类别名称(水果名称)和每年的数据categories = ["苹果", "香蕉", "樱桃", "椰枣"]series_data = {    "2019年": [500, 700, 600, 400],    "2020年": [600, 800, 700, 450]} # 设置图表的类别标签(位于第一列)for i, cat in enumerate(categories, start=1):    chart.ChartData[i, 0].Text = cat # 设置图表的系列名称(位于第一行)for i, series_name in enumerate(series_data.keys(), start=1):    chart.ChartData[0, i].Text = series_name # 填充图表数据区域的值for col_idx, values in enumerate(series_data.values(), start=1):    for row_idx, val in enumerate(values, start=1):        chart.ChartData[row_idx, col_idx].NumberValue = val # 设置系列标签区域(B1 到 C1)chart.Series.SeriesLabel = chart.ChartData["B1", "C1"] # 设置类别标签区域(A1 到 A4)chart.Categories.CategoryLabels = chart.ChartData["A1", "A4"] # 设置每个系列对应的数据区域(数值区域)chart.Series[0].Values = chart.ChartData["B2", "B5"]chart.Series[1].Values = chart.ChartData["C2", "C5"] # 定义每个系列的填充颜色fill_colors = [    Color.FromRgb(91, 155, 213),   # 系列 1(蓝色)    Color.FromRgb(237, 125, 49),   # 系列 2(橙色)] # 设置系列填充样式为纯色,并应用定义的颜色for index, color in enumerate(fill_colors):    chart.Series[index].Fill.FillType = FillFormatType.Solid    chart.Series[index].Fill.SolidColor.Color = color # 保存演示文稿到文件presentation.SaveToFile("条形图.pptx", FileFormat.Pptx2010)presentation.Dispose()饼图饼图用于表示整体中各部分的比例关系,通过扇形展示各数据项所占的百分比。适用于展示市场份额、预算分配等组成结构。以下代码展示了如何使用Python在PowerPoint中生成饼图:123456789101112131415161718192021222324252627282930313233from spire.presentation import * # 创建 Presentation 对象并获取第一张幻灯片presentation = Presentation()slide = presentation.Slides[0] # 向幻灯片中添加一个饼图,指定图表类型和位置大小chart = slide.Shapes.AppendChart(ChartType.Pie, RectangleF.FromLTRB(150, 150, 450, 450)) # 定义图表的分类和对应的数值categories = ["Chrome", "Firefox", "Edge", "Safari"]values = [58.9, 13.3, 12.7, 9.6] # 填充图表数据区域:# A1:A4 单元格用于表示分类(浏览器名称)# B1:B4 单元格用于表示对应的市场份额数值for i in range(len(categories)):    chart.ChartData[i + 1, 0].Text = categories[i]    chart.ChartData[i + 1, 1].NumberValue = values[i] # 设置分类标签范围为 A2:A5,数据值范围为 B2:B5chart.Categories.CategoryLabels = chart.ChartData["A2", "A5"]chart.Series[0].Values = chart.ChartData["B2", "B5"] # 设置图表标题内容、居中样式和标题高度chart.HasTitle = Truechart.ChartTitle.TextProperties.Text = "浏览器市场份额"chart.ChartTitle.TextProperties.IsCentered = Truechart.ChartTitle.Height = 25 # 保存为 PowerPoint 文件并释放资源presentation.SaveToFile("饼图.pptx", FileFormat.Pptx2010)presentation.Dispose()折线图折线图通过连接各数据点的线段,展示数据随时间的变化趋势。适合用于时间序列数据,如年度营收变化、网站流量趋势等。以下代码展示了如何使用Python在PowerPoint中生成折线图:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950from spire.presentation import * # 创建 Presentation 对象并获取第一张幻灯片presentation = Presentation()slide = presentation.Slides[0] # 向幻灯片中添加一个折线图,指定图表在幻灯片中的位置和大小chart = slide.Shapes.AppendChart(ChartType.Line, RectangleF.FromLTRB(100, 80, 620, 440)) # 定义图表的类别categories = ["一月", "二月", "三月", "四月"] # 定义两个系列的数据,表示两个产品在不同月份的销量series_data = {    "产品 A": [150, 200, 180, 220],    "产品 B": [120, 140, 160, 180]} # 设置图表的类别标签for i, cat in enumerate(categories, start=1):    chart.ChartData[i, 0].Text = cat # 设置系列名称for i, name in enumerate(series_data.keys(), start=1):    chart.ChartData[0, i].Text = name # 填充系列数据for col_idx, values in enumerate(series_data.values(), start=1):    for row_idx, val in enumerate(values, start=1):        chart.ChartData[row_idx, col_idx].NumberValue = val # 指定系列标签的范围(B1 到 C1)chart.Series.SeriesLabel = chart.ChartData["B1", "C1"] # 指定类别标签的范围(A2 到 A5)chart.Categories.CategoryLabels = chart.ChartData["A2", "A5"] # 为每个系列分别设置数据范围(B2:B5 和 C2:C5)chart.Series[0].Values = chart.ChartData["B2", "B5"]chart.Series[1].Values = chart.ChartData["C2", "C5"] # 添加图表标题chart.HasTitle = Truechart.ChartTitle.TextProperties.Text = "各产品月度销售趋势"chart.ChartTitle.TextProperties.IsCentered = Truechart.ChartTitle.Height = 25 # 保存为 PowerPoint 文件并释放资源presentation.SaveToFile("折线图.pptx", FileFormat.Pptx2010)presentation.Dispose()漏斗图漏斗图用于表示某一流程的逐步转化情况,例如销售漏斗、用户转化路径等。它能清晰展现各阶段的数量递减关系,帮助识别流程中流失严重的环节。以下代码展示了如何使用Python在PowerPoint中生成漏斗图:12345678910111213141516171819202122232425262728293031from spire.presentation import * # 创建 Presentation 对象并获取第一张幻灯片presentation = Presentation()slide = presentation.Slides[0] # 向幻灯片添加一个漏斗图,设置图表在页面中的位置和大小chart = slide.Shapes.AppendChart(ChartType.Funnel, RectangleF.FromLTRB(100, 100, 600, 400)) # 定义漏斗各阶段的名称和对应的数值stages = ["潜在客户", "销售机会", "报价方案", "成交客户"]values = [1000, 600, 300, 120] # 填充图表数据区域for i in range(len(stages)):    chart.ChartData[i + 1, 0].Text = stages[i]    chart.ChartData[i + 1, 1].NumberValue = values[i] # 设置图表的分类标签和系列值chart.Categories.CategoryLabels = chart.ChartData["A2", "A5"]chart.Series[0].Values = chart.ChartData["B2", "B5"] # 添加图表标题并设置样式chart.HasTitle = Truechart.ChartTitle.TextProperties.Text = "销售漏斗阶段"chart.ChartTitle.TextProperties.IsCentered = Truechart.ChartTitle.Height = 25 # 保存演示文稿并释放资源presentation.SaveToFile("漏斗图.pptx", FileFormat.Pptx2010)presentation.Dispose()瀑布图瀑布图展示数值的累计过程,适用于拆解整体变化的构成因素。常用于财务数据分析,如利润构成、成本变化等,能直观反映每一步对最终结果的影响。以下代码展示了如何使用Python在PowerPoint中生成瀑布图:123456789101112131415161718192021222324252627282930313233from spire.presentation import * # 创建 Presentation 对象并获取第一张幻灯片presentation = Presentation()slide = presentation.Slides[0] # 在幻灯片中添加瀑布图,设置图表在幻灯片中的位置和大小chart = slide.Shapes.AppendChart(ChartType.WaterFall, RectangleF.FromLTRB(100, 100, 600, 400)) # 定义各阶段名称和对应的数值categories = ["起始", "收入", "成本", "利润"]values = [0, 8000, -3000, 5000] # 向图表中填充数据for i in range(len(categories)):    chart.ChartData[i + 1, 0].Text = categories[i]    chart.ChartData[i + 1, 1].NumberValue = values[i] # 设置类别标签范围chart.Categories.CategoryLabels = chart.ChartData["A2", "A5"] # 设置系列对应的数值范围chart.Series[0].Values = chart.ChartData["B2", "B5"] # 设置图表标题chart.HasTitle = Truechart.ChartTitle.TextProperties.Text = "利润构成分析"chart.ChartTitle.TextProperties.IsCentered = Truechart.ChartTitle.Height = 25 # 保存演示文稿并释放资源presentation.SaveToFile("瀑布图.pptx", FileFormat.Pptx2010)presentation.Dispose()使用 Python 和 Excel 数据生成 PowerPoint 图表通过将 Excel 中的数据导入 PowerPoint 来生成图表,可以实现数据与演示内容的自动同步更新,避免手动复制粘贴的繁琐和错误,确保演示文稿中的信息始终反映最新的业务数据。这种方法特别适用于需要定期汇报销售、财务、市场等数据的场景,大幅提升数据处理效率和报告的专业度。第一步:使用 pandas 读取 Excel 数据pandas 是 Python 中强大的数据处理库,可以方便地读取和操作 Excel 文件。首先确保安装 pandas 库:1pip install pandas安装完成后,利用 pandas 将 Excel 中指定工作表的数据加载到 DataFrame 结构中,这样就可以方便地访问和操作表格内容。1234import pandas as pd # 读取 Excel 文件中名为 'Sheet1' 的工作表df = pd.read_excel('销售数据.xlsx', sheet_name='Sheet1')DataFrame 是一个二维表格结构,类似于 Excel 的工作表,便于进行后续的数据筛选、计算与传递。第二步:创建 PowerPoint 图表并填充 Excel 数据借助 Spire.Presentation 库,可以在 PowerPoint 幻灯片中动态创建图表,并将刚刚读取的 Excel 数据填充进去,实现图表的自动生成。12345678910111213141516171819202122232425262728293031323334353637383940414243444546from spire.presentation import * # 创建演示文稿对象并获取第一张幻灯片presentation = Presentation()slide = presentation.Slides[0] # 向幻灯片中添加一个簇状柱形图chart = slide.Shapes.AppendChart(ChartType.ColumnClustered, RectangleF.FromLTRB(100, 80, 620, 440)) # 设置系列名称quarters = df.columns[1:].tolist() for i, quarter in enumerate(quarters, start=1):    chart.ChartData[0, i].Text = quarter # 设置分类标签regions = df[df.columns[0]].tolist()  for i, region in enumerate(regions, start=1):    chart.ChartData[i, 0].Text = region # 填充图表数据for i in range(len(regions)):    for j in range(len(quarters)):        chart.ChartData[i + 1, j + 1].NumberValue = df.iloc[i, j + 1] # 设置系列名称的单元格范围(B1 到 D1)chart.Series.SeriesLabel = chart.ChartData["B1", "D1"] # 设置分类标签的单元格范围(A2 到 A4)chart.Categories.CategoryLabels = chart.ChartData["A2", f"A{len(regions)+1}"] # 设置每个系列的数值区域(B2:B4、C2:C4、D2:D4)for i in range(len(quarters)):    col_letter = chr(66 + i)  # B、C、D...    start_cell = f"{col_letter}2"    end_cell = f"{col_letter}{len(regions)+1}"    chart.Series[i].Values = chart.ChartData[start_cell, end_cell] # 设置图表标题chart.HasTitle = Truechart.ChartTitle.TextProperties.Text = "各地区季度销售额"chart.ChartTitle.TextProperties.IsCentered = Truechart.ChartTitle.Height = 25 # 保存演示文稿presentation.SaveToFile("各地区季度销售图.pptx", FileFormat.Pptx2010)presentation.Dispose()
  • [技术干货] 基于Python编写新手向的简易翻译工具 【转载】
    对于刚接触编程的新手来说,编写一个实用的工具是快速入门的好方法。本文将详细介绍如何用 Python 编写一个简易的翻译工具,帮助理解基础编程概念和实际应用。无需任何编程基础,只需按照步骤操作即可完成。我们将使用 Python 3.x 版本,通过调用免费的百度翻译 API 来实现这个翻译工具。整个项目分为以下几个步骤:1.环境准备安装 Python 3.x(建议安装最新稳定版)安装必要的库:requests(用于发送HTTP请求)注册百度翻译开放平台账号获取API密钥2.核心功能实现构建基本的HTTP请求功能处理API返回的JSON数据实现中英互译功能3.用户交互设计创建简单的命令行界面添加错误处理机制实现翻译历史记录功能这个项目特别适合编程新手,因为它涵盖了多个基础知识点:变量和数据类型的使用函数定义和调用网络请求处理JSON数据解析基本的异常处理通过完成这个项目,学习者不仅能掌握Python的基本语法,还能了解如何将代码应用到实际场景中,为后续学习更复杂的项目打下基础。理解翻译工具的基本原理翻译工具的核心功能是将一种语言的文字内容准确转换为另一种语言,同时尽可能保持原文的语义和风格。现代主流翻译工具(如Google翻译、DeepL、百度翻译等)通常依赖以下核心技术:1.基于神经网络的机器翻译(NMT)模型采用Transformer等深度学习架构通过海量平行语料训练能够捕捉语言间的复杂映射关系在实际开发中,我们可以通过调用现成的翻译API来快速实现翻译功能,避免从零开始训练模型。常见的选择包括:2.免费API方案:Google Cloud Translation API(每月50万字符免费额度)百度翻译开放平台API(免费基础版)微软Azure Translator(免费层)Python实现时需要的主要库:requests库:用于发送HTTP请求到翻译API端点支持GET/POST方法可设置请求头、参数等json库:用于处理API返回的JSON格式数据解析响应内容提取翻译结果这两个库都是Python标准库,在Python 3.x中默认包含,无需额外安装。基本调用流程如下:注册API服务获取密钥构造包含待翻译文本的请求发送请求到API端点解析返回的JSON响应提取并显示翻译结果示例代码结构:1234567891011121314151617181920import requestsimport json def translate_text(text, source_lang, target_lang):    # API端点配置    url = "https://translation-api.example.com/translate"    headers = {"Content-Type": "application/json"}    params = {        "key": "YOUR_API_KEY",        "source": source_lang,        "target": target_lang,        "q": text    }         # 发送请求    response = requests.post(url, headers=headers, json=params)    result = json.loads(response.text)         # 返回翻译结果    return result["translatedText"]准备工作在开始编写代码之前,需要注册一个翻译 API 的服务。这里以百度翻译 API 为例,因其提供免费的额度供开发者测试。注册百度开发者账号:访问百度翻译开放平台,注册账号并创建应用。获取 APP ID 和 密钥,这两个参数将用于 API 请求的验证。安装必要的 Python 库:确保 Python 环境已安装(推荐 Python 3.6+),并安装 requests 库(如果尚未安装):1pip install requests编写翻译工具的核心代码翻译工具的核心分为三部分:输入处理、API 请求和结果输出。以下是逐步实现的代码解析。输入处理用户需要通过命令行输入待翻译的文字和目标语言。Python 的 input() 函数用于获取用户输入。12text = input("请输入要翻译的文字:")to_lang = input("请输入目标语言(如 en、zh):")API 请求百度翻译 API 需要发送 POST 请求,包含待翻译文字、目标语言和验证参数。以下是构建请求的代码:123456789101112131415161718192021import requestsimport randomimport hashlib appid = "你的APP_ID"  # 替换为你的百度APP IDsecret_key = "你的密钥"  # 替换为你的百度密钥url = "https://fanyi-api.baidu.com/api/trans/vip/translate" def translate(text, to_lang):    salt = str(random.randint(32768, 65536))    sign = hashlib.md5((appid + text + salt + secret_key).encode()).hexdigest()    params = {        "q": text,        "from": "auto",        "to": to_lang,        "appid": appid,        "salt": salt,        "sign": sign    }    response = requests.post(url, params=params)    return response.json()结果输出API 返回的数据是 JSON 格式,包含翻译结果和原始文本。解析并输出结果:12345result = translate(text, to_lang)if "trans_result" in result:    print("翻译结果:", result["trans_result"][0]["dst"])else:    print("翻译失败:", result)代码整合将以上部分整合为一个完整的脚本,并添加错误处理和用户交互:12345678910111213141516171819202122232425262728293031323334353637import requestsimport randomimport hashlib appid = "你的APP_ID"  # 替换为你的百度APP IDsecret_key = "你的密钥"  # 替换为你的百度密钥url = "https://fanyi-api.baidu.com/api/trans/vip/translate" def translate(text, to_lang):    salt = str(random.randint(32768, 65536))    sign = hashlib.md5((appid + text + salt + secret_key).encode()).hexdigest()    params = {        "q": text,        "from": "auto",        "to": to_lang,        "appid": appid,        "salt": salt,        "sign": sign    }    response = requests.post(url, params=params)    return response.json() def main():    print("=== 简易翻译工具 ===")    while True:        text = input("请输入要翻译的文字(输入 q 退出):")        if text == "q":            break        to_lang = input("请输入目标语言(如 en、zh):")        result = translate(text, to_lang)        if "trans_result" in result:            print("翻译结果:", result["trans_result"][0]["dst"])        else:            print("翻译失败:", result) if __name__ == "__main__":    main()代码解析与扩展1.API 密钥的安全性在实际项目中,不建议将 API 密钥直接写在代码中。可以通过环境变量或配置文件存储密钥。2.多语言支持百度翻译支持多种语言,目标语言参数如 en(英语)、zh(中文)、jp(日语)等。可以通过列表让用户选择语言。3.错误处理网络请求可能失败,添加 try-except 块捕获异常:12345try:    response = requests.post(url, params=params)    return response.json()except Exception as e:    return {"error": str(e)}完整源码以下是完整的代码,包含注释和扩展功能:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748import requestsimport randomimport hashlib # 百度翻译API配置appid = "你的APP_ID"  # 替换为你的百度APP IDsecret_key = "你的密钥"  # 替换为你的百度密钥url = "https://fanyi-api.baidu.com/api/trans/vip/translate" def translate(text, to_lang):    """    调用百度翻译API进行翻译    :param text: 待翻译的文字    :param to_lang: 目标语言代码    :return: 翻译结果的JSON数据    """    salt = str(random.randint(32768, 65536))    sign = hashlib.md5((appid + text + salt + secret_key).encode()).hexdigest()    params = {        "q": text,        "from": "auto",        "to": to_lang,        "appid": appid,        "salt": salt,        "sign": sign    }    try:        response = requests.post(url, params=params)        return response.json()    except Exception as e:        return {"error": str(e)} def main():    print("=== 简易翻译工具 ===")    print("支持的语言代码:en(英语), zh(中文), jp(日语)等")    while True:        text = input("请输入要翻译的文字(输入 q 退出):")        if text == "q":            break        to_lang = input("请输入目标语言代码:")        result = translate(text, to_lang)        if "trans_result" in result:            print("翻译结果:", result["trans_result"][0]["dst"])        else:            print("翻译失败:", result) if __name__ == "__main__":    main()总结通过这个简易翻译工具,可以学习以下 Python 基础知识:用户输入与输出网络请求(requests 库)数据格式处理(JSON)函数封装与代码组织尝试扩展功能,如添加图形界面(Tkinter)或保存翻译历史,进一步提升编程能力。
  • [技术干货] python json.dump 乱码问题
    在使用 json.dumps() 时出现中文乱码,通常是因为默认情况下 json.dumps() 会将非 ASCII 字符(如中文)转义为 Unicode 编码(如 \u4e2d\u6587)。以下是几种解决方法:方法 1:设置 ensure_ascii=Falseimport json payload = {"name": "中文", "value": 123} json_str = json.dumps(payload, ensure_ascii=False) print(json_str) # 输出: {"name": "中文", "value": 123} 作用:禁用 ASCII 转义,直接输出中文字符。注意:确保你的输出环境(如终端、文件)支持 UTF-8 编码。方法 2:指定文件编码(写入文件时)如果将 JSON 写入文件,需指定文件编码为 utf-8:with open("data.json", "w", encoding="utf-8") as f: json.dump(payload, f, ensure_ascii=False, indent=4) 方法 3:处理已转义的字符串如果已经生成了包含 \uXXXX 的字符串,可以通过以下方式还原中文:json_str = '{"name": "\\u4e2d\\u6587"}' parsed_dict = json.loads(json_str) # 先解析为字典 json_str_readable = json.dumps(parsed_dict, ensure_ascii=False) # 重新生成可读字符串 print(json_str_readable) # 输出: {"name": "中文"} 方法 4:检查环境编码确保你的 Python 脚本文件、终端或 IDE 的编码为 UTF-8:在脚本开头添加编码声明(Python 2 需要,Python 3 默认 UTF-8):# -*- coding: utf-8 -*- 常见问题排查终端显示乱码:确认终端支持 UTF-8(如 Windows 的 CMD 需要 chcp 65001)。文件打开乱码:用支持 UTF-8 的编辑器(如 VS Code、Notepad++)打开文件。HTTP 接口返回乱码:确保响应头包含 Content-Type: application/json; charset=utf-8。总结推荐方案:始终使用 ensure_ascii=False 并确保环境编码为 UTF-8。写入文件:加上 encoding="utf-8" 参数。这样可以彻底解决 JSON 中的中文乱码问题。
  • [互动交流] 【问题咨询:如何在鸿蒙系统的笔记本上安装python包】鸿蒙操作系统笔记本 使用 code art ide 时,安装python包时报错,无法自动识别pip,使用python -m pip install --user 安装时报错
    鸿蒙操作系统笔记本 使用 code art ide 时,安装python包时报错,无法自动识别pip,使用python -m pip install --user 安装时报错.1.在hishell 无法识别python  2.在code art ide 的终端可以识别python 但无法识别pip 3.使用  python -m pip install --user numpy 报错   
  • [课程学习] 本地部署DeepSeek构建本地知识库实操指导
    本地部署DeepSeek构建本地知识库实操指导  中3.2RAG向量数据库构建,进入到目录后在终端复制以下命令下载相应环境包:pip install -r requirements.txt。这条指令老是失败,找不到原因。我是新人小白,想自学一些AI方面的技能,结果第一堂课就把我难住了,现在寝食难安,求哪位老铁指导一下。跪谢!
总条数:2474 到第 页
上滑加载中