Python学习13:内置函数(一)

笔者原创,文章转载需注明,如果喜欢请点赞+关注,感谢支持!本文为Python函数学习系列第三篇,python的常用内置函数。

由于篇幅问题,目前官网基于python3.7.7一共包含69个内置函数,共分为3个章节进行讲解,每个章节包含23个内置函数,同时会重点讲解常用的的内置函数。

python官网关于内置函数的说明:https://docs.python.org/zh-cn/3.7/library/functions.html

 

目录

Python常用的内置函数

1. aba()

2. all()

3.any()

4.ascii()

5.bin()

6.bool()

7.breakpoint()

8.bytearray()

9.bytes()

10.callable()

11.chr()

12.classmethod

13.compile()

14.complex()

15.delattr()

16. dict()

17.dir()

18.divmod()

19.enumerate()

20.eval()

21.exec()

22.filter()

23.float()


 

Python常用的内置函数

什么是内置函数?

其实内置函数就是python自己内置、定义的一些函数。

比如我们常用的print()打印,intput()输出等等内置函数一样,pyhton官方给你设定好的函数,可以直接拿来用。

目前python官方一共给出69个内置函数。下面是python官方给出的所有已知最新的内置函数:传送门

下面的内容就根据字母顺序将常用的内置函数进行详细说明:

 

1. aba()

abs(x)

返回一个数的绝对值。实参可以是整数或浮点数。如果实参是一个复数,返回它的模。

说明:aba()绝对值函数,返回int类型。

举例:

a = -1
print(abs(a))
print(type(abs(a)))
1
<class 'int'>

2. all()

说明:all()函数用来判断所有元素为真,返回True。

all(iterable)

如果 iterable 的所有元素为真(或迭代器为空),返回 True 。等价于:

def all(iterable):
    for element in iterable:
        if not element:
            return False
    return True

any(iterable)

如果 iterable 的任一元素为真则返回 True。 如果迭代器为空,返回 False。 等价于:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

使用场景:all()函数一般应用场景在需要判断多个条件时,用all()函数。

举例:

list = '1,2,3'
print(all(list))
print(type(all(list)))
True
<class 'bool'>

3.any()

说明:all函数是判断所有元素,而any是判断任一元素为真则返回True。

any(iterable)

如果 iterable 的任一元素为真则返回 True。 如果迭代器为空,返回 False。 等价于:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

举例:

list = []
print(any(list))
list = [1]
print(any(list))
print(type(any(list)))
False
True
<class 'bool'>

4.ascii()

说明:aascii() 函数会将所有非 ascii 字符替换为转义字符,并返回任何对象(字符串,元组,列表等)的可读版本。

就像函数 repr(),返回一个对象可打印的字符串,但是 repr() 返回的字符串中非 ASCII 编码的字符,会使用 \x\u 和 \U 来转义。生成的字符串和 Python 2 的 repr() 返回的结果相似。

print(ascii('中国'))
print(type(ascii('中国')))
'\u4e2d\u56fd'
<class 'str'>

5.bin()

说明:bin()函数用于将一个整数转变为一个前缀为“0b”的二进制字符串。

将一个整数转变为一个前缀为“0b”的二进制字符串。结果是一个合法的 Python 表达式。如果 x 不是 Python 的 int 对象,那它需要定义 __index__() 方法返回一个整数。一些例子:

>>> bin(3)
'0b11'
>>> bin(-10)
'-0b1010'

如果不一定需要前缀“0b”,还可以使用如下的方法。

>>> format(14, '#b'), format(14, 'b')
('0b1110', '1110')
>>> f'{14:#b}', f'{14:b}'
('0b1110', '1110')

举例:

print(bin(99))
print(type(bin(99)))

 

0b1100011
<class 'str'>

备注:需要注意bin函数转换后返回值是字符串格式。


6.bool()

说明:bool()函数作用就是布尔类型转换。

