大师兄的Python学习笔记(四): Python的内置函数

大师兄的Python学习笔记(三): 模块和包
大师兄的Python学习笔记(五): 常用库之os包

一、关于内置函数

  • 内置函数就是Python原生的方法,不需要导入任何包就可以直接使用。
  • 本文内容基于Python3.8文档。

二、内置函数列表

A开头:

1)abs(<int>)
返回绝对值。

>>>print(abs(-10))
10

2)all(<iterable>)

  • 判断给定的可迭代参数中的所有元素是否都为 True。
>>>l = [123,0<5,'str'] # 还记得0可以代表False吗
>>>print(all(l))
True

>>>l = [True,0,'str'] # 还记得0可以代表False吗
>>>print(all(l))
False

3)any(<object>)

  • 判断给定的可迭代参数中,如果任意一个元素为 True则返回True。
>>>l = [True,0,'str']
>>>print(any(l))
True

4)ascii(<object>)

  • 类似print()函数,用于打印字符串。
  • 但转义字符和''也会被处理后打印出来
>>>ascii('Hello\r World\n')
"'Hello\\r World\\n'"
B开头:

5)bin(<int>)

  • 将一个整数转变为一个前缀为“0b”的二进制字符串。
>>>print(bin(-10))
'-0b1010'

6)bool(<int>)

  • 返回一个布尔值。
>>>bool(0)
False

7)breakpoint(<*args>,<**kws>)

  • 打断点,跳入调试器中。
>>>breakpoint()
--Return--
<input>(1)<module>()->None
(Pdb) 

8)bytearray(<source>,<encoding>,<errors>)

  • 返回一个新字节数组。
  • 返回的字节数组具备可变序列的大部分常见方法(像list)。
  • 每个元素的值范围: 0 <= x < 256。
>>>bytearray([1,2,3,4,5])
bytearray(b'\x01\x02\x03\x04\x05')

>>>bytearray('hello','utf-8')
bytearray(b'hello')

9)bytes(<source>,<encoding>,<errors>)

  • 返回一个新的bytes对象。
  • 返回的bytes对象为不可变序列。
  • 每个元素的值范围: 0 <= x < 256。
>>>bytes([1,2,3,4,5])
b'\x01\x02\x03\x04\x05'

>>>bytes('hello','utf-8')
b'hello'
C开头:

10)callable(<object>)

  • 如果对象可以调用返回True,否则返回False。
>>>print(callable(callable))
True

>>>print(callable(callable(1234))
False

11)chr(<int>)

  • 返回 Unicode 码对应的字符串。
  • ord()和chr()互逆。
>>>print(chr(100))
'd'

12)@classmethod

  • 把一个方法封装成类方法。
  • 类方法会忽略实例化。
  • 方便直接从类调用方法。
  • 应用了装饰器。
>>>class HelloWorld():
>>>    @classmethod
>>>    def sayHello(cls):
>>>        print('Hello World!')
>>>HelloWorld.sayHello()
Hello World!

>>>h = HelloWorld()
>>>h.sayHello() # 忽略了类的实例化
Hello World!

13)compile(<source>, <filename>, <mode>, <flags=0>, <dont_inherit=False>, <optimize=-1>)

  • 将一个字符串编译为字节代码。
>>>str = 'print("hello world")'
>>>s = compile(str,'','exec') # mode可以用eval,exec或single
>>>print(s) # 生成了一个code对象
<code object <module> at 0x000001FF125CB9C0, file "", line 1>
>>>exec(s) # 可以用exec 或eval执行
hello world

14)complex(<real>,<imag>)

  • 创建一个值为 real + imag * j 的复数
>>>c = complex(10,20)
>>>print(c)
(10+20j)
D开头:

15)delattr(<object>, <name>)

16)dict(<object>)

17)dir(<object>)

  • dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
