
Python
文章平均质量分 87
rayylee
awk 'BEGIN{O="o"~"o";o="O"=="O";O+=+o;o_+=o""o;for(;++_o!=o_-O;)O_=O_"%c";printf(O_,o_*(o_-o)+O+O,o_*(o_-O)-O,o_*o_,o_*o_,o_*(o_-o)-O,o_*(o_-O)+O,o_*(o_-O)+O,o_-o)}'
展开
-
Python中的彩蛋
Python当然能让你上天!没试过?别担心,我来教你。和Python里的其他东西一样,它非常简单。你只需要敲入下面这行反重力代码import antigravity这是啥?这是个彩蛋。import antigravity将打开一个指向经典XKCD漫画的网页(source:https://xkcd.com/353/),里面提到了Python。你知道吗,开发者并没有止步于此,彩蛋里还有一个彩蛋。如果你查看代码(source:https://github.com/python/cpython/blob原创 2021-03-15 14:16:52 · 942 阅读 · 0 评论 -
Python可变参数、关键字参数及命名关键字参数
1. 可变参数可变参数就是允许在调用参数的时候传入多个(≥0个)参数# 可变参数,参数nums接收到的是一个tuple(这些参数在传入时被自动组组装为一个元祖)def calc(*nums): sum = 0 for n in nums: sum += n return sum>>> calc(1, 2, 3)7>>> my_ls = [1,2,3]>>> calc(*my_ls)72. 关原创 2020-12-24 13:38:09 · 466 阅读 · 0 评论 -
华为笔试题-磁盘容量排序
题目大意磁盘的容量单位有M、G、T,其关系为 1T = 1000G、1G = 1000M,如样例所示先输入磁盘的个数,再依次输入磁盘的容量大小,然后按照从小到大的顺序对磁盘容量进行排序并输出。例如:输入:320M1T300G输出:20M300G1T解法:#!/usr/bin/env python3# -*- coding: utf-8 -*-"""array = [0] * 5for i in range(0, len(array)): print(array[i原创 2020-12-15 11:44:59 · 2689 阅读 · 0 评论 -
强化学习Q-Learning算法及实现详解
本教程通过一个简单但全面的示例介绍Q-learning的概念。 该示例描述了一个使用无监督学习的过程。假设我们在一个建筑物中有5个房间,这些房间由门相连,如下图所示。 我们将每个房间编号为0到4。建筑物的外部可以视为一个大房间(5)。 请注意,1号和4号门从5号房间(外部)通向建筑物。我们可以在图表上表示房间,每个房间作为节点,每个门作为链接。对于此示例,我们想在任何房间中放置一个门,然后从该房间进入建筑物外(这将是我们的目标房间)。换句话说,目标房间是5号。要将此房间设置为目标,我们会将奖励值关翻译 2020-10-14 22:54:56 · 5782 阅读 · 3 评论 -
自动驾驶模拟器Carla之python编程-(3)获取汽车摄像头数据
在上节我们已经创建了一个可以形式的特斯里model3,在本节,我们将给汽车上添加摄像头。了解更多有关各种传感器以及如何使用它们的信息:Carla Sensors。现在,我将仅展示如何使用RGB相机。1. 创建摄像头在脚本的顶部,让我们设置几个常量:IM_WIDTH = 640 IM_HEIGHT = 480 现在,我们加载传感器的蓝图并设置一些属性: # https://carla.readthedocs.io/en/latest/cameras_and_sensors翻译 2020-10-13 22:14:19 · 4122 阅读 · 5 评论 -
自动驾驶模拟器Carla之python编程-(2)控制汽车
在本节,我们将向您介绍Carla的Python API。Carla中有几种类型的对象。首先,您当然拥有world(世界),这就是你的环境。这样,您便拥有了这个世界中的actors(角色)。角色诸如汽车、汽车上的传感器、行人等之类的东西。最后,我们有blueprints(蓝图)。蓝图是我们角色的属性。有了这些信息,让我们开始编写一些实际的代码。首先,让我们制造一辆可以生成汽车并简单地向前行驶的汽车,然后我们希望从常规RGB相机中查看信息,并将其放置在汽车引擎盖上。1. 导入carla及其他依赖包代码的翻译 2020-10-13 21:48:38 · 5855 阅读 · 5 评论 -
自动驾驶模拟器Carla之python编程-(1)简介
欢迎来到涵盖Carla的系列教程,这是一个开放源代码的自动驾驶环境,还附带了与之交互的Python API。Carla拥有环境(服务器),然后具有代理(客户端)。 这种服务器/客户端架构意味着我们可以在同一台计算机上本地运行服务器和客户端,也可以在一台计算机上运行环境(服务器),在多台其他计算机上运行多个客户端。有了Carla,我们(显然)得到了一辆汽车,一个可以开车的环境,然后我们可以在汽车上放置一堆传感器,以模拟现实生活中的自动驾驶汽车传感器。 诸如激光雷达、照相机、 加速度计等之类的东西。我们翻译 2020-10-13 21:05:21 · 2923 阅读 · 0 评论 -
数据结构及算法之快速排序-python实现
1. 快速排序介绍快速排序(Quick Sort)使用分治法策略。它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。快速排序流程:从数列中挑出一个基准值。将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。递归地把"基准值前原创 2020-09-28 16:43:19 · 254 阅读 · 0 评论 -
改善Python程序的91个建议(二)
接上: 改善Python程序的91个建议(一)建议 24:遵循异常处理的几点基本原则异常处理的几点原则:注意异常的粒度,不推荐在 try 中放入过多的代码谨慎使用单独的 except 语句处理所有异常,最好能定位具体的异常注意异常捕获的顺序,在适合的层次处理异常,Python 是按内建异常类的继承结构处理异常的,所以推荐的做法是将继承结构中子类异常在前抛出,父类异常在后抛出使用更为友好的异常信息,遵守异常参数的规范建议 25:避免 finally 中可能发生的陷阱当 finally 执行翻译 2020-08-15 12:42:27 · 251 阅读 · 0 评论 -
改善Python程序的91个建议(一)
第 1 章 引论建议 1:理解 Pythonic 概念PythonicTim Peters 的 《The Zen of Python》相信学过 Python 的都耳熟能详,在交互式环境中输入import this可以查看,其实有意思的是这段 Python 之禅的源码:d = {}for c in (65, 97): for i in range(26): d[chr(i+c)] = chr((i+13) % 26 + c)print "".join([d.get(c,翻译 2020-08-15 12:32:39 · 905 阅读 · 0 评论 -
软件设计原则及设计模式
软件设计原则及设计模式原创 2020-06-26 21:28:32 · 325 阅读 · 0 评论 -
python设计模式21-策略模式
1. 策略模式(Strategy)介绍UML类图角色介绍封装类:也叫上下文,对策略进行二次封装,目的是避免高层模块对策略的直接调用。抽象策略:通常情况下为一个接口,当各个实现类中存在着重复的逻辑时,则使用抽象类来封装这部分公共的代码,此时,策略模式看上去更像是模版方法模式。具体策略:具体策略角色通常由一组封装了算法的类来担任,这些类之间可以根据需要自由替换。用途定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。优点策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他原创 2020-06-26 18:14:38 · 237 阅读 · 0 评论 -
python设计模式19-观察者模式
1. 观察者模式(Observer)介绍UML类图角色介绍被观察者:从类图中可以看到,类中有一个用来存放观察者对象的Vector容器(之所以使用Vector而不使用List,是因为多线程操作时,Vector在是安全的,而List则是不安全的),这个Vector容器是被观察者类的核心,另外还有三个方法:attach方法是向这个容器中添加观察者对象;detach方法是从容器中移除观察者对象;notify方法是依次调用观察者对象的对应方法。这个角色可以是接口,也可以是抽象类或者具体的类,因为很多情况下会原创 2020-06-26 18:09:11 · 351 阅读 · 0 评论 -
python设计模式22-模板模式
1. 模板模式(Template)介绍UML类图角色介绍抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。模版方法:由抽象类声明并加以实现。一般来说,模版方法调用抽象方法来完成主要的逻辑功能,并且,模版方法大多会定义为final类型,指明主要的逻辑功能在子类中不能被重写。钩子方法:由抽象类声明并加以实现。但是子类可以去扩展,子类可以通过扩展钩子方法来影响模版方法的逻辑。抽象类的任务是搭建逻辑的框架,通常由经验丰富的人员编写,因为抽象类的好坏直接决定了程序是否稳定性。原创 2020-06-26 16:57:13 · 373 阅读 · 0 评论 -
python设计模式20-状态模式
1. 状态模式(State)介绍UML类图应用场景行为状态改变的场景。这点在各种控制器中非常常见,同时,逻辑结构为状态转移图的场景中都非常适用。优点状态模式的优点是结构清晰,相比于if…else…简约了不少;封装性好,外部调用不必知道内部实现细节。缺点在状态比较多时,子类也会非常多,不便于管理。2. 示例电梯在我们周边随处可见,电梯的控制逻辑中心是由电梯控制器实现的。电梯的控制逻辑,即使简单点设计,把状态分成开门状态,停止状态和运行状态,操作分成开门、关门、运行、停止,那流原创 2020-06-26 15:00:15 · 270 阅读 · 0 评论 -
python设计模式18-备忘录模式
1. 备忘录模式(Memento)介绍UML类图角色介绍发起人:记录当前时刻的内部状态,负责定义哪些属于备份范围的状态,负责创建和恢复备忘录数据。备忘录:负责存储发起人对象的内部状态,在需要的时候提供发起人需要的内部状态。管理角色:对备忘录进行管理,保存和提供备忘录。用途在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态2. 示例我们在编程的时候,经常需要保存对象的中间状态,当需要的时候,可以恢复到这个状态。比如,我原创 2020-06-26 12:06:50 · 215 阅读 · 0 评论 -
python设计模式17-中介者模式
1. 中介者模式(Mediator)介绍UML类图角色介绍抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类。同事类:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。原创 2020-06-26 11:48:14 · 356 阅读 · 0 评论 -
python设计模式16-迭代器模式
1. 迭代器模式(Iterator)介绍UML类图角色介绍抽象容器:一般是一个接口,提供一个iterator()方法。具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前原创 2020-06-25 22:03:04 · 315 阅读 · 0 评论 -
python设计模式15-解释器模式
1. 解释器模式(Interpreter)介绍UML类图角色介绍Context:上下文环境,包含解释器之外的全局信息Client:客户端,解析表达式,构建语法树,执行具体的解释操作等AbstractExpression:抽象表达式,声明一个抽象的解释操作弗雷,并定义一个抽象的解释方案,其具体的实现在各个具体的子类解释器中完成。TerminalExpression:终结符表达式,实现文法中终结符有关的解释操作。文法中每一个终结符都有一个具体的终结表达式与之对应。NonterminalExpr原创 2020-06-25 21:31:23 · 326 阅读 · 0 评论 -
python设计模式12-代理模式
1. 代理模式(Proxy)介绍UML类图角色介绍Subject类,通过接口或抽象类声明真实角色实现的业务方法。Proxy类,实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作RealSubject,实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用代理模式的适用场景 一个设计模式,只有当它有了应用场景,它才具备存在的价值。代理模式有很多可以使用的场景,主要分为如下几类:远程代理:为一个对象的地址空间提供局部代表。虚拟代理:根据需原创 2020-06-25 20:59:51 · 256 阅读 · 0 评论 -
python设计模式11-享元模式
1. 享元模式(Flyweight)介绍UML类图角色介绍Flyweight:抽象享元类。ConcreteFlyweight:具体享元类,实现了Flyweight。指定内部状态。UnsharedConcreteFlyweight:非享元类。FlyweightFactory:享元创建工厂类。优点减少重复对象,大大节约了系统资源。缺点享元模式虽然节约了系统资源,但同时也提高了系统的复杂性,尤其当遇到外部状态和内部状态混在一起时,需要先将其进行分离,才可以使用享元模式。否则,会引起逻辑原创 2020-06-25 16:16:42 · 417 阅读 · 0 评论 -
python设计模式10-外观模式
1. 外观模式(Facade)介绍UML类图用途为子系统中的一组接口提供一个一致界面,此模式定义一个高层接口,使得子系统更加容易使用。优点实现了子系统与客户端之间的松耦合关系。客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。2. 示例#!/usr/bin/env python3# -*- coding: utf-8 -*-'''Facade Pattern with Python Code'''# 外观类class Fund(obj原创 2020-06-22 11:53:50 · 327 阅读 · 0 评论 -
python设计模式9-装饰器模式
1. 装饰器模式(Decorator)介绍UML类图装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可原创 2020-06-21 23:13:38 · 469 阅读 · 0 评论 -
python设计模式7-桥接模式
1. 桥接模式(Bridge)介绍UML类图桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。意图将抽象部分与实现部分分离,使它们都可以独立的变化。优点抽象和实现的分离。优秀的扩展能力。实现细节对客户透明。缺点桥接模式的引入会增加系统的理解与设计难度,由于聚合关联原创 2020-06-21 17:36:58 · 530 阅读 · 0 评论 -
python设计模式6-适配器模式
1. 适配器模式(Adapter)介绍UML类图适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口,Adapter Pattern使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。应用场景系统数据和行为都正确,但接口不符合时,目的是使控制范围之外的一个原有对象与某个接口匹配,适配器模式主要应用于希望复用一些现存的类,但接口又与复用环境不一致的情况。2. 示例'''Adapter Pattern with Python Code'''clas原创 2020-06-21 16:42:04 · 311 阅读 · 0 评论 -
python设计模式1-单例模式
1. 单例模式(Singleton)介绍UML类图单例模式的优点在内存中只有一个对象,节省内存空间。避免频繁的创建销毁对象,可以提高性能。避免对共享资源的多重占用。可以全局访问。适用场景由于单例模式的以上优点,所以是编程中用的比较多的一种设计模式。我总结了一下我所知道的适合使用单例模式的场景:需要频繁实例化然后销毁的对象。创建对象时耗时过多或者耗资源过多,但又经常用到的对象。有状态的工具类对象。频繁访问数据库或文件的对象。以及其他我没用过的所有要求只有一个对象的场景。2原创 2020-06-21 15:12:39 · 246 阅读 · 0 评论 -
python设计模式5-原型模式
1. 原型模式(Prototype)介绍UML类图原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需主要实现clone方法。原型模式是一种比较简单的模式,也非常容易理解。在实际应用中,原型模式很少单独出现,经常与其他模式混用。原型模式的优点及适用场景使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。使用原型模式的另原创 2020-06-21 12:27:57 · 565 阅读 · 0 评论 -
python设计模式4-建造者模式
1. 建造者模式(Builder)介绍UML类图四个要素产品类:一般是一个较为复杂的对象,也就是说创建对象的过程比较复杂,一般会有比较多的代码量。在本类图中,产品类是一个具体的类,而非抽象类。实际编程中,产品类可以是由一个抽象类与它的不同实现组成,也可以是由多个抽象类与他们的实现组成。抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交与它的子类来实现。这样更容易扩展。一般至少会有两个抽象方法,一个用来建造产品,一个是用来返回产品。建造者:实现抽象类的所有未实现的方法,具体来说一般是两项原创 2020-06-20 22:08:20 · 317 阅读 · 0 评论 -
python设计模式2-工厂方法模式
1. 工厂方法模式(FactoryMethod)介绍UML类图工厂模式工厂模式根据抽象程度的不同分为三种:简单工厂模式(也叫静态工厂模式)、本文所讲述的工厂方法模式、以及抽象工厂模式。工厂模式是编程中经常用到的一种模式。它的主要优点有:可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。对调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的原创 2020-06-20 21:45:49 · 397 阅读 · 0 评论 -
python设计模式3-抽象工厂模式
1. 抽象工厂模式(AbstractFactory)介绍UML类图抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。他与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。在编程中,通常一个产品结构,表现为一个接口或者抽象类,也就是说,工厂方法模式提供的所有产品都是衍生自同一个接口或抽象类,而抽象工厂模式所提供的产品则是衍生自不同的接口或抽象类。在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构原创 2020-06-20 21:23:48 · 859 阅读 · 0 评论 -
python设计模式8-组合模式
1. 组合模式(Composite)介绍UML类图角色介绍Component:为组合模式中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为,声明一个接口用于访问和管理其子组件;在递归结构中定义一个接口,用于访问一个父组件,并在合适的情况下实现。Leaf:在组合模式中表示叶节点对象,叶节点对象没有子节点,实现 Component 的所有方法。Composite:表示组合部件(注意部件带有子部件),实现操纵子部件的所有方法;实现所有在 Component 的操作。Client:通过原创 2020-06-20 18:14:19 · 774 阅读 · 0 评论 -
python设计模式13-责任链模式
1. 责任链模式(Chain of Responsibility)介绍UML类图定义使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。责任连模式的结构责任连模式的类图非常简单,它由一个抽象地处理类和它的一组实现类组成:抽象处理类:抽象处理类中主要包含一个指向下一处理类的成员变量nextHandler和一个处理请求的方法handRequest,handRequest方法的主要主要思想是,如果满足处理的条原创 2020-06-20 14:32:06 · 468 阅读 · 0 评论 -
python设计模式14-命令模式
1. 命令模式(Command)介绍UML类图角色介绍Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。Client类:最终的客户端调用类。Invoker类:调用者,负责调用命令。Receiver类:接收者,负责接收命令并且执行命令。2. 示例顾名思义,命令模式就是对命令的封装。所谓对命令的封装,说白了,无非就是把一系列的操作原创 2020-06-19 15:48:44 · 245 阅读 · 0 评论 -
Markdown绘制UML图
下面介绍一种可以在Markdown中使用的绘制UML工具 —— PlantUML,以及渲染引擎 Gravizo1. PlantUML简介可以登陆 PlantUML官网 看一下,里面有支持的UML类型以及使用方法。点击下载 使用 PlantUML 绘制 UML 语言参考指南 中文版[http://s.plantuml.com/PlantUML_Language_Reference_Guide_ZH.pdf]。2. 使用方法打开在线作图网址,在上面的代码框里面输入代码。完成后点击 Submit 按钮原创 2020-06-18 18:25:38 · 5458 阅读 · 1 评论 -
python设计模式23-访问者模式
访问者模式VisitorVisitor模式是在补修改已有程序结构前提下,通过添加额外的访问者完成对代码功能的拓展。为什么这样用?当你的类层次较多,在某层结构中增加新的方法,要是在基类上面添加或者变更,可能破坏原来的设计,有兼容问题,所以只在需要的类上面动态添加。这里是个构建车的例子,每个部件都有一个accept的方法接受我上面说的所谓’访问者’,而这个访问者以参数的方式传进来,但是其实他是一个含有一些功能的类的实例,它拥有很多个visit开头的方法对应不同的部件。这样就不需要修改这些部件,而只是修改原创 2020-06-16 18:18:56 · 467 阅读 · 0 评论 -
python可变类型与不可类型
python对象分为可变类型与不可变类型,常见的数字、字符串、元组是不可变数据类型,字典、列表是可变类型。1.元组是不可变数据类型,其值不可以修改2. 数字、字符串是不可变数据类型,虽然可以对变量进行重新赋值,但是实际上是重新创建了一个对象,a被修改后地址空间也变3. 列表、字典是可变数据类型,其值修改后,还指向同一内存地址...转载 2019-10-29 23:08:49 · 261 阅读 · 0 评论 -
Python注释风格--Google风格
注释Tip确保对模块, 函数, 方法和行内注释使用正确的风格文档字符串Python有一种独一无二的的注释方式: 使用文档字符串. 文档字符串是包, 模块, 类或函数里的第一个语句. 这些字符串可以通过对象的__doc__成员被自动提取, 并且被pydoc所用. (你可以在你的模块上运行pydoc试一把, 看看它长什么样). 我们对文档字符串的惯例是使用三重双引号”“”(PEP-...翻译 2019-04-18 18:05:00 · 4630 阅读 · 0 评论 -
Python修饰符--函数修饰符 “@”
Python函数修饰符,“@”,与其说是修饰函数倒不如说是引用、调用它修饰的函数。举个栗子,下面的一段代码,里面两个函数,没有被调用,也会有输出结果:def test(f): print "before ..." f() print "after ..." @testdef func(): print "func was called"直接运行,...转载 2019-04-18 17:58:45 · 920 阅读 · 0 评论 -
Python中的super()简单用法
如果在子类中也定义了_init_()函数,那么该如何调用基类的_init_()函数:方法一、明确指定:class C(P): def __init__(self): P.__init__(self) print 'calling Cs construtor'方法二、使用super()方法:class C(P)...转载 2019-04-18 17:51:58 · 239 阅读 · 0 评论