bool()返回一个布尔值,True 或者 False。 x 使用标准的 真值测试过程 来转换。如果 x 是假的或者被省略,返回 False;其他情况返回 Truebool 类是 int 的子类(参见 数字类型 --- int, float, complex)。其他类不能继承自它。它只有 False 和 True 两个实例(参见 布尔值)。

在 3.7 版更改: x 现在只能作为位置参数。

举例:

print(bool())
print(bool(''))
print(bool(0))
print(bool(1))
print(type(bool(1)))
False
False
False
True
<class 'bool'>

备注:布尔类型转换是最常用的数据类型转换的内置函数之一,常用在while循环,等需要返回值为bool值的情况。


7.breakpoint()

说明:breakpoint是 Python 3.7 中新增加的内置函数,breakpoint(*args**kws)此函数会在调用时将你陷入调试器中。

breakpoint(*args**kws)此函数会在调用时将你陷入调试器中。具体来说,它调用 sys.breakpointhook() ,直接传递 args 和 kws 。默认情况下, sys.breakpointhook() 调用 pdb.set_trace() 且没有参数。在这种情况下,它纯粹是一个便利函数,因此您不必显式导入 pdb 且键入尽可能少的代码即可进入调试器。但是, sys.breakpointhook() 可以设置为其他一些函数并被 breakpoint() 自动调用,以允许进入你想用的调试器。

备注:暂时没有应用场景,后续在具体的应用场景中再详细展开研究。


8.bytearray()

说明:bytearray() 方法返回一个新字节数组。这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < 256。

class bytearray([source[, encoding[, errors]]])

返回一个新的 bytes 数组。 bytearray 类是一个可变序列,包含范围为 0 <= x < 256 的整数。它有可变序列大部分常见的方法,见 可变序列类型 的描述;同时有 bytes 类型的大部分方法,参见 bytes 和 bytearray 操作

可选形参 source 可以用不同的方式来初始化数组:

  • 如果是一个 string,您必须提供 encoding 参数(errors 参数仍是可选的);bytearray() 会使用 str.encode() 方法来将 string 转变成 bytes。

  • 如果是一个 integer,会初始化大小为该数字的数组,并使用 null 字节填充。

  • 如果是一个符合 buffer 接口的对象,该对象的只读 buffer 会用来初始化字节数组。

  • 如果是一个 iterable 可迭代对象,它的元素的范围必须是 0 <= x < 256 的整数,它会被用作数组的初始内容。

如果没有实参,则创建大小为 0 的数组。

另见 二进制序列类型 --- bytes, bytearray, memoryview 和 bytearray 对象

举例:

print(bytearray([1,2,3]))
bytearray(b'\x01\x02\x03')

9.bytes()

说明:bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列。它是 bytearray 的不可变版本。

class bytes([source[, encoding[, errors]]])

返回一个新的“bytes”对象, 是一个不可变序列,包含范围为 0 <= x < 256 的整数。bytes 是 bytearray 的不可变版本 - 它有其中不改变序列的方法和相同的索引、切片操作。

因此,构造函数的实参和 bytearray() 相同。

字节对象还可以用字面值创建,参见 字符串和字节串字面值

另见 二进制序列类型 --- bytes, bytearray, memoryviewbytes 对象 和 bytes 和 bytearray 操作

举例:

print(bytes([1,2,3]))
print(type(bytes([1,2,3])))
b'\x01\x02\x03'
<class 'bytes'>

备注:类和对象相关的内置函数会在之后的学习中再详细说明。


10.callable()

说明:callable() 函数用于检查一个对象是否是可调用的。如果返回 True,object 仍然可能调用失败;但如果返回 False,调用对象 object 绝对不会成功。

对于函数、方法、lambda 函式、 类以及实现了 __call__ 方法的类实例, 它都返回 True。

callable(object)

如果参数 object 是可调用的就返回 True,否则返回 False。 如果返回 True,调用仍可能失败,但如果返回 False,则调用 object 将肯定不会成功。 请注意类是可调用的(调用类将返回一个新的实例);如果实例所属的类有 __call__() 则它就是可调用的。