>>>dir()
>>>['In', 'Out', '_', '__', '___', '__builtin__', '__builtins__', '__doc__', '__loader__', '__name__', __package__', '__spec__', '_dh', '_i', '_i1', '_ih', '_ii', '_iii', '_oh', 'exit', 'get_ipython','quit']

>>>dir(dir())
>>>['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

18)divmod(<a>,<b>)

  • 实现a除以b,然后返回商与余数的元组。
  • 如果两个参数a,b都是整数,那么会采用整数除法,结果相当于(a//b, a % b)。
  • 如果a或b是浮点数,相当于(math.floor(a/b), a%b)。
>>>c = divmod(98,10)
>>>print(c)
(9, 8)

>>>d = divmod(98,4.5)
>>>print(d)
(21.0, 3.5)
E开头:

19)enumerate(<iterable>, <start=0>)

  • 返回一个可迭代对象的序号和值元组的迭代器。
>>>dogs = ['雪纳瑞','泰迪','金毛','拉布拉多']
>>>e = enumerate(dogs)
>>>print(type(e))
<class 'enumerate'>
>>>list(e)
[(0, '雪纳瑞'), (1, '泰迪'), (2, '金毛'), (3, '拉布拉多')]

20)eval(<expression>, <globals or locals>)

  • 执行一个字符串表达式,并返回表达式的值。
  • 使用时要注意其危险性。(比如从外部输入的恶意字符串表达式被执行)
>>>print(eval('10+10'))
20
>>>eval('print("Hello World!")')
"Hello World!"

21)exec(<expression>, <globals or locals>)

  • 如果expression是一个字符串,该字符串会先被解析为一组python语句,然后执行。
  • 如果expression是一个code对象,那么它只是被简单的执行。
  • 与eval不同,exec返回None。
  • 与eval不同,exec可以执行复杂的代码。
>>>i = 0
>>>e = exec('i+=10')
>>>print(e)
None
>>>print(i)
10

>>>exec('def sayhi():print("hi!")')
>>>sayhi()
hi!
F开头:

22)filter(<function>, <iterable>)

  • 用于过滤序列。
  • 相当于把<iterable>中的每个值当做<function>的参数,如果返回None则过滤掉。
  • 返回一个可迭代的filter对象。
>>>l = [1,2,3,4,5,6,7,8,9,10]
>>>def odd(n):
>>>    return n%2!=0 # 如果是偶数就过滤掉
>>>f = filter(odd,l)
>>>print(type(f))
filter
>>>print(list(f))
[1, 3, 5, 7, 9]

23)float(<x>)

  • 从整数或字符串生成浮点数。
>>>float('-10.5')
-10.5
>>>float(100)
100.0
>>>float('1e10')
10000000000.0

24)format(<value>, <format_spec>)

  • 用于格式化字符串。
  • 详细说明见笔记第一篇2.6.6中字符串格式化的五种方式。

25)frozenset(<iterable>)

  • 通过可迭代对象返回一个新的 frozenset(冰冻集合)对象。
  • 冰冻集合和列表类似,但是内容不能更改。
>>>l = [1,2,3,4,5]
>>>f = frozenset(l)
>>>type(f)
frozenset
>>>print(f)
frozenset({1, 2, 3, 4, 5})
G开头:

26)getattr(<object>, <name>, <default>)

27)globals()

H开头:

28)hasattr(<object>, <name>)

  • 判断对象<object>是否包含属性<name>。
  • <name>是名称字符串。
>>>class Dog():
>>>    def __init__(self):
>>>        self.type = 'dog'
>>>    def bart(self):
>>>        print('汪汪!')
>>>dog = Dog()
>>>hasattr(dog,'type')
True
>>>hasattr(dog,'bart')
True
>>>hasattr(dog,'age') # 不包含属性
False

29)hash(<object>)

  • 返回对象的哈希(hash)值。
  • 哈希值通过散列算法将任意长度的值换算成固定长度的结果,是区块链的基础。
>>>print(hash('abc'))
-5769367521816172114

30)help(<object>)

31)hex(<x>)

  • 获取16进制字符串。
  • 以0x开头
>>>print(hex(12))
'0x14'
I开头:

32)id(<object>)

  • 获取对象的内存地址。
  • 一个对象在生命周期内id是唯一的。
  • 在不同的生命周期有可能有相同的id。
>>>name = 'name'
>>>print(id(name))
2223950523000

