热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
该提示词可智能识别输入的功能目标与代码片段,自动补全并生成完整、可运行的代码方案。支持多语言、多场景开发任务,适用于快速原型搭建与复杂功能实现,有效减少调试与开发时间。
import csv import json import argparse import logging import sys from typing import List, Dict, Any, Tuple
def load_csv(path: str) -> List[Dict[str, str]]: """ 打开并读取CSV文件,跳过空行,返回每一行为dict(列名->字符串值)。 自动处理可能存在的BOM并清理列名中的BOM。 """ rows: List[Dict[str, str]] = [] try: # 首先尝试以utf-8读取,如遇到BOM等问题再降级到utf-8-sig try: f = open(path, mode="r", newline="", encoding="utf-8") except UnicodeDecodeError: f = open(path, mode="r", newline="", encoding="utf-8-sig")
with f:
reader = csv.DictReader(f)
# 可能存在BOM,清理字段名
if reader.fieldnames:
fieldnames = [fn.lstrip("\ufeff") if isinstance(fn, str) else fn for fn in reader.fieldnames]
else:
fieldnames = None
for raw_row in reader:
# 清理每个键的BOM
cleaned_row = {}
for k, v in raw_row.items():
cleaned_key = k.lstrip("\ufeff") if isinstance(k, str) else k
cleaned_row[cleaned_key] = v
# 跳过空行(所有值为空或仅空白)
if all((val is None) or (str(val).strip() == "") for val in cleaned_row.values()):
continue
rows.append(cleaned_row)
except FileNotFoundError:
logging.error(f"输入文件不存在: {path}")
raise
except Exception as e:
logging.error(f"读取CSV时发生错误: {e}")
raise
logging.info(f"已读取行数: {len(rows)}")
return rows
def to_float(s: str) -> Tuple[bool, float]: """ 尝试将字符串解析为float。 支持去除千分位逗号与下划线,忽略空值和非数字。 返回 (是否解析成功, 值或0.0) """ if s is None: return False, 0.0 txt = str(s).strip() if txt == "" or txt.lower() in {"nan", "none"}: return False, 0.0 # 处理千分位和下划线分隔 txt = txt.replace(",", "").replace("", "") # 处理可能的括号负数表示 (123) -> -123 if txt.startswith("(") and txt.endswith(")"): txt = "-" + txt[1:-1] try: return True, float(txt) except ValueError: return False, 0.0
def _median(sorted_vals: List[float]) -> float: """ 计算已排序列表的中位数。 """ n = len(sorted_vals) if n == 0: return float("nan") mid = n // 2 if n % 2 == 1: return sorted_vals[mid] else: return (sorted_vals[mid - 1] + sorted_vals[mid]) / 2.0
def _iqr_bounds(sorted_vals: List[float]) -> Tuple[float, float]: """ 使用IQR法计算异常值边界。 Q1/Q3基于“中位数拆分”方法: - 奇数长度:排除中位数后两侧分别计算中位数作为Q1/Q3 - 偶数长度:直接按两半计算各自中位数作为Q1/Q3 返回 (下界, 上界)。 当样本过小(<4)或IQR为0时,返回(-inf, +inf)表示不进行过滤。 """ n = len(sorted_vals) if n < 4: return float("-inf"), float("inf") mid = n // 2 if n % 2 == 1: lower = sorted_vals[:mid] upper = sorted_vals[mid + 1 :] else: lower = sorted_vals[:mid] upper = sorted_vals[mid:]
q1 = _median(lower)
q3 = _median(upper)
iqr = q3 - q1
if iqr <= 0:
return float("-inf"), float("inf")
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
return lower_bound, upper_bound
def compute_stats(rows: List[Dict[str, str]], numeric_field: str) -> Dict[str, Any]: """ 根据指定的numeric_field计算统计信息(计数、均值、 中位数)。 - 仅提取可解析为数字的值 - 使用IQR方法过滤异常值 - 同时返回原始与过滤后的统计结果 """ # 提取数字 numeric_vals: List[float] = [] invalid_count = 0 for r in rows: if numeric_field not in r: invalid_count += 1 # 当某行缺少该字段时视为无效 continue ok, val = _to_float(r.get(numeric_field)) if ok: numeric_vals.append(val) else: invalid_count += 1
total_rows = len(rows)
count_numeric = len(numeric_vals)
if count_numeric == 0:
logging.warning("没有可用的数字数据用于统计。")
return {
"field": numeric_field,
"count_total_rows": total_rows,
"count_numeric": 0,
"count_invalid": invalid_count,
"outlier_method": "IQR",
"outlier_bounds": None,
"count_outliers": 0,
"mean": None,
"median": None,
"mean_raw": None,
"median_raw": None,
}
# 排序用于统计与IQR计算
sorted_vals = sorted(numeric_vals)
# 原始统计
mean_raw = sum(sorted_vals) / count_numeric
median_raw = _median(sorted_vals)
# IQR异常值过滤
lb, ub = _iqr_bounds(sorted_vals)
filtered_vals = [v for v in sorted_vals if lb <= v <= ub]
count_outliers = count_numeric - len(filtered_vals)
# 过滤后的统计
if len(filtered_vals) == 0:
# 若过滤后为空,则回退到原始统计以避免None
mean_filtered = mean_raw
median_filtered = median_raw
else:
mean_filtered = sum(filtered_vals) / len(filtered_vals)
median_filtered = _median(filtered_vals)
logging.info(
f"数值条目: {count_numeric}, 无效条目: {invalid_count}, "
f"异常值剔除: {count_outliers} (方法: IQR)"
)
return {
"field": numeric_field,
"count_total_rows": total_rows,
"count_numeric": count_numeric,
"count_invalid": invalid_count,
"outlier_method": "IQR",
"outlier_bounds": {"lower": lb, "upper": ub} if lb != float("-inf") else None,
"count_outliers": count_outliers,
"mean": mean_filtered,
"median": median_filtered,
"mean_raw": mean_raw,
"median_raw": median_raw,
}
def main(): parser = argparse.ArgumentParser(description="CSV metrics calculator") parser.add_argument("-i", "--input", required=True, help="Path to CSV file") parser.add_argument("-f", "--field", required=True, help="Numeric column name") parser.add_argument("-o", "--output", default="", help="Optional output JSON path") # 解析参数 args = parser.parse_args()
# 简要日志配置
logging.basicConfig(
level=logging.INFO,
format="%(levelname)s: %(message)s",
stream=sys.stderr,
)
# 读取CSV
try:
rows = load_csv(args.input)
except FileNotFoundError:
# 文件不存在
sys.exit(1)
except Exception:
# 其他读取错误
sys.exit(1)
# 字段校验:至少有一行包含该字段
if not rows or all(args.field not in r for r in rows):
logging.error(f"指定的列名不存在: {args.field}")
sys.exit(2)
# 计算统计
try:
stats = compute_stats(rows, args.field)
except Exception as e:
logging.error(f"计算统计信息失败: {e}")
sys.exit(4)
# 若没有数值数据
if stats.get("count_numeric", 0) == 0:
logging.error("没有可统计的数值数据。")
# 也输出一个空结果,以便调用方获知情况
result = {"file": args.input, **stats}
print(json.dumps(result, ensure_ascii=False, indent=2))
sys.exit(3)
# 组装输出JSON
result = {
"file": args.input,
**stats,
}
# 输出到文件或stdout
try:
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
json.dump(result, f, ensure_ascii=False, indent=2)
logging.info(f"结果已写入: {args.output}")
else:
print(json.dumps(result, ensure_ascii=False, indent=2))
except Exception as e:
logging.error(f"写入输出失败: {e}")
sys.exit(4)
# 正常退出
sys.exit(0)
if name == "main": main()
const express = require('express'); const app = express(); app.use(express.json());
app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,PATCH,DELETE,OPTIONS'); res.header('Access-Control-Allow-Headers', 'Content-Type,Authorization'); if (req.method === 'OPTIONS') return res.sendStatus(204); next(); });
const items = [ { id: 1, name: 'Apple iPhone 15', tags: ['phone', 'apple', 'ios'] }, { id: 2, name: 'Samsung Galaxy S24', tags: ['phone', 'android', 'samsung'] }, { id: 3, name: 'Apple MacBook Pro', tags: ['laptop', 'apple', 'macos'] }, { id: 4, name: 'Dell XPS 13', tags: ['laptop', 'windows', 'dell'] }, { id: 5, name: 'Sony WH-1000XM5', tags: ['headphones', 'sony', 'audio'] }, { id: 6, name: 'Nintendo Switch', tags: ['gaming', 'console', 'nintendo'] }, { id: 7, name: 'Kindle Paperwhite', tags: ['ereader', 'amazon', 'reading'] }, { id: 8, name: 'Apple iPad Air', tags: ['tablet', 'apple', 'ios'] }, { id: 9, name: 'Google Pixel 9', tags: ['phone', 'android', 'google'] }, { id: 10, name: 'Logitech MX Master 3S', tags: ['mouse', 'logitech', 'accessory'] }, { id: 11, name: 'Razer Blade 15', tags: ['laptop', 'gaming', 'windows'] }, { id: 12, name: 'Bose QuietComfort Ultra', tags: ['headphones', 'bose', 'audio'] } ];
function paginate(array, page, size) { const total = array.length; const p = Math.max(1, Number.isInteger(page) ? page : 1); const s = Math.max(1, Number.isInteger(size) ? size : 10); const start = (p - 1) * s; if (start >= total) return []; return array.slice(start, Math.min(start + s, total)); }
const cache = new Map(); function getCache(key) { const entry = cache.get(key); if (!entry) return null; if (entry.exp < Date.now()) { cache.delete(key); return null; } return entry.value; } function setCache(key, value, ttlMs = 60000) { cache.set(key, { value, exp: Date.now() + ttlMs }); }
function httpError(status, code, message, details) { const err = new Error(message); err.status = status; err.code = code; if (details) err.details = details; return err; }
app.get('/api/items', (req, res, next) => { try { const { q = '', page = '1', size = '10' } = req.query; const pageNum = Number.parseInt(page, 10); const sizeNum = Number.parseInt(size, 10);
const details = {};
if (!Number.isFinite(pageNum) || pageNum < 1) details.page = 'page must be a positive integer';
if (!Number.isFinite(sizeNum) || sizeNum < 1 || sizeNum > 100) details.size = 'size must be an integer between 1 and 100';
if (typeof q !== 'string') details.q = 'q must be a string';
if (typeof q === 'string' && q.length > 100) details.q = 'q length must be <= 100';
if (Object.keys(details).length) throw httpError(400, 'INVALID_QUERY', 'Invalid query parameters', details);
const keyword = (q || '').trim().toLowerCase();
const cacheKey = `filtered:q=${keyword}`;
let filtered = getCache(cacheKey);
if (!filtered) {
if (keyword.length === 0) {
filtered = items.slice();
} else {
filtered = items.filter(it => {
const inName = it.name.toLowerCase().includes(keyword);
const inTags = Array.isArray(it.tags) && it.tags.some(t => String(t).toLowerCase().includes(keyword));
return inName || inTags;
});
}
setCache(cacheKey, filtered, 60000);
}
const data = paginate(filtered, pageNum, sizeNum);
res.json({
data,
meta: { page: pageNum, size: sizeNum, total: filtered.length }
});
} catch (err) { next(err); } });
app.use((err, req, res, next) => { const status = err.status || 500; const code = err.code || (status === 500 ? 'INTERNAL_ERROR' : 'ERROR'); const payload = { error: { code, message: err.message || 'Internal Server Error' } }; if (process.env.NODE_ENV !== 'production' && err.details) payload.error.details = err.details; res.status(status).json(payload); });
app.listen(3000, () => console.log('Server started on 3000'));
以下是补全并优化后的完整 Go 代码,支持并发抓取多个 URL、超时控制与重试、简单 LRU 缓存加速,并返回汇总 JSON。已添加必要注释。
package main
import ( "context" "encoding/json" "errors" "io" "log" "net/http" "sync" "time" )
// CacheEntry 表示缓存内容 type CacheEntry struct { URL string Body string FetchedAt time.Time }
// LRUCache 简化版 LRU 缓存(基于 map + slice 的顺序队列) type LRUCache struct { mu sync.Mutex data map[string]CacheEntry order []string // order[0] 为最近使用,末尾为最久未使用 limit int }
// NewLRUCache 初始化缓存 func NewLRUCache(limit int) *LRUCache { return &LRUCache{ data: make(map[string]CacheEntry, limit), order: make([]string, 0, limit), limit: limit, } }
// removeKey 从顺序队列移除指定 key func (c *LRUCache) removeKey(key string) { for i, k := range c.order { if k == key { c.order = append(c.order[:i], c.order[i+1:]...) return } } }
// Get 获取缓存并提升至最近使用 func (c *LRUCache) Get(key string) (CacheEntry, bool) { c.mu.Lock() defer c.mu.Unlock() entry, ok := c.data[key] if !ok { return CacheEntry{}, false } // 提升到队列头部 c.removeKey(key) c.order = append([]string{key}, c.order...) return entry, true }
// Set 设置缓存,若超出限制则淘汰最久未使用项 func (c *LRUCache) Set(key string, entry CacheEntry) { c.mu.Lock() defer c.mu.Unlock() if _, ok := c.data[key]; ok { // 更新已有项并提升 c.data[key] = entry c.removeKey(key) c.order = append([]string{key}, c.order...) return } // 若容量已满,淘汰队列末尾(最久未使用) if len(c.order) >= c.limit { old := c.order[len(c.order)-1] delete(c.data, old) c.order = c.order[:len(c.order)-1] } c.data[key] = entry c.order = append([]string{key}, c.order...) }
// fetchURL 使用 context 控制超时/取消,并内置重试逻辑 func fetchURL(ctx context.Context, url string) (string, error) { client := &http.Client{} // 超时由 ctx 控制 const maxRetries = 3 baseBackoff := 100 * time.Millisecond
for attempt := 0; attempt < maxRetries; attempt++ {
// 若已取消或超时,尽早退出
if ctx.Err() != nil {
return "", ctx.Err()
}
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return "", err
}
req.Header.Set("Accept", "text/plain,*/*")
resp, err := client.Do(req)
if err != nil {
// 网络错误或 ctx 取消
if ctx.Err() != nil {
return "", ctx.Err()
}
// 退避重试
if attempt < maxRetries-1 {
backoff := baseBackoff * time.Duration(1<<attempt) // 指数退避
select {
case <-time.After(backoff):
case <-ctx.Done():
return "", ctx.Err()
}
continue
}
return "", err
}
// 确保关闭 Body
bodyBytes := []byte{}
if resp.StatusCode >= 200 && resp.StatusCode < 300 {
var readErr error
bodyBytes, readErr = io.ReadAll(resp.Body)
resp.Body.Close()
if readErr != nil {
// 读失败可重试
if attempt < maxRetries-1 && ctx.Err() == nil {
backoff := baseBackoff * time.Duration(1<<attempt)
select {
case <-time.After(backoff):
case <-ctx.Done():
return "", ctx.Err()
}
continue
}
return "", readErr
}
return string(bodyBytes), nil
} else {
// 非 2xx 状态视为错误,尝试重试
io.Copy(io.Discard, resp.Body)
resp.Body.Close()
if attempt < maxRetries-1 && ctx.Err() == nil {
backoff := baseBackoff * time.Duration(1<<attempt)
select {
case <-time.After(backoff):
case <-ctx.Done():
return "", ctx.Err()
}
continue
}
return "", errors.New("non-2xx response")
}
}
return "", errors.New("fetch failed after retries")
}
type CollectResult struct {
URL string json:"url"
Ok bool json:"ok"
Length int json:"length"
}
var cache *LRUCache
// handleCollect 并发抓取多个 URL,支持 LRU 缓存、超时与重试,返回结果 JSON func handleCollect(w http.ResponseWriter, r http.Request) { // 期望: /collect?url=https://a.com&url=https://b.com start := time.Now() ctx, cancel := context.WithTimeout(r.Context(), 3time.Second) defer cancel()
urls := r.URL.Query()["url"]
if len(urls) == 0 {
http.Error(w, "missing url params", http.StatusBadRequest)
return
}
// 预分配结果,保持与输入顺序一致
results := make([]CollectResult, len(urls))
// 将相同 URL 的索引聚合,避免重复抓取
urlIndices := make(map[string][]int, len(urls))
for i, u := range urls {
urlIndices[u] = append(urlIndices[u], i)
}
// 先尝试缓存命中,命中的不再抓取
toFetch := make([]string, 0)
for u, idxs := range urlIndices {
if entry, ok := cache.Get(u); ok {
// 缓存命中:直接填充各索引结果
for _, i := range idxs {
results[i] = CollectResult{
URL: u,
Ok: true,
Length: len(entry.Body),
}
}
continue
}
toFetch = append(toFetch, u)
}
// 并发抓取未命中的 URL(一个 URL 一次抓取,结果映射到多个索引)
var wg sync.WaitGroup
for _, u := range toFetch {
idxs := urlIndices[u]
wg.Add(1)
go func(u string, idxs []int) {
defer wg.Done()
body, err := fetchURL(ctx, u)
if err != nil {
for _, i := range idxs {
results[i] = CollectResult{URL: u, Ok: false, Length: 0}
}
return
}
// 写入缓存
cache.Set(u, CacheEntry{URL: u, Body: body, FetchedAt: time.Now()})
for _, i := range idxs {
results[i] = CollectResult{URL: u, Ok: true, Length: len(body)}
}
}(u, idxs)
}
wg.Wait()
tookMs := time.Since(start).Milliseconds()
// 输出 JSON
w.Header().Set("Content-Type", "application/json")
_ = json.NewEncoder(w).Encode(map[string]any{
"results": results,
"tookMs": tookMs,
})
}
func main() { // 初始化 LRU 缓存,限制容量为 64 cache = NewLRUCache(64)
http.HandleFunc("/collect", handleCollect)
log.Println("Listening on :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
通过智能补全功能,帮助开发者快速生成完整可运行的代码实现,从而提升开发效率、减少编码错误,并加速目标功能的实现。
通过该提示词快速补全业务逻辑代码,减少重复性工作并提升接口开发效率,专注于核心功能实现。
为新手提供有效的代码示例和指导,帮助快速学习语言特性与实现常见功能,降低学习曲线。
高效生成前后端代码片段,无需频繁查阅文档或资料,提升开发一体化效率。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
免费获取高级提示词-优惠即将到期