3.2 新版功能: 这个函数一开始在 Python 3.0 被移除了,但在 Python 3.2 被重新加入。

举例:

print(callable(1))
print(callable(None))
False
False

备注:类和对象相关的内置函数会在之后的学习中再详细说明。


11.chr()

说明:chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。返回值是当前整数对应的 ASCII 字符。

chr(i)

返回 Unicode 码位为整数 i 的字符的字符串格式。例如,chr(97) 返回字符串 'a'chr(8364) 返回字符串 '€'。这是 ord() 的逆函数。

实参的合法范围是 0 到 1,114,111(16 进制表示是 0x10FFFF)。如果 i 超过这个范围,会触发 ValueError 异常。

@classmethod

把一个方法封装成类方法。

一个类方法把类自己作为第一个实参,就像一个实例方法把实例自己作为第一个实参。请用以下习惯来声明类方法:

class C:
    @classmethod
    def f(cls, arg1, arg2, ...): ...
print(chr(0x31))
print(chr(65))
print(type(chr(60)))
1
A
<class 'str'>

 


12.classmethod

说明:classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。

@classmethod 这样的形式称为函数的 decorator -- 详情参阅 函数定义

类方法的调用可以在类上进行 (例如 C.f()) 也可以在实例上进行 (例如 C().f())。 其所属类以外的类实例会被忽略。 如果类方法在其所属类的派生类上调用,则该派生类对象会被作为隐含的第一个参数被传入。

类方法与 C++ 或 Java 中的静态方法不同。 如果你需要后者,请参阅 staticmethod()

想了解更多有关类方法的信息,请参阅 标准类型层级结构 。

备注:一般用作声明类属性,类和对象相关的内置函数会在之后的学习中再详细说明。

@classmethod

 


13.compile()

说明:compile() 函数将一个字符串编译为字节代码。

compile(sourcefilenamemodeflags=0dont_inherit=Falseoptimize=-1)

将 source 编译成代码或 AST 对象。代码对象可以被 exec() 或 eval() 执行。source 可以是常规的字符串、字节字符串,或者 AST 对象。参见 ast 模块的文档了解如何使用 AST 对象。

filename 实参需要是代码读取的文件名;如果代码不需要从文件中读取,可以传入一些可辨识的值(经常会使用 '<string>')。

mode 实参指定了编译代码必须用的模式。如果 source 是语句序列,可以是 'exec';如果是单一表达式,可以是 'eval';如果是单个交互式语句,可以是 'single'。(在最后一种情况下,如果表达式执行结果不是 None 将会被打印出来。)

可选参数 flags 和 dont_inherit 控制在编译 source 时要用到哪个 future 语句。 如果两者都未提供(或都为零)则会使用调用 compile() 的代码中有效的 future 语句来编译代码。 如果给出了 flags 参数但没有 dont_inherit (或是为零) 则 flags 参数所指定的 以及那些无论如何都有效的 future 语句会被使用。 如果 dont_inherit 为一个非零整数,则只使用 flags 参数 -- 在调用外围有效的 future 语句将被忽略。

Future 语句使用比特位来指定,多个语句可以通过按位或来指定。具体特性的比特位可以通过 __future__ 模块中的 _Feature 类的实例的 compiler_flag 属性来获得。

optimize 实参指定编译器的优化级别;默认值 -1 选择与解释器的 -O 选项相同的优化级别。显式级别为 0 (没有优化;__debug__ 为真)、1 (断言被删除, __debug__ 为假)或 2 (文档字符串也被删除)。

如果编译的源码不合法,此函数会触发 SyntaxError 异常;如果源码包含 null 字节,则会触发 ValueError 异常。

如果您想分析 Python 代码的 AST 表示,请参阅 ast.parse()

注解

在 'single' 或 'eval' 模式编译多行代码字符串时,输入必须以至少一个换行符结尾。 这使 code 模块更容易检测语句的完整性。

警告