33)input(<prompt>)

  • 获取控制台输入。
  • <promt>是输入提示。
>>>name = input('请输入你的姓名:')
请输入你的姓名:superkmi
>>>print(name)
superkmi

34)int(<x>)

  • 将一个字符串或数字转换为整型。
>>>print(int('123'))
123
>>>print(int(14.2))
14

35)isinstance(<object>, <classinfo>)

  • 判断<object>是否和<classinfo>是同一个类型。
  • 与type不同,isinstance包括继承。
>>>print(isinstance(1,int))
True
>>>print(isinstance(1,str))
False

>>>class Animal():
>>>    pass
>>>class Dog(Animal):
>>>    pass
>>>print(type(Dog()) == type(Animal))
False
>>>print(isinstance(Dog(),Animal))
True

36)issubclass(<class>, <classinfo>)

  • 判断<object>是否是<classinfo>的子类。
>>>class Animal():
>>>    pass
>>>class Dog(Animal):
>>>    pass
>>>print(issubclass(Dog,Animal))
True
>>>print(issubclass(Animal,Dog))
False

37)iter(<object>, <sentinel>)

  • 用来生成迭代器。(迭代器在高级语法部分)
>>>l = [1,2,3,4,5]
>>>l_iter = iter(l)
>>>print(next(l_iter))
1
>>>print(next(l_iter))
2
>>>print(next(l_iter))
3
  • 如果传递了第二个参数,则object必须是一个可调用的对象(如,函数)。此时,iter创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用object,且返回值为<sentinel>时停止。
>>>import random # 导入random包
>>>def randomInt():
>>>    l = [1,2,3,4,5]
>>>    return random.choice(l) # 返回l中一个随机值
>>>for i in iter(randomInt, 4): # 当返回值为4时就停止了
>>>    print(i)
5
1
3
L开头:

38)len(<s>)

  • 返回对象的长度。
>>>print(len('abcdefg'))
7
>>>print(len([1,2,3,4,5,6]))
6
>>>print(len({'a','b','c','d','e'}))
5
>>>print(len(range(1,10)))
9

39)list()

40)locals()

  • 以字典类型返回当前位置的全部局部变量。
>>>def sayHello():
>>>    word = 'Hello World!'
>>>    num = 1
>>>    print(locals())
>>>sayHello()
{'word': 'Hello World!', 'num': 1}
M开头:

41)map(<function>, <iterable>, ...)

  • 根据提供的函数<function>对指定序列<iterable>做映射。
  • 返回迭代器。
>>>i = [1,2,3,4,5]
>>>def triple(x):
>>>    return x*3
>>>print(list(map(triple,i)))
[3, 6, 9, 12, 15]

42)max(<iterable>, < key>,<default>)

  • 返回给定参数的最大值。
  • <key>用来指定取最大值的方法。
  • <default>为最大值不存在时返回的默认值。
>>>l1 = [1,2,3,4,5,6,7]
>>>print(max(l1))
7

>>>l2 = ['a','b','c','d','e']
>>>print(max(l2))
'e'

>>>l3 = [1.5,4.3,2.5,100.3,-34,-10000]
>>>print(max(l3,key=abs)) # 比较绝对值
-10000

>>>print(max((),default=0))
0

43)memoryview(<obj>)

  • 返回给定参数的内存查看对象。
  • <obj>为byte。
>>>print(memoryview(b'abc'))
<memory at 0x0000018A6F55F1C8>

44)min(<iterable>, < key>,<default>)

  • 返回给定参数的最小值。
  • <key>用来指定取最小值的方法。
  • <default>为最小值不存在时返回的默认值。
>>>l1 = [1,2,3,4,5,6,7]
>>>print(min(l1))
1

>>>l2 = ['a','b','c','d','e']
>>>print(min(l2))
'a'

>>>l3 = [1.5,4.3,2.5,100.3,-34,-10000]
>>>print(min(l3,key=abs)) # 比较绝对值
1.5

>>>print(min((),default=0))
0
N开头:

45)next(<iterator>, <default>)

  • 返回迭代器的下一个值。
  • 如果迭代器耗尽,则返回给定的 default。
  • 如果没有默认值则触发StopIteration。
