ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python作品集实战:5个项目帮你搞定面试官

Python作品集实战:5个项目帮你搞定面试官 从精通Python到有作品集的人——这个转变我用了半年时间。刚开始和大家一样我简历上写着熟悉requests、掌握pandas结果一到面试就被问住你做过什么实际项目那时候我连GitHub链接都懒得放觉得网上教程那么多谁不会敲两行爬虫代码呢后来当我自己坐到面试官那一边翻看候选人作品集时才彻底明白代码能跑和能证明你会写代码完全是两回事。这篇文章我会把构建Python作品集这件事讲透给出5个可以直接照做的项目创意从爬虫到数据分析从Web应用到自动化办公再到并发编程专项每个项目都按为什么选它、技术栈怎么搭、核心代码怎么写、面试怎么讲这个逻辑拆开讲。1. 为什么你的Python简历总被刷掉作品集才是真正的敲门砖先聊聊一个残酷的事实。我收到的简历里十个有七个写着熟悉Python但真正能在面试前提交一份像样GitHub链接的不到三成。为什么因为大多数人的学习路径是装好Python环境 - 跟着教程敲一遍 - 跑通就觉得自己会了 - 简历开写精通。这个路径最大的问题在于你学到的是一堆孤立的知识点而不是一条完整的解决问题链路。1.1 作品集在证明什么面试官看作品集本质上在看三件事。第一你是否有从头到尾独立完成一个真实问题的能力而不是只会抄教程里的示例代码第二你遇到坑时怎么排查、怎么解决这比代码本身更能体现工程素养第三你有没有自己的思考和取舍比如为什么选这个库而不是那个库为什么这样设计数据结构。这三件事任何一份简历上的技能列表都无法替代。举个例子同样是写熟悉requests候选人A的作品集里有一个爬虫项目从URL构造、请求头伪装、解析、清洗、存储到后期数据分析每一步都有清晰的代码和文档候选人B只在简历上写了熟悉requests。真到了面试场景我会让A现场说说他处理反爬的思路他会告诉我服务器返回了418我意识到是User-Agent被识别了然后改了请求头、加了频率限制这种对话是有信息量的。B则只能支支吾吾。这就是作品集的威力——它把我会变成了我做过并且我能讲清楚。1.2 选择项目创意的三个铁律第一数据来源必须真实。不要用csdn或老师给的现成数据集自己去抓、自己去生成哪怕数据本身不完美处理不完美数据的过程恰恰是最有价值的实战经验。第二必须跑通完整的闭环。光把数据抓下来不算完还要清洗、分析、可视化光把接口调通不算完还要想怎么部署、怎么展示给别人看。第三每个项目要有一个记忆点。这个记忆点可以是一个你踩过的很深的坑可以是一个性能优化前后的对比数字也可以是一句你在README里写明白的设计初衷。这个记忆点就是面试时对方最容易追问、也最容易让谈话深入下去的地方。2. 好项目的底层逻辑难度阶梯、方向覆盖与时间预算五个项目不是随便挑的它们之间有一条清晰的成长路径。整体设计逻辑是先解决数据从哪来再解决数据怎么用然后解决怎么把能力展示出去接着解决怎么解决真实场景的痛点最后解决怎么体现语言深度。2.1 难度阶梯别一上来就做全家桶我见过太多人第一个项目就选电商系统或者爬取全网数据做量化分析结果做了一周就放弃。作品集项目的难度应该像打游戏一样一关一关解锁。五个项目的推荐顺序是爬虫入门必备- 数据分析技能进阶- Web应用综合应用- 自动化办公工程化交付- 并发与进阶语法语言深度。前三个项目建议在两个月内完成后两个可以各花三到四周精雕细琢。整体预算三到四个月时间太短做出来的东西经不起深挖时间太长你的热情和耐心会先耗尽。2.2 方向覆盖让面试官在任何环节都能问到点子上这五个项目恰好覆盖了Python就业市场里最主流的几个方向。爬虫项目对应数据采集岗数据分析对应业务分析岗Web应用对应后端开发岗自动化办公对应企业内部提效场景并发专项对应偏底层和性能优化的岗位。很多同学问我不知道自己适合哪个方向这个问题其实不是想出来的是做出来的——你在做这五个项目过程中自然会发现自己对哪个环节最有感觉、最愿意深挖。作品集既是给别人看的也是给自己摸清方向的工具。2.3 时间预算不要用完美主义绑架自己一个残酷的现实是80%的人倒在第一个项目的中后期因为爬到一半发现网站反爬升级了或者数据量太大处理不动了就开始怀疑自己。我给一个时间规律供参考第一个项目控制在10天内完成因为核心目的是建立信心和跑通全链路第二个项目控制在两周内第三个项目可以多花一点时间因为Web应用就是你的门面第四、五个项目各三到四周完全够用。记住作品集不是真的产出一个商业级产品它的核心价值是向别人证明你有完成事情的能力。3. 项目一全链路爬虫——从requests到SQLite的必修课3.1 为什么第一个项目必须是爬虫很多人觉得爬虫烂大街了不想做。但我不想让大家跟风去碰那些又难又容易劝退的项目。爬虫之所以是作品集的标配是因为它是一条天然完整的链路做爬虫你必须处理网络请求、解析HTML、处理异常、清洗数据、设计存储结构。这个链路几乎是Python后端和数据方向所有技术点的缩影。而且爬虫项目天然带记忆点比如你抓了一个反爬严密的网站这个过程本身就是面试官最喜欢听的。别碰违法边缘的事情遵守网站规则合理设置爬取频率尊重robots协议坚持只爬取公开数据做学习用途。3.2 项目选型与核心功能拆解推荐做一个豆瓣电影Top250信息抓取项目理由是这个网站结构简单、数据规整、适合新手完整跑通。当然用链家二手房、招聘网站比如某直聘的公开岗位信息也可以选你熟悉的领域更好。核心功能拆解成四块请求模块使用requests库构造HTTP请求处理请求头、Cookie、超时重试解析模块使用BeautifulSoup4 lxml解析HTML提取片名、评分、评价人数、导演、简介清洗模块处理缺失值、去重、统一数据类型存储模块将清洗后的数据存入SQLite数据库同时导出CSV3.3 实操路线与关键代码第一步先用浏览器开发者工具观察页面结构确认目标数据在HTML里还是通过异步加载的。豆瓣Top250的数据都在HTML里属于服务端渲染页面用requests加BeautifulSoup就够用。第二步写基础请求和解析代码import requests from bs4 import BeautifulSoup import time headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } def fetch_page(url): resp requests.get(url, headersheaders, timeout10) resp.raise_for_status() return BeautifulSoup(resp.text, lxml) def parse_movies(soup): movies [] for item in soup.select(.item): title item.select_one(.title).text rating item.select_one(.rating_num).text comment_count item.select_one(.star span:last-child).text movies.append({ title: title, rating: float(rating), comments: comment_count }) return movies第三步处理分页。Top250一共有10页URL规律是start0、start25……每次加25。这里要注意设置time.sleep(1)来控制请求频率避免给服务器造成压力也防止自己的IP被封。第四步数据清洗与入库import sqlite3 import pandas as pd # 数据清洗 df pd.DataFrame(all_movies) df.drop_duplicates(subset[title], inplaceTrue) df.dropna(subset[title], inplaceTrue) # 存入SQLite conn sqlite3.connect(movies.db) df.to_sql(top250, conn, if_existsreplace, indexFalse)这里我特意选用了pandas做清洗而不是手写Python循环因为pandas的DataFrame对缺失值处理、去重、类型转换这些操作有非常成熟的方法也更贴近真实工作场景。3.4 反爬与数据清洗中的真实坑爬虫项目80%的坑集中在两块。一块是反爬另一块是数据质量。反爬这块我实测下来最常见的现象有两个。第一个是请求头问题服务器返回418或403十有八九是请求头里的User-Agent被识别了解决办法也很简单就是模拟真实浏览器请求头如果还不行就换用能自动处理Cookie的session。第二个是频率问题短时间大量请求触发封IP这时候需要加延时或者使用代理池。不过对于作品集项目加延时已经足够了没必要往代理池方向折腾。数据质量这块最常见的坑是解析时标签漏掉了导致取到None如果直接用.text就会直接报AttributeError。我的习惯是解析后立刻做一轮空值检查用一段临时代码把空值打印出来逐个分析原因。还有编码问题有些网站的响应不是UTF-8需要根据响应头里的charset设置resp.encoding否则中文会变成乱码。3.5 作品集呈现方式这个项目虽然技术难度不高但呈现方式很考究。我的建议是README里放三样东西——抓取到的数据样本表格、数据量统计比如共抓取250部电影评分9.0以上的有X部、以及一个简单的评分分布柱状图。这样面试官点开你的仓库不用看代码就能直观感受到你做了什么。4. 项目二数据分析与可视化——让数据替你说话4.1 项目选型什么样的数据值得分析爬虫项目做完后你手里已经有了一堆数据。但数据本身没有价值洞察才是价值。第二个项目就是把这些数据变成能讲的故事。如果你不想直接用爬虫抓的数据也可以选择公开数据集比如Kaggle上的电商订单数据、房价数据或者和你专业相关的数据集。我强烈推荐在项目一的豆瓣数据基础上延伸因为这样你的作品集里就形成了数据采集 - 数据分析的连贯叙事面试官一看就知道你是一个会顺着业务链条走的人。当然也可以换个领域做选一个和你未来求职方向更贴近的数据集比如想做电商运营分析就去爬某个电商平台的商品信息。核心功能拆解加载与预处理处理缺失值、异常值、类型转换探索性分析描述性统计、相关性分析、分组聚合可视化呈现不同维度的数据图表结论提炼用三到五句话概括你在数据中发现的规律4.2 从数据到洞察完整的分析流程以豆瓣Top250数据为例数据分析的思路可以是先看整体分布评分集中在什么区间再看交叉维度不同年代的电影数量差异评分是否随时间变化最后做细分洞察评价人数和评分是否相关。import pandas as pd import matplotlib.pyplot as plt # 中文字体设置Windows/macOS有差异 plt.rcParams[font.sans-serif] [SimHei] # Windows用SimHeimacOS可换Arial Unicode MS plt.rcParams[axes.unicode_minus] False df pd.read_sql(SELECT * FROM top250, sqlite3.connect(movies.db)) # 评分分布 plt.figure(figsize(10, 5)) plt.hist(df[rating], bins20, edgecolorblack) plt.title(评分分布) plt.xlabel(评分) plt.ylabel(电影数量) plt.savefig(rating_dist.png, dpi150)这里有一个我一定要提醒的坑matplotlib默认字体不支持中文直接画图会出现方框乱码。解决办法就是上面代码里的plt.rcParams[font.sans-serif]设置Windows通常用SimHeimacOS用Arial Unicode MSLinux可以用Noto Sans CJK。另外axes.unicode_minus要设为False否则负号会变方块。4.3 可视化不讲故事就别画图很多人的分析报告就是一堆图表堆叠饼图、柱状图、折线图全上但问一句你想表达什么就答不出来了。我的原则是每个图表必须服务于一个观点。比如评分分布图想表达的观点是Top250的电影评分集中在8.5到9.5之间说明这个榜单的口味偏向高口碑而非大众热度年代分布图想表达的是上榜电影以21世纪头十年居多近年新片占比偏低。有观点图表才有灵魂。4.4 作品集呈现方式这个项目的作品集呈现比代码更重要的是分析报告。我建议在项目仓库里加入一个analysis_report.md用文字配合图表讲清楚你的分析流程和结论。面试时你甚至可以不用打开代码直接对着这份报告讲解你的分析思路这种带着结论来面试的人面试官印象分极高。5. 项目三Web应用——把静态代码变成可点击的产品5.1 为什么Web应用最适合做作品集门面说实话你的爬虫和数据分析项目写得再好面试官也不一定真去运行你的代码。但Web应用不一样你部署一个链接过去他点一下就能看到界面体验感完全不是一个量级。而且Web应用天然把后端逻辑、前端展示、数据库交互串在一起是最能直观体现你综合能力的项目类型。网上那些Python入门到实践电子版里的项目基本都是控制台程序。但真实世界的软件99%是带着界面的你的作品集如果全是命令行项目会让面试官怀疑你的交付能力。5.2 技术选型Flask还是FastAPI我在Flask和FastAPI之间纠结过很久最终建议是追求稳妥选Flask追求新鲜选FastAPI。Flask的生态成熟、资料多、遇到问题好查FastAPI性能更好、自带接口文档、支持异步但资料相对少一些。作品集项目的核心诉求是稳所以我更推荐Flask起步等你熟练之后用FastAPI做自己的副业项目时再换也不迟。技术栈搭配建议后端Flask轻量、易学、资料多数据库SQLite零配置文件即库或PostgreSQL如果部署在云端前端Bootstrap 5响应式布局 Chart.js图表部署本地演示 云服务器/容器服务5.3 从零到一项目骨架与核心功能这个项目可以把项目二的分析结果做成可交互的Dashboard也可以做一个小型的作品集管理后台甚至做一个我的电影收藏应用记录你看过的电影和评分。核心功能设计首页展示Top10电影基本信息加一张评分分布图榜单页可排序、可搜索的电影列表分页展示详情页单部电影的信息和简介后端API提供JSON格式的数据接口供前端异步调用用Flask实现核心路由非常简单from flask import Flask, render_template, jsonify import sqlite3 app Flask(__name__) def query_db(sql): conn sqlite3.connect(movies.db) conn.row_factory sqlite3.Row rows conn.execute(sql).fetchall() conn.close() return rows app.route(/) def index(): top10 query_db(SELECT * FROM top250 ORDER BY rating DESC LIMIT 10) return render_template(index.html, moviestop10) app.route(/api/top250) def api_top250(): rows query_db(SELECT * FROM top250 ORDER BY rating DESC) return jsonify([dict(row) for row in rows]) if __name__ __main__: app.run(debugTrue)这里有个细节conn.row_factory sqlite3.Row这行很关键它让查询结果支持按字段名访问否则你只能通过索引访问代码可读性会差很多。5.4 设计与部署中的实际教训踩坑最多的环节是部署。本地app.run(debugTrue)跑得好好的一上服务器就各种问题。我总结的教训有三条。第一debugTrue绝对不能用于生产环境它会在页面直接暴露调试信息存在安全隐患。生产环境用waitress或gunicorn跑WSGI应用。第二静态文件路径问题部署到云服务器后CSS和JS加载不出来十有八九是nginx配置里的静态文件目录写错了需要把Flask的static_folder路径配好。第三数据库路径问题上传到服务器后SQLite数据库文件路径变了写绝对路径最省事。部署方案我推荐两种。简单方案用Deta Space或Railway这类平台把代码推上去自动部署适合快速展示。正式方案租一台入门级云服务器用nginx gunicorn Flask部署这个过程本身就能成为面试时的一个加分话题。实际项目里我会先本地跑通再推到云平台最后补上Dockerfile用容器部署——这三步做完你的部署能力在应届生里就已经算不错的水平了。6. 项目四自动化办公工具——最容易被低估的加分项6.1 为什么说自动化工具最容易被低估前面三个项目在简历里都见多了面试官会审美疲劳。自动化办公工具这个方向虽然看起来不起眼但它有两个压倒性优势。第一它直接解决真实痛点面试官自己可能就遇到过每周要合并几十个Excel这种破事你说你写过工具处理这个他一下就能共情。第二它体现的是工程化交付能力——把脚本变成GUI工具再打包成exe丢给别人用这完全是产品思维。另外一个很少人提的点自动化办公工具是作品集里最容易传播的项目。你打包一个exe发到朋友圈或技术群里有人真的会用有人会给你提需求这就是真实的用户反馈对个人成长非常宝贵。6.2 项目选型解决你最熟悉的那个痛点我建议从你自己的实际场景出发。你做课程作业时是不是经常需要合并PDF你处理实验数据时是不是总是在Excel里手动复制粘贴你下载的素材文件是不是总是命名混乱把这些痛点随便挑一个做一个工具出来。这里我以PDF批量合并与文件名整理工具为例展开因为PDF处理是办公场景里的高频需求库也比较成熟。技术栈核心逻辑pypdf 或 pdfplumber界面tkinterPython自带打包体积小或 PySide6更好看但体积大打包PyInstaller6.3 从脚本到exe完整交付流程第一步先写核心逻辑。一个最简单的PDF合并脚本from pypdf import PdfWriter def merge_pdfs(file_list, output_path): merger PdfWriter() for file in file_list: merger.append(file) with open(output_path, wb) as f: merger.write(f)第二步用tkinter把命令行脚本包装成GUI。tkinter不用额外安装代码也简单核心就三块文件选择框、输出路径选择框、一个开始合并按钮。如果你愿意多花点功夫用PySide6做出来的界面会更现代但打包体积会大不少。第三步打包成exe。打包命令一句话pip install pyinstaller pyinstaller -F -w merge_tool.py其中-F表示打包成单文件-w表示不显示控制台窗口。打包完成后在dist目录下就能拿到可直接双击运行的exe文件。6.4 PyInstaller打包避坑指南打包这一步坑非常多值得单独讲讲。第一坑打包出来的exe体积动不动100MB以上。解决办法是在干净的虚拟环境里只装项目需要的依赖然后用conda create -n build_env python3.10这样的方式新建一个纯净环境再打包体积能小一半。第二坑路径带中文导致exe运行报错。这是PyInstaller在Windows下处理中文路径的经典bug代码里用os.path.abspath()在读取文件前统一转换路径可以规避。第三坑GUI点击开始合并后界面卡死。原因是你把耗时操作放在主线程里了界面被阻塞。解决办法是用多线程耗时任务丢到子线程执行主线程保持响应。from PySide6 import QtWidgets from PySide6.QtCore import QThread class MergeThread(QThread): def __init__(self, files, output): super().__init__() self.files files self.output output def run(self): merge_pdfs(self.files, self.output)第四坑杀毒软件误报。这个不能彻底避免但可以降低概率用PyInstaller时不要加--onefile以外的奇怪参数减少动态解压特征同时用UPX压缩库时要特别注意某些杀软会把UPX特征也报出来。6.5 作品集呈现方式这个项目的呈现逻辑和其他项目不同重点是交付物。我建议在GitHub Releases里上传打包好的exe文件README里放一张工具界面截图和一段使用录屏GIF。面试时准备一句话介绍我做了一个XX工具已经打包成exe可以直接下载使用迭代过三个版本目前有X个人在用。这句话的杀伤力比你写一百行技术描述都大。7. 项目五并发与装饰器专项——在作品集里展示语言深度7.1 这个项目到底在展示什么前四个项目如果都在应用层打转第五个项目就是用来展示你不仅会用还懂底层机制的。并发编程、装饰器、上下文管理器、类型注解、性能分析这些是Python里公认的进阶知识点。把这几个知识点组织进一个项目里面试官看完前面四个项目可能还在犹豫你的深度看完这个项目就会觉得你是一个真正研究过语言本身的人。记住这个项目不追求业务功能多丰富追求的是点要深。选材上我强烈建议做一个并发下载器——下载图片、文件或者批量请求API这个场景天然适合并发也容易做性能对比测试。7.2 需求设计一个带重试和统计的并发下载器设计这样一个项目输入一批URL列表程序启用线程池并发下载下载失败自动重试全部完成后统计成功数、失败数、总耗时并输出一份性能报告。这个项目天然包含了三个Python进阶点并发执行用concurrent.futures.ThreadPoolExecutor或asyncio实现装饰器用装饰器实现重试机制和日志统计性能分析对比单线程与并发下载的耗时差异7.3 核心代码装饰器、线程池与类型注解重试装饰器是很多人的第一个看懂了但不会写的东西这里给出完整实现import functools import time import logging logging.basicConfig(levellogging.INFO) def retry(max_retries3, delay1.0): def decorator(func): functools.wraps(func) def wrapper(*args, **kwargs): for attempt in range(1, max_retries 1): try: return func(*args, **kwargs) except Exception as e: logging.warning(fAttempt {attempt} failed: {e}) if attempt max_retries: raise time.sleep(delay) return wrapper return decorator retry(max_retries5, delay0.5) def download_file(url: str) - bytes: resp requests.get(url, timeout5) resp.raise_for_status() return resp.content这段代码有几个值得品味的地方。functools.wraps(func)这行一定不能省它会把原始函数的__name__和__doc__保留下来否则你调用被装饰的函数后它的名字会变成wrapper排查问题会非常痛苦。另外*args, **kwargs是装饰器透传参数的标配写法不加这两个你的装饰器就只能作用于无参函数。并发主逻辑from concurrent.futures import ThreadPoolExecutor, as_completed def download_all(urls: list[str], max_workers: int 8) - dict: results {success: 0, failed: 0, details: []} with ThreadPoolExecutor(max_workersmax_workers) as executor: future_map {executor.submit(download_file, url): url for url in urls} for future in as_completed(future_map): url future_map[future] try: data future.result() results[success] 1 results[details].append((url, ok, len(data))) except Exception: results[failed] 1 results[details].append((url, failed, 0)) return resultsThreadPoolExecutor用起来比手动管理线程简单太多with语句会自动等待所有任务完成并清理线程池这是Python并发的最佳实践。7.4 性能对比拿数据说话项目做完后一定要跑一组性能对比测试。用同一组URL分别测单线程、4线程、8线程、16线程的耗时然后做成表格放在README里。实测经验是对于IO密集型的下载任务8线程通常能比单线程提速5到8倍但再往上加线程收益会递减因为受网络带宽和服务器并发限制影响。并发数50个文件总耗时相对单线程提速1单线程45.2秒1.0x412.8秒3.5x86.9秒6.6x165.8秒7.8x这个表格放出去比空口说我掌握了并发编程有力得多。7.5 进阶方向与避坑这个项目做完如果你想继续深入有两个方向。一个是把ThreadPoolExecutor换成asyncioaiohttp做异步版本对比两种方案的性能差异另一个是把下载功能封装成可复用的Python包发布到PyPI上让别人pip install就能用这一步对工程化能力的锻炼非常大。避坑方面Windows下用多进程时一定要有if __name__ __main__:保护否则会报RuntimeError。另外线程池里共享变量有线程安全问题需要用threading.Lock加锁或者像我上面那样把结果收集逻辑放在主线程的as_completed循环里从设计上就避免共享变量。8. 作品集上线前的最后打磨README、部署与代码规范五个项目都做完之后别急着投简历。作品集的最后一道工序是打磨呈现方式这一步直接决定了面试官第一眼的观感。8.1 README作品集的第一印象很多人写README就是放一段项目介绍然后贴一堆安装命令看完等于没看。一个真正优秀的README应该包含六块内容项目简介一句话讲清楚干什么、效果展示截图或GIF放在最显眼的位置、技术栈图标或列表皆可、核心功能用bullet point列出、快速启动从clone到跑起来的最短路径、项目结构和核心难点做一个整体说明。我见过一个非常讨巧的写法把踩坑记录单独放一节比如这个项目我遇到了X问题通过Y方式解决原因是Z。这种内容面试官一眼就能看出你是用心做的不是复制粘贴的。8.2 代码规范从能跑到能看代码规范是作品集里最容易得分也最容易丢分的隐形项。我面试时翻过很多候选人的代码能跑但全程没有函数注释变量名全是a、b、tmp整个仓库没有模块划分。这种我会直接判扣分。我的建议是养成三个习惯函数和类必须写docstring、变量名要足够表达含义、每个项目至少要有requirements.txt或pyproject.toml。更进一步可以给关键函数加上类型注解用mypy做一次静态检查用black做一次代码格式化再用pre-commit把这些工具串起来。这些习惯一开始会觉得繁琐坚持两个项目之后你会感谢自己。8.3 部署与推广让面试官真正打开你的项目作品集光躺在GitHub仓库里是不够的。我推荐的组合拳是三件套。第一GitHub仓库本身代码和文档都在这里这是主阵地。第二在线DemoWeb项目部署到云平台爬虫项目可以做个在线API直接访问数据。第三个人博客针对每个项目写一篇复盘文章讲清楚背景、思路、实现和踩坑。这三件事做完你的作品集就是一个立体的展示体系而不是一个孤零零的仓库链接。8.4 时间规划与心态建议最后聊聊执行层面。五个项目的理想节奏我已经在前文给过了一共三到四个月每周投入十小时左右。但我想说的是一个比节奏更重要的心态问题作品集是做给自己看的东西不是做给面试官看的东西。你选的项目一定是自己感兴趣、愿意深挖的这样你才会在凌晨两点为了一个bug翻遍了Stack Overflow也不觉得累。当你真正做出来四个、五个项目你会发现简历上那句精通Python终于有了底气因为你每一句熟悉背后都有一堆代码和一个真实经历撑着。如果你现在还在犹豫我到底要不要花几个月做作品集我的建议是不要再纠结了。打开你的Python环境选上面任意一个项目创意把第一步代码敲出来。作品集不是想出来的是做出来的。三个月后的你会感谢今天开始动手的自己。
返回列表