在将足够大或者足够复杂的字符串编译成 AST 对象时,Python 解释器有可以因为 Python AST 编译器的栈深度限制而崩溃。

在 3.2 版更改: 允许使用 Windows 和 Mac 的换行符。在 'exec' 模式不再需要以换行符结尾。增加了 optimize 形参。

在 3.5 版更改: 之前 source 中包含 null 字节的话会触发 TypeError 异常。

举例:

str = 'for i in range(0,10): print(i)'
print(compile(str,'','exec'))
<code object <module> at 0x0000027982A81F60, file "", line 1>

14.complex()

说明:complex() 函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。

class complex([real[, imag]])

返回值为 real + imag*1j 的复数,或将字符串或数字转换为复数。如果第一个形参是字符串,则它被解释为一个复数,并且函数调用时必须没有第二个形参。第二个形参不能是字符串。每个实参都可以是任意的数值类型(包括复数)。如果省略了 imag,则默认值为零,构造函数会像 int 和 float 一样进行数值转换。如果两个实参都省略,则返回 0j

注解

当从字符串转换时,字符串在 + 或 - 的周围必须不能有空格。例如 complex('1+2j') 是合法的,但 complex('1 + 2j') 会触发 ValueError 异常。

数字类型 --- int, float, complex 描述了复数类型。

在 3.6 版更改: 您可以使用下划线将代码文字中的数字进行分组。

 

举例:

print(complex(1,2))
(1+2j)

15.delattr()

说明:delattr 函数用于删除属性。

delattr(objectname)

setattr() 相关的函数。实参是一个对象和一个字符串。该字符串必须是对象的某个属性。如果对象允许,该函数将删除指定的属性。例如 delattr(x, 'foobar') 等价于 del x.foobar 。

备注:类和对象在python学习中还未涉及到,所以暂时不深入研究,后续在逐步补充。


 

16. dict()

说明:dict() 函数用于创建一个字典。

class dict(**kwarg)

class dict(mapping**kwarg)

class dict(iterable**kwarg)

创建一个新的字典。dict 对象是一个字典类。参见 dict 和 映射类型 --- dict 了解这个类。

其他容器类型,请参见内置的 listset 和 tuple 类,以及 collections 模块。

举例:

a = dict()
print(a)
print(type(a))
{}
<class 'dict'>

17.dir()

说明:dir()函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

dir([object])

如果没有实参,则返回当前本地作用域中的名称列表。如果有实参,它会尝试返回该对象的有效属性列表。

如果对象有一个名为 __dir__() 的方法,那么该方法将被调用,并且必须返回一个属性列表。这允许实现自定义 __getattr__() 或 __getattribute__() 函数的对象能够自定义 dir() 来报告它们的属性。

如果对象不提供 __dir__(),这个函数会尝试从对象已定义的 __dict__ 属性和类型对象收集信息。结果列表并不总是完整的,如果对象有自定义 __getattr__(),那结果可能不准确。

默认的 dir() 机制对不同类型的对象行为不同,它会试图返回最相关而不是最全的信息:

  • 如果对象是模块对象,则列表包含模块的属性名称。

  • 如果对象是类型或类对象,则列表包含它们的属性名称,并且递归查找所有基类的属性。

  • 否则,列表包含对象的属性名称,它的类属性名称,并且递归查找它的类的所有基类的属性。

返回的列表按字母表排序。例如:

>>> import struct
>>> dir()   # show the names in the module namespace  
['__builtins__', '__name__', 'struct']
>>> dir(struct)   # show the names in the struct module 
['Struct', '__all__', '__builtins__', '__cached__', '__doc__', '__file__',
 '__initializing__', '__loader__', '__name__', '__package__',
 '_clearcache', 'calcsize', 'error', 'pack', 'pack_into',
 'unpack', 'unpack_from']
>>> class Shape:
...     def __dir__(self):
...         return ['area', 'perimeter', 'location']
>>> s = Shape()
>>> dir(s)
['area', 'location', 'perimeter']