>>>l = [1,2,3,4,5]
>>>l_iter = iter(l)
>>>print(next(l_iter))
1
>>>print(next(l_iter))
2
>>>print(next(l_iter))
3

>>>l = [1,2]
>>>l_iter = iter(l)
>>>print(next(l_iter))
1
>>>print(next(l_iter))
2
>>>print(next(l_iter,'no more element.'))
no more element.
O开头:

46)object()

>>>obj = object()
>>>dir(obj)
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>>type(obj)
object

47)oct(<x>)

  • 将一个整数转变为一个前缀为“0o”的八进制字符串。
>>>print(oct(10))
'0o12'
>>>print(oct(0x16))
'0o26'

48)open(<file>, <mode='r'>, <buffering=-1>, <encoding=None>, <errors=None>, <newline=None>, <closefd=True>, <opener=None>)

  • 用于文件操作。
  • <file>文件路径。
  • <mode> 表示打开的目的是读/写,包含w/r/wb/rb等类型。
  • <buffering> 缓冲策略
  • <encoding> 解码方式
  • <errors> 指定如何处理编码和解码错误
  • <newline> 定义换行符
>>>import os
>>>path = os.path.join(os.curdir,'test','filename.txt') # 制作文件路径
>>>data = open(path,'r') # 读取文件中的数据

49)ord(<c>)

  • ord()返回代表Unicode字符的整数。
  • ord()和chr()互逆。
>>>print(ord('a'))
97
P开头:

50)pow(<base>, <exp>, <mod>)

  • 求<base>的<exp>次方。
  • 如果<mod>存在则取模。
  • 等同于(<base>^<exp>)%<mod>
>>>print(pow(10,2))
100

>>>print(pow(14,3,3)) # 14的3次方取模3
2

51)print(<objects>, <sep=' '>, <end='\n'>, <file=sys.stdout>, <flush=False>)

  • 基础说明见笔记第一篇
  • 用于将<objects>输出到<file>中。
  • <sep>表示分隔符,默认为空的字符串。
  • <end>表示以什么结尾,默认为换行符。
  • <file> 表示输出的目标,默认为控制台输出流。
  • <flush> 是否在print()后,即使在条件未满足的情况下,立即将内容输出。
>>>with open('filename.txt','w') as f: # 创建一个新文件并写入内容。
>>>    print('hello',file=f,flush=True)  # 将内容输入到文件中。正常是文件close时写入,如果flush=True则立即写入。

52)property(<fget=None>, <fset=None>, <fdel=None>, <doc=None>)

R开头:

53)range(<start>, <stop>, <step>)

54)repr(<object>)

  • 将对象转化为供解释器读取的形式。
  • 可以和eval()配合用来在数据结构和字符串之间转换。
>>>list = [1,2,3,4,5,'hello','world']
>>>repr(list)
"[1, 2, 3, 4, 5, 'hello', 'world']"

>>>str = 'Hello World!'
>>>repr(str)
"'Hello World!'"

55)reversed(<seq>)

  • 返回一个反向的 iterator
>>>l = [1,2,3,4,5]
>>>rl = reversed(l)
>>>print([x for x in rl])
[5, 4, 3, 2, 1]

>>>str = 'hello world'
>>>rstr = reversed(str)
>>>print([x for x in rstr])
['d', 'l', 'r', 'o', 'w', ' ', 'o', 'l', 'l', 'e', 'h']

56)round(<number>, <ndigits>)

  • 返回<number>四舍五入的值。
  • <ndigits>指保留小数点几位。
>>>print(round(3.1415926,2))
3.14
S开头:

57)set(<iterable>)

58)setattr(<object>, <name>, <value>)

59)slice(<start>, <stop>, <step>)

  • 实现切片对象,主要用在切片操作函数里的参数传递。
  • <start>起始位置。
  • <stop>结束位置。
  • <step>间距。
>>>l = [1,2,3,4,5,6,7]

>>>slice1 = slice(3) # 3个元素
>>>print(l[slice1])
[1, 2, 3]

