- 博客(455)
- 收藏
- 关注
原创 5.7 Python HTTP 请求与 urllib、requests 库
Python 提供了多种方式进行 HTTP 请求,主要使用标准库 urllib 和第三方库 requests。urllib 包含模块如 request(发送请求)、parse(URL 编码)和 error(异常处理)。通过 urlopen 可发送 GET/POST 请求,支持添加请求头、处理参数及异常。urllib 还能通过 ProxyHandler 设置代理,利用 cookiejar 管理会话 Cookie。虽然功能完整,但 urllib 的 API 较底层,而 requests 提供了更简洁的接口。
2025-09-30 08:00:00
1107
原创 5.8 Python API 调用与第三方服务集成
本文介绍了Python中生产级API集成的最佳实践,涵盖RESTful API设计原则和多种认证机制。主要内容包括:1) API经济时代下专业集成的关键要素(认证、速率限制、错误处理等);2) RESTful API的核心设计原则(资源导向、无状态性等);3) 四种主流认证方式的实现:API Key认证、Bearer Token认证、OAuth 2.0授权流程和Webhook验证。文章通过具体代码示例展示了每种认证方式的Python实现方案,为开发者构建安全可靠的API客户端提供了实用指导。
2025-09-30 08:00:00
1135
原创 5.9 Python 网络爬虫基础(requests + BeautifulSoup)
本文介绍了网络爬虫的基础知识,包括定义、工作流程和常用Python工具(requests、BeautifulSoup)。重点探讨了爬虫的伦理与法律问题,如遵守robots.txt、请求频率限制和数据版权。提供了环境设置指南,并详细讲解了如何使用requests获取网页内容和BeautifulSoup解析HTML的方法,包括查找元素、提取数据的技巧。最后通过一个实战项目演示了如何爬取图书网站信息并存储为CSV文件。文章强调在爬取数据时要遵守法律和道德规范。
2025-09-30 08:00:00
974
原创 5.10 Python 实战项目:多线程爬虫+MySQL数据存储系统
本文介绍了多线程网络爬虫系统的架构设计与基础实现。系统包含URL管理器、网页下载器、内容解析器、数据存储器和监控模块五大核心组件,能够并发爬取、解析和存储网页数据。通过MySQL数据库设计,详细展示了图书信息表和爬取日志表的结构。代码实现部分包括数据库连接管理类(支持连接、查询和批量操作)和线程安全的URL管理器(负责URL规范化、去重和队列管理)。该架构以图书爬取为例,但具有良好的可扩展性,可适配各类网站数据抓取需求。
2025-09-30 08:00:00
1225
原创 5.5 Python Queue 队列与生产者消费者模型
Python队列(Queue)在多线程编程中提供了线程安全的通信机制,用于实现生产者-消费者模型。核心方法包括put()和get(),支持阻塞和超时操作。通过队列解耦生产者和消费者,使它们能以不同速度独立工作。典型用法包括单线程示例、多线程生产者-消费者实现,以及使用join()和task_done()进行精确同步。此外,队列可轻松扩展至多生产者和多消费者场景,通过特殊信号(如None)实现优雅退出。队列避免了共享变量和锁的复杂性,提供了一种高效、安全的数据传递方式。
2025-09-29 08:00:00
1021
原创 5.6 Python socket 编程入门与多线程聊天室实现
网络编程是通过编写程序实现计算机之间的网络通信,主要使用TCP(可靠连接)和UDP(无连接低延迟)两种协议。Python的socket模块提供了网络编程接口,通过套接字(Socket)建立客户端与服务器的连接。基础TCP通信包括服务器端(创建、绑定、监听、接收连接、收发数据)和客户端(创建、连接、收发数据)的流程。简单的echo服务器示例展示了单向通信,但实际应用需要多线程处理多个客户端连接。通过改造为多线程echo服务器,实现了同时服务多个客户端的能力。最后,基于这些概念,可以扩展实现一个多线程聊天室系统
2025-09-29 08:00:00
1567
原创 5.4 Python GIL(全局解释器锁)详解
GIL(全局解释器锁)是CPython解释器的核心机制,它确保同一时刻只有一个线程能执行Python字节码。GIL的存在主要源于历史权衡:保护引用计数的线程安全和简化C扩展开发。虽然GIL导致多线程在CPU密集型任务中无法并行加速(实验显示多线程甚至更慢),但对于I/O密集型任务,线程在等待I/O时会释放GIL,从而提升效率。GIL是CPython的实现细节,理解其机制有助于合理选择并发方案(如多进程或异步IO)。这一设计体现了早期Python在单线程性能与多线程支持之间的取舍。
2025-09-28 08:00:00
1042
原创 5.3 Python 协程与 asyncio 入门
本文介绍了Python异步编程的核心概念,重点围绕协程、事件循环和asyncio库展开。首先阐述了异步编程在高并发I/O密集型任务中的必要性,对比了多线程模型的局限性。随后详细讲解了协程的定义、语法(async/await)及其挂起与恢复机制,并通过代码示例演示了如何创建和运行协程。接着深入剖析了事件循环的工作原理,它是异步引擎的核心调度器。文章通过同步与异步版本的并发任务对比,展示了asyncio.gather()的威力,并解释了可等待对象的三种类型:协程、任务和Future。
2025-09-27 08:00:00
1049
原创 5.2 Python 多进程编程(multiprocessing)
Python多进程通过multiprocessing模块实现真正的并行计算,适用于CPU密集型任务。每个进程拥有独立内存空间和GIL,可充分利用多核CPU。本章介绍两种创建进程的方式(Process构造器与继承类),并重点讲解进程间通信(IPC)机制,包括安全的队列(Queue)和高效的管道(Pipe)。队列采用生产者-消费者模式实现跨进程数据共享,而管道提供双向通信能力。代码示例演示了基础用法,并强调Windows平台必须使用if __name__ == '__main__':的规范。
2025-09-26 08:00:00
833
原创 4.9 Python 数据持久化与 Pickle 序列化
Python Pickle模块提供了强大的对象序列化功能,能够将复杂对象(包括自定义类实例)转换为字节流存储或传输。本文介绍了Pickle的核心概念、基础用法(序列化/反序列化)、协议版本选择,以及处理自定义对象、循环引用和自定义序列化逻辑的高级技巧。通过代码示例展示了如何实现数据持久化,同时保持对象完整性和引用关系。Pickle是存储Python特有数据结构的高效工具,适用于需要保存完整对象状态的场景。
2025-09-25 08:00:00
682
原创 4.10 Python 实战项目:CSV + SQLite 学生成绩管理系统
本文将介绍一个结合CSV和SQLite的学生成绩管理系统。系统采用分层架构,包含数据访问层、业务逻辑层和表示层,提供学生管理、课程管理、成绩管理等核心功能。数据库设计包含学生表、课程表和成绩表三张表,通过唯一约束和索引确保数据完整性并提升查询效率。系统支持数据导入导出功能,可实现CSV文件与SQLite数据库之间的数据转换,并具备成绩统计分析能力。数据库初始化模块负责创建表结构和索引,同时提供通用的SQL执行接口,为上层业务逻辑提供数据支持。
2025-09-25 08:00:00
842
原创 5.1 Python 多线程编程(threading)
本文介绍了Python多线程编程的基础知识,重点讲解了threading模块的使用方法。主要内容包括:线程与进程的概念区别、两种创建线程的方式(函数式和继承式)、线程同步问题以及数据竞争现象。通过银行取款案例,展示了多线程并发操作共享变量时可能出现的数据不一致问题,为后续讲解线程同步机制做铺垫。文章采用代码示例与理论解析相结合的方式,帮助读者从零开始掌握Python多线程编程的核心概念。
2025-09-25 08:00:00
1154
原创 4.6 Python 中的 SQLite 数据库操作与 CRUD 实战
SQLite是一种轻量级嵌入式数据库,无需独立服务器,以单一文件形式存储数据,支持ACID事务。Python通过sqlite3模块提供完整支持,可轻松实现CRUD操作。本文介绍了SQLite的特点、Python集成方法,以及创建数据库、表结构(如部门表、员工表、项目表)的代码示例,包括外键约束和多对多关系。此外,还展示了如何查看和修改数据库模式(如添加列),并强调事务处理与连接管理的重要性。SQLite凭借零配置、跨平台和高效性,成为应用本地存储的理想选择。
2025-09-24 08:00:00
1000
原创 4.7 Python 与 MySQL 数据交互(pymysql)
本文介绍了如何使用Python的pymysql库操作MySQL数据库。首先概述了MySQL的特点及安装方式,然后详细讲解了pymysql的安装与数据库连接方法。文章通过示例代码演示了如何创建数据库和表结构,包括部门表和员工表,并设置了外键约束。第二部分重点讲解了CRUD操作,特别是插入数据的实现,展示了如何批量插入部门和员工数据。内容涵盖了从基础连接到实际数据操作的全流程,适合需要将Python与MySQL结合使用的开发者学习参考。
2025-09-24 08:00:00
637
原创 4.8 Python 与 MongoDB 数据交互(pymongo)
MongoDB作为流行的文档型NoSQL数据库,以其灵活的文档模型和强大的查询能力成为现代应用开发的重要选择。本文介绍了MongoDB核心概念,包括数据库、集合、文档等与关系型数据库的对应关系,并详细讲解了通过Python的pymongo库进行连接配置(包括基本连接、高级选项和副本集连接)的方法。同时展示了数据库和集合的基本操作,如创建、查询和统计等。MongoDB的文档模型与Python数据结构天然契合,使其成为处理非结构化数据的理想选择。
2025-09-24 08:00:00
1135
原创 4.3 Python 中的JSON 数据解析与序列化
本文介绍了Python中JSON处理的核心技术,包括数据序列化和反序列化方法。主要内容涵盖:JSON的基本概念与数据类型映射;Python中json模块的核心功能(dumps/dump和loads/load);JSON编码的高级技巧如美化输出、自定义序列化;以及JSON解码的实践应用。文章通过代码示例演示了如何正确处理基本数据类型、复合数据结构和自定义对象,为Web开发和数据处理提供了实用的JSON操作指南。
2025-09-23 08:00:00
913
原创 4.4 Python 中的 XML 文件解析与 lxml 库
本文介绍了XML数据处理的基础知识及Python中lxml库的使用方法。首先概述了XML的文档结构、元素和属性等基本概念,强调了XML在企业系统和Web服务中的重要性。随后详细讲解了lxml库的优势,包括高性能、XPath支持和API兼容性,并提供了安装指南。文章重点解析了XML文档的四种方法及遍历技巧,包括处理命名空间的策略。最后深入介绍了XPath查询语法,通过丰富示例演示了基础查询和复杂筛选操作,展示了lxml在XML数据处理中的强大功能。
2025-09-23 08:00:00
585
原创 4.5 Python 中的 Excel 文件操作(openpyxl 与 pandas)
本文介绍了Python处理Excel文件的两种主要方法:openpyxl和pandas。openpyxl提供精细控制,适合单元格级操作,包括创建工作簿、操作单元格、设置样式、添加公式和创建图表等。pandas则更适合数据分析,提供高级功能如读取特定工作表、处理缺失值和指定数据类型。两种方法各有优势,可根据需求选择使用。通过示例代码,展示了从基础到高级的Excel操作技巧,帮助开发者高效处理Excel数据。
2025-09-23 08:00:00
1156
原创 3.11 Python 实战项目:Nginx日志分析工具(IP统计、状态码分析)
本文介绍了如何构建一个模块化的Nginx日志分析工具。该工具能够将非结构化的日志数据转化为有价值的业务洞察,主要功能包括:基础流量统计、IP地址分析、HTTP状态码分析、请求资源分析和时间维度分析。文章详细规划了系统架构,采用Python核心模块实现日志解析(使用正则表达式处理combined格式)、数据清洗和结构化转换。项目采用模块化设计,包含日志解析器、主分析函数和报告生成器,便于维护扩展。通过这个实战项目,读者可以综合运用文件处理、字符串操作、数据结构和正则表达式等技能,将原始日志转化为可视化报告。
2025-09-22 08:00:00
943
原创 4.1 Python 文件读写与异常处理
Python提供了强大的文件操作功能,通过open()函数可进行读写操作,支持多种模式(如只读'r'、只写'w'、追加'a'等)。文件操作需注意编码问题(推荐UTF-8),并务必使用with语句或try-finally确保文件关闭以避免资源泄露。常见异常如FileNotFoundError、PermissionError等需妥善处理。对于大文件,应逐行或分块读取;二进制文件支持随机访问(seek/tell)。tempfile模块可安全处理临时文件。
2025-09-22 08:00:00
1257
原创 4.2 Python 中的 CSV 文件读写与 pandas 库
CSV作为一种通用数据交换格式,具有简单、轻量、跨平台的优势。Python提供了标准库csv和第三方库pandas两种处理方式:csv模块适合基础操作(如逐行读写),而pandas则提供高效的数据处理功能,包括数据清洗(处理缺失值、去重)、筛选排序、分组聚合以及类型转换等。通过read_csv()和to_csv()可轻松读写CSV文件,结合DataFrame的强大功能(如条件查询、分组统计)能显著提升数据分析效率。本文通过代码示例演示了从基础操作到进阶分析的完整流程。
2025-09-22 08:00:00
876
原创 3.8 Python 时间与日期处理:datetime、time 模块
Python提供了强大的时间日期处理能力,主要通过datetime和time模块实现。时间表示形式包括时间戳、结构化时间、格式化字符串和datetime对象。时区和夏令时是处理时间的重要概念,需特别注意。time模块适用于时间戳操作、格式化和性能计时,而datetime模块提供了更面向对象的处理方式,包含date、time、datetime和timedelta类,支持日期时间计算、组合和替换等操作。正确的时间处理对金融交易、跨国系统等场景至关重要,开发者应掌握这些核心功能以避免潜在问题。
2025-09-21 08:00:00
726
原创 3.10 Python 正则表达式在数据处理中的应用
正则表达式就是由普通字符(例如字母 ‘a’ 到 ‘z’)和特殊字符(称为"元字符")组成的文字模式。该模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式是一项投入产出比极高的技能。虽然学习曲线稍显陡峭,但一旦掌握,它将为你打开一扇新的大门,让你处理文本数据的能力产生质的飞跃。在接下来的数据存储、Web爬虫等章节中,它将持续发挥着不可替代的作用。
2025-09-21 08:00:00
953
原创 3.9 Python3.8+ 新特性实战:海象运算符、位置参数等
本文深入解析 Python 3.8+ 两项重要新特性: 海象运算符(:=) 实现表达式中赋值,解决传统"先计算后判断"的冗余问题 经典应用场景:循环处理、避免重复计算、列表推导式过滤 注意事项:必须加括号,避免过度牺牲可读性 仅位置参数 通过/符号强制参数只能通过位置传递 提升API设计稳健性,防止参数名变更导致的兼容问题 与关键字参数形成完整参数传递控制体系。两项特性分别从代码简洁性和API健壮性两个维度提升了Python的工程实践能力。
2025-09-21 08:00:00
548
原创 3.5 Python 中的匿名函数(lambda)
Python中的lambda函数是一种简洁的匿名函数,用于简化代码和函数式编程。其基本语法为lambda arguments: expression,特点包括匿名性、简洁性和单一表达式。lambda函数常用于与高阶函数(如map、filter、reduce)配合使用,作为排序键,以及在GUI编程中处理回调。它还支持多参数、默认参数和条件表达式,并可嵌套使用。虽然功能有限,但lambda函数在数据处理和代码简化方面非常实用。
2025-09-20 08:00:00
775
原创 3.6 Python 深浅拷贝与内存管理详解
Python的深浅拷贝与内存管理机制是理解对象存储和复制的关键。浅拷贝创建新对象但共享嵌套内容,适用于性能优先场景;深拷贝递归复制所有内容,实现完全独立,适合复杂嵌套结构。Python通过引用计数和垃圾回收自动管理内存,同时优化小整数和字符串。正确选择拷贝方式可避免内存泄漏和意外修改,是编写高效可靠代码的基础。
2025-09-20 08:00:00
614
原创 3.7 Python 模块化与标准库精讲
本文介绍了Python模块化设计与标准库应用的核心知识。主要内容包括:1)Python模块与包的基本概念,详解了模块导入机制和__init__.py文件的作用;2)标准库核心模块的使用,涵盖os、sys系统接口,json、csv文件处理,datetime时间操作等;3)collections等数据处理模块的实用技巧。文章通过代码示例展示了如何构建可维护的Python工程,充分利用Python"内置电池"理念来提高开发效率,强调了模块化设计对代码维护和团队协作的重要性。
2025-09-20 08:00:00
707
原创 3.2 Python 迭代器与生成器的底层原理
Python中的迭代器与生成器 迭代器和生成器是Python实现惰性计算的核心工具,能够高效处理大数据或流式数据。迭代器通过__iter__和__next__方法实现按需访问,而生成器通过yield关键字更简洁地实现相同功能,自动保存状态。两者都支持for循环和next()调用,但生成器代码更简洁、内存效率更高。生成器还支持.send()传值和.throw()异常处理等高级特性。性能测试表明生成器执行更快、内存占用更少,特别适合处理大型数据集或无限序列。这些特性使它们成为Python高效编程的重要组成部分。
2025-09-19 08:00:00
717
原创 3.4 Python 闭包函数与工厂函数
闭包(Closure)和工厂函数(Factory Function)是Python中利用函数作为第一类对象的特性实现的重要技术。闭包通过__closure__属性记住外层作用域的变量,即使外层函数已执行完毕;工厂函数则通过返回闭包实现动态生成特定功能的函数。两者结合可用于状态管理(如计数器)、行为定制(如幂运算工厂)以及装饰器等场景。例如,装饰器本质是带参数的闭包工厂,而闭包还能简化回调函数和配置化函数的实现。这些技术以轻量级的方式替代类,提升代码的灵活性与复用性。
2025-09-19 08:00:00
962
原创 3.3 Python 函数装饰器详解
Python函数装饰器详解 装饰器是Python中在不修改函数源代码的情况下增强函数功能的强大工具。它通过@符号语法实现,本质上是一个高阶函数,接受函数作为参数并返回新函数。装饰器在函数定义时立即执行,可通过functools.wraps保留原函数元信息。 装饰器分为基础装饰器、带参数装饰器和类装饰器。基础装饰器直接包装函数;带参数装饰器通过装饰器工厂函数实现;类装饰器则通过实现__call__方法来工作。多个装饰器可链式调用,按从下到上的顺序应用。 典型应用场景包括日志记录、性能测试、权限校验等。
2025-09-19 08:00:00
1050
原创 2.10 Python 命名空间与作用域解析
本文深入探讨了Python中的命名空间和作用域机制,重点解析了变量查找的LEGB规则(Local局部、Enclosing闭包、Global全局、Built-in内置)。通过代码示例展示了global和nonlocal关键字的使用场景,并详细介绍了闭包原理及其在函数工厂、装饰器中的应用。文章还分析了类命名空间特性和方法解析顺序,最后通过银行账户系统的闭包实现案例,展示了命名空间在实际项目中的应用。理解这些核心概念对掌握Python编程至关重要,能帮助开发者避免常见错误并编写更高效的代码。
2025-09-18 08:00:00
589
原创 2.11 Python 实战项目:面向对象银行账户管理系统(多账户类型继承)
本文介绍了一个基于Python面向对象编程的银行账户管理系统设计与实现。系统支持多种账户类型(储蓄、支票、高级账户),通过继承和多态实现代码复用,并利用异常处理确保健壮性。项目包含账户管理、交易功能、系统管理等模块,采用分层架构设计,包括账户基类、异常类和实用工具类。系统提供完整的银行操作功能,如存款、取款、转账和利息计算,同时实现账户特定属性和安全验证机制。
2025-09-18 08:00:00
641
原创 3.1 Python 列表推导式与生成器表达式
Python的列表推导式和生成器表达式提供了简洁高效的数据处理方式。列表推导式用[]创建完整列表,适合数据量小且需多次访问的场景;生成器表达式用()实现惰性计算,内存效率高,适合处理大数据。两者支持条件过滤、嵌套循环等操作,还可拓展为字典/集合推导式。选择依据主要取决于数据规模、内存限制和访问需求,列表推导式更通用,生成器表达式更节省资源。高级应用包括嵌套处理、函数集成和多迭代对象操作,能显著提升代码可读性和性能。
2025-09-18 08:00:00
1097
原创 【中等】力扣算法题解析LeetCode399:除法求值
LeetCode 399题通过图论建模解决除法求值问题。将变量作为节点,等式关系转化为带权有向边(如 a/b=2 对应边 a→b 权重2,b→a 权重0.5)。核心解法采用带权并查集: 预处理:变量名映射为ID,初始化并查集(父节点为自身,权重1.0); 合并操作:处理等式时动态更新根节点和路径权重(如 A/B=v 则合并根节点,权重调整为 (v×weight[B])/weight[A]); 查询处理:检查变量存在性及连通性,同根时结果为两节点权重比值。 优化点:路径压缩与权重同步更新,确保查询高效
2025-09-17 12:00:00
738
原创 【中等】力扣算法题解析LeetCode400:第 N 位数字
LeetCode 400题要求在无限整数序列123456789101112...中找到第n位数字。核心解法分三步:1)通过循环减去各组位数(1位9数,2位180位等)确定n所在数字的位数k;2)计算目标数字num = 10^(k-1) + (n-1)/k;3)取数字的第(n-1)%k位。Java实现利用digit、start、count变量高效定位,时间复杂度O(log₁₀n)。例如,n=10返回'1'(来自数字10的首位)。该算法避免遍历,适用于n≤2³¹-1的大数场景。关键词: 位数分组、数学定位、
2025-09-17 12:00:00
1484
原创 2.7 Python 抽象类与接口的实现
Python通过抽象基类(ABC)实现抽象类和接口功能。抽象类定义规范但不完全实现,可包含具体和抽象方法;接口则只定义方法签名。关键区别在于:抽象类支持部分实现和单继承,而接口允许多继承且无实现。在Python中,使用abc模块创建抽象基类,@abstractmethod装饰器标记必须实现的方法。通过多重继承可实现多个接口。这种设计提高了代码灵活性,强制子类遵循契约,同时保持实现的多样性。
2025-09-17 08:00:00
1151
原创 2.8 Python 中的异常处理与自定义异常
Python异常处理通过try、except、else、finally等关键字捕获和处理程序运行时的错误。内置异常如ValueError、FileNotFoundError等覆盖常见错误场景,开发者也可通过继承Exception类创建自定义异常(如银行账户中的InsufficientFundsError)。异常处理最佳实践包括精准捕获异常类型、使用logging记录错误、合理利用上下文管理器(with语句)确保资源释放。结合raise主动抛出异常和异常链(raise from),可构建更健壮的程序逻辑
2025-09-17 08:00:00
691
原创 2.9 Python 模块与包的导入机制
Python模块与包系统是组织代码的重要机制,通过模块(.py文件)和包(包含__init__.py的目录)实现代码的模块化。模块可以包含类、函数和变量,支持多种导入方式(import、from...import),并通过__name__属性区分直接运行或导入。包通过目录结构组织相关模块,__init__.py文件用于初始化包。Python解释器按特定路径搜索模块,支持相对导入和绝对导入。文章以银行账户系统为例,展示了如何构建模块化项目结构,包括异常处理、账户基类等组件,体现了Python代码组织的最佳实践
2025-09-17 08:00:00
556
原创 【中等】力扣算法题解析LeetCode398:随机数索引
LeetCode 398要求设计一个类,支持从含重复元素的数组中随机返回目标值的索引,且每个索引概率相等。本文提出基于哈希表的解决方案:初始化时构建值到索引列表的映射(O(n)时间),查询时通过随机数生成器直接获取索引(O(1)时间)。该方法满足高频调用需求,空间复杂度O(n)。代码使用Java实现,包含哈希表预处理和等概率随机选择逻辑,提交结果显示高效性能。 关键词: 随机索引、哈希表、等概率、预处理优化、O(1)查询
2025-09-16 12:00:00
1113
原创 2.4 Python 封装、继承、多态:面向对象的三大支柱
本文深入讲解面向对象编程的三大核心概念:封装、继承和多态。封装通过访问控制(public/protected/private)和属性装饰器保护数据安全,如银行账户管理系统中的敏感信息。继承实现代码复用,通过父类BankAccount派生出SavingsAccount等子类,重写属性和方法(如提高利率)。多态则允许不同子类对象统一调用父类接口。这三大支柱共同构建了模块化、可扩展的代码架构,以银行账户系统为例展示了实际应用场景。
2025-09-16 08:00:00
1052
LeetCode301至400题-力扣算法测试源码解析(Java版)
2025-08-17
LeetCode201至300题-力扣算法测试源码解析(Java版)
2025-08-14
LeetCode101至200题-力扣算法测试源码解析(Java版)
2025-08-14
LeetCode1至100题-力扣算法测试源码解析(Java版)
2025-08-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