注解

因为 dir() 主要是为了便于在交互式时使用,所以它会试图返回人们感兴趣的名字集合,而不是试图保证结果的严格性或一致性,它具体的行为也可能在不同版本之间改变。例如,当实参是一个类时,metaclass 的属性不包含在结果列表中。

备注:暂时没有应用场景,后续在具体的应用场景中再详细展开研究。


18.divmod()

说明:python divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。

divmod(ab)

它将两个(非复数)数字作为实参,并在执行整数除法时返回一对商和余数。对于混合操作数类型,适用双目算术运算符的规则。对于整数,结果和 (a // b, a % b) 一致。对于浮点数,结果是 (q, a % b) ,q 通常是 math.floor(a / b) 但可能会比 1 小。在任何情况下, q * b + a % b 和 a 基本相等;如果 a % b 非零,它的符号和 b 一样,并且 0 <= abs(a % b) < abs(b) 。

举例:

print(divmod(200,13))
(15, 5)

19.enumerate()

说明:enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

enumerate(iterablestart=0)

返回一个枚举对象。iterable 必须是一个序列,或 iterator,或其他支持迭代的对象。 enumerate() 返回的迭代器的 __next__() 方法返回一个元组,里面包含一个计数值(从 start 开始,默认为 0)和通过迭代 iterable 获得的值。

>>> seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

等价于:

def enumerate(sequence, start=0):
    n = start
    for elem in sequence:
        yield n, elem
        n += 1

举例:

seq = ['one', 'two', 'three']
i = 0
for element in seq:
    print(i,seq[i])
    i += 1
0 one
1 two
2 three

20.eval()

说明:eval() 函数用来执行一个字符串表达式,并返回表达式的值。

eval(expression[, globals[, locals]])

实参是一个字符串,以及可选的 globals 和 locals。globals 实参必须是一个字典。locals 可以是任何映射对象。

expression 参数会作为一个 Python 表达式(从技术上说是一个条件列表)被解析并求值,使用 globals 和 locals 字典作为全局和局部命名空间。 如果 globals 字典存在且不包含以 __builtins__ 为键的值,则会在解析 expression 之前插入以此为键的对内置模块 builtins 的字典的引用。 这意味着 expression 通常具有对标准 builtins 模块的完全访问权限且受限的环境会被传播。 如果省略 locals 字典则其默认值为 globals 字典。 如果两个字典同时省略,表达式会在 eval() 被调用的环境中执行。 返回值为表达式求值的结果。 语法错误将作为异常被报告。 例如:

>>> x = 1
>>> eval('x+1')
2

这个函数也可以用来执行任何代码对象(如 compile() 创建的)。这种情况下,参数是代码对象,而不是字符串。如果编译该对象时的 mode 实参是 'exec' 那么 eval() 返回值为 None 。

提示: exec() 函数支持动态执行语句。 globals() 和 locals() 函数各自返回当前的全局和本地字典,因此您可以将它们传递给 eval() 或 exec() 来使用。

另外可以参阅 ast.literal_eval(),该函数可以安全执行仅包含文字的表达式字符串。

举例:

a=1
g={'a':20}
print(eval("a+1",g))
21

21.exec()

说明:exec 执行储存在字符串或文件中的Python语句,相比于 eval,exec可以执行更复杂的 Python 代码。

exec(object[, globals[, locals]])

这个函数支持动态执行 Python 代码。object 必须是字符串或者代码对象。如果是字符串,那么该字符串将被解析为一系列 Python 语句并执行(除非发生语法错误)。1 如果是代码对象,它将被直接执行。在任何情况下,被执行的代码都需要和文件输入一样是有效的(见参考手册中关于文件输入的章节)。请注意即使在传递给 exec() 函数的代码的上下文中,return 和 yield 语句也不能在函数定义之外使用。该函数返回值是 None 。

无论哪种情况,如果省略了可选参数,代码将在当前范围内执行。如果提供了 globals 参数,就必须是字典类型,而且会被用作全局和本地变量。如果同时提供了 globals 和 locals 参数,它们分别被用作全局和本地变量。如果提供了 locals 参数,则它可以是任何映射型的对象。请记住在模块层级,全局和本地变量是相同的字典。如果 exec 有两个不同的 globals 和 locals 对象,代码就像嵌入在类定义中一样执行。

如果 globals 字典不包含 __builtins__ 键值,则将为该键插入对内建 builtins 模块字典的引用。因此,在将执行的代码传递给 exec() 之前,可以通过将自己的 __builtins__ 字典插入到 globals 中来控制可以使用哪些内置代码。

注解

内置 globals() 和 locals() 函数各自返回当前的全局和本地字典,因此可以将它们传递给 exec() 的第二个和第三个实参。

注解

默认情况下,locals 的行为如下面 locals() 函数描述的一样:不要试图改变默认的 locals 字典。如果您想在 exec() 函数返回时知道代码对 locals 的变动,请明确地传递 locals 字典。

备注:暂时没有应用场景,后续在具体的应用场景中再详细展开研究。

 


22.filter()

说明:filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

filter(functioniterable)

用 iterable 中函数 function 返回真的那些元素,构建一个新的迭代器。iterable 可以是一个序列,一个支持迭代的容器,或一个迭代器。如果 function 是 None ,则会假设它是一个身份函数,即 iterable 中所有返回假的元素会被移除。

请注意, filter(function, iterable) 相当于一个生成器表达式,当 function 不是 None 的时候为 (item for item in iterable if function(item));function 是 None 的时候为 (item for item in iterable if item) 。

请参阅 itertools.filterfalse() 了解,只有 function 返回 false 时才选取 iterable 中元素的补充函数。

l = [x for x in range(0, 10)]
print(list(filter(None, l)))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

 


23.float()

说明:数据类型转换为float()浮点数类型。

class float([x])

返回从数字或字符串 x 生成的浮点数。

如果实参是字符串,则它必须是包含十进制数字的字符串,字符串前面可以有符号,之前也可以有空格。可选的符号有 '+' 和 '-' ; '+' 对创建的值没有影响。实参也可以是 NaN(非数字)、正负无穷大的字符串。确切地说,除去首尾的空格后,输入必须遵循以下语法:

sign           ::=  "+" | "-"
infinity       ::=  "Infinity" | "inf"
nan            ::=  "nan"
numeric_value  ::=  

floatnumber | infinity | nan numeric_string ::= [sign] numeric_value

这里, floatnumber 是 Python 浮点数的字符串形式,详见 浮点数字面值。字母大小写都可以,例如,“inf”、“Inf”、“INFINITY”、“iNfINity” 都可以表示正无穷大。

另一方面,如果实参是整数或浮点数,则返回具有相同值(在 Python 浮点精度范围内)的浮点数。如果实参在 Python 浮点精度范围外,则会触发 OverflowError

对于一般的 Python 对象 x , float(x) 指派给 x.__float__() 。

如果没有实参,则返回 0.0 。

示例:

>>>

>>> float('+1.23')
1.23
>>> float('   -12345\n')
-12345.0
>>> float('1e-003')
0.001
>>> float('+1E6')
1000000.0
>>> float('-Infinity')
-inf
数字类型 --- int, float, complex 描述了浮点类型。

在 3.6 版更改: 您可以使用下划线将代码文字中的数字进行分组。

在 3.7 版更改: x 现在只能作为位置参数。

举例:

num = 100
print(float(num))
print(type(float(num)))
100.0
<class 'float'>

 


以上便是《Python学习13:内置函数(一)》所有内容,下一篇为内置函数(二)讲解更多内置函数的定义和用法。

目前《Python学习》专题正在不断更新,原创不易,如果喜欢请点赞和关注,谢谢大家的支持!

获得更多免费的学习资料请添加微信公众号——风起怨江南,有任何问题可以随时和我交流沟通。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章