>>>slice2 = slice(3,7) # 3到7之间
>>>print(l[slice2])
[4, 5, 6, 7]

60)sorted(<iterable>, *, <key=None>, <reverse=False>)

  • 将<iterable>排序后返回。
  • <key> 指定可迭代对象中的一个元素来进行排序。
  • <reverse> = True时反向排序。
>>>l = [5,3,2,1,3,2,3,9,7,5]
>>>print(sorted(l))
[1, 2, 2, 3, 3, 3, 5, 5, 7, 9]

>>>print(sorted(l,reverse=True)) # 反向排序
[9, 7, 5, 5, 3, 3, 3, 2, 2, 1]

>>>l = [(1,'b'),(9,'a'),(4,'d'),(20,'g')]
>>>print(sorted(l,key=lambda x:(x[1]))) # 用第二个参数排序
[(9, 'a'), (1, 'b'), (4, 'd'), (20, 'g')]

61)@staticmethod

  • 将方法转换为静态方法。
  • 静态方法不强制要求传递参数(self,cls)。
>>>class Mountain():   
>>>    @staticmethod
>>>    def echo(voice):
>>>        print(voice)
>>>m = Mountain()
>>>m.echo('Hello World!') # 通常对象会将自身作为第一个参数返回。
Hello World!

62)str(<object=b''>, <encoding='utf-8'>, <errors='strict'>)

  • 返回一个str版本的<object>。
>>> l = [1,2,3,4,5]
>>> str(l)
'[1, 2, 3, 4, 5]'

>>> d = {'A':1,'B':2,'C':3}
>>> str(d)
"{'A': 1, 'B': 2, 'C': 3}"

63)sum(<iterable>,<start=0>)

  • 获得迭代对象的和。
  • 在和之后再加<start>。
>>>l = [1,2,3,4,5]
>>>sum(l)
15
>>>sum(l,2)
17

64)super(<type>, <object-or-type>)

T开头:

65)tuple(<iterable>)

66)type(<name>, <bases>, <dict>)

  • 返回对象类型。
  • 与isinstance()的区别是:type()不会考虑子类的情况。
  • 详情见笔记第一篇1.7.3。
V开头:

67)vars(<object>)

  • 返回<object>的属性和属性值的__dict__对象。
  • 如果没有参数,就打印当前调用位置的属性和属性值 类似 locals()。
>>>class Dog():
>>>    name = 'dog'
>>>print(vars(Dog))
mappingproxy({'__module__': '__main__',
             'name': 'dog',
             '__dict__': <attribute '__dict__' of 'Dog' objects>,
             '__weakref__': <attribute '__weakref__' of 'Dog' objects>,
             '__doc__': None})
Z开头:

68)zip(*<iterables>...)

  • 将多个可迭代对象一一对应,打包成一个个元组。
  • 返回值的长度以最短的可迭代对象长度为准。
  • 返回的是一个可迭代zip对象。
>>>s = ['a','b','c','d']
>>>n = [1,2,3,4,5,6,7,8,9]
>>>y = ['hello','How','are','you']
>>>print(list(zip(s,n,y)))
[('a', 1, 'hello'), ('b', 2, 'How'), ('c', 3, 'are'), ('d', 4, 'you')]
其它:

69)__import__(<name>, <globals=None>, <locals=None>, <fromlist=()>, <level=0>)

  • 用于动态加载类和函数 。
  • 如果一个模块经常变化就可以使用 import() 来动态载入。
  • 效果类似import语句
  • 这个函数一般用不到。
>>>sys = __import__('sys')
>>>sys.path
>>>['C:\\Users\\xiaor',
>>> 'd:\\python3.7\\python37.zip',
>>> 'd:\\python3.7\\DLLs',
>>> 'd:\\python3.7\\lib',
>>> 'd:\\python3.7',]

参考资料



本文作者:大师兄(superkmi)


梦幻微武侠
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,924评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,902评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,716评论 0 239
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,783评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,166评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,510评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,784评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,476评论 0 196
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,196评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,459评论 2 243
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,978评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,321评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,964评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,046评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,803评论 0 193
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,530评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,420评论 2 265

推荐阅读更多精彩内容