python-函數內置方法


 函數的內置方法

      

 

查看菜鳥教程里面的內置方法

abs():

絕對值函數。如abs(-1)= 1

>>> abs(-10)
10
>>> f = abs
>>> f(-1)
1
>>> abs=id
>>> abs(1)
1869788224

以abs()函數為例,展示兩個特性。一是,內置函數是可以被賦值給其他變量的,同樣也可以將其他對象賦值給內置函數,這時就完全變了。所以,內置函數不是Python關鍵字,要注意對它們的保護,不要使用和內置函數重名的變量名,這會讓代碼混亂,容易發生難以排查的錯誤。

all()

接收一個可迭代對象,如果對象里的所有元素的bool運算值都是True,那么返回True,否則False。不要小瞧了這個函數,用好了,有化腐朽為神奇的特效。

>>> all([1,1,1])
True
>>> all([1,1,0])
False

any()

接收一個可迭代對象,如果迭代對象里有一個元素的bool運算值是True,那么返回True,否則False。與all()是一對兄弟。

>>> any([0,0,1])
True
>>> any([0,0,0])
False

ascii()

調用對象的__repr__()方法,獲得該方法的返回值。__repr__()方法是由對象所屬類型實現的方法。不可以簡單地理解為print或echo。

>>>s = “haha”
>>> ascii(s)
"'haha'"
>>> a = [1,2,3]
>>> ascii(a)
'[1, 2, 3]'

bin()、oct()、hex()

三個函數是將十進制數分別轉換為2/8/16進制。

>>> i = 10
>>> bin(i)
'0b1010'
>>> oct(i)
'0o12'
>>> hex(i)
'0xa'

bool()

測試一個對象或表達式的執行結果是True還是False。實際上bool是一個類,不是函數,bool()的返回值是一個布爾類型的實例。builtins中的很多函數,其實都是類,比如bytes(),str()等等。其中bool對於一個空列表或者帶有0的列表,返回的是False。

>>> bool(1==2)
False
>>> bool(abs(-1))
True
>>> bool(None)
False
>>>a = []
>>>bool(a)
False

bytearray()

描述

bytearray() 方法返回一個新字節數組。這個數組里的元素是可變的,並且每個元素的值范圍: 0 <= x < 256。

語法

bytearray()方法語法:

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

參數

  • 如果 source 為整數,則返回一個長度為 source 的初始化數組;
  • 如果 source 為字符串,則按照指定的 encoding 將字符串轉換為字節序列;
  • 如果 source 為可迭代類型,則元素必須為[0 ,255] 中的整數;
  • 如果 source 為與 buffer 接口一致的對象,則此對象也可以被用於初始化 bytearray。
  • 如果沒有輸入任何參數,默認就是初始化數組為0個元素。

返回值

返回新字節數組。

實例

以下實例展示了 bytearray() 的使用方法:

>>>bytearray()
bytearray(b'')
>>> bytearray([1,2,3])
bytearray(b'\x01\x02\x03')
>>> bytearray('runoob', 'utf-8')
bytearray(b'runoob')
>>>

bytes()

將對象轉換成字節類型。例如:s = '張三';m = bytes(s,encoding='utf-8')

>>> i=2
>>> bytes(i)
b'\x00\x00'
>>> s = 'haha'
>>> bytes(s)
Traceback (most recent call last):
  File "<pyshell#24>", line 1, in <module>
    bytes(s)
TypeError: string argument without an encoding
>>> bytes(s, encoding="utf-8")
b'haha'
>>> bytes(s, encoding="GBK")
b'haha'

str()

將對象轉換成字符串類型,同樣也可以指定編碼方式。例如:str(bytes對象,encoding='utf-8')

>>> i =  2
>>> str(i)
'2'
>>> b = b"haha"
>>> str(b)      # 注意!
"b'haha'"
>>> str(b,encoding="gb2312")
'haha'
>>> str([1,2,3,])
'[1, 2, 3]'

Bytes和string之間的互相轉換,更多使用的是encode()和decode()方法。

callable()

判斷對象是否可以被調用。如果某個對象具有__call__方法,那它就能被調用。 例如,def f1(): pass,那么callable(f1)返回True。常用於判斷一個變量是否是函數。函數可調用。

>>> def f1():
    pass
>>> callable(f1)
True
>>> a = "123"
>>> callable(a)
False
>>> class Foo:
    def __init__(self,name,age):
        self.name = name
        self.age = age        
>>> f_obj = Foo("jack",20)
>>> callable(f_obj)
False
>>> callable(Foo)
True

chr()

返回某個十進制數對應的ASCII字符,例如:chr(99) = ‘c’。它可以配合random.randint(65,91)隨機方法,生成隨機字符,用於生產隨機驗證碼。

import random
for i in range(10):
    a = random.randint(65,91)
    c = chr(a)
    print(c)

ord()

與chr()相反,返回某個ASCII字符對應的十進制數,例如,ord('A') = 65

>>> ord("A")
65
>>> ord("\n")
10

classmethod()、staticmethod()和property()

類機制中,用於生成類方法、靜態方法和屬性的函數。在面向對象章節會有詳細介紹。

compile()

將字符串編譯成Python能識別或執行的代碼。 也可以將文件讀成字符串再編譯。

>>> s  = "print('helloworld')"
>>> r = compile(s,"<string>","exec")
>>> r
<code object <module> at 0x000001B23E6BE660, file "<string>", line 1>
>>> r()
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    r()
TypeError: 'code' object is not callable
>>> exec(r)
helloworld
>>> eval(r)
helloworld

complex()

通過數字或字符串生成復數類型對象。

>>>complex(1, 2)
(1 + 2j)
 
>>> complex(1)    # 數字
(1 + 0j)
 
>>> complex("1")  # 當做字符串處理
(1 + 0j)
 
# 注意:這個地方在"+"號兩邊不能有空格,也就是不能寫成"1 + 2j",應該是"1+2j",否則會報錯
>>> complex("1+2j")
(1 + 2j)

使用字符串的時候,+號左右不能有空白。

delattr()、setattr()、getattr()、hasattr()

類機制中,分別用來刪除、設置、獲取和判斷屬性。后面會有詳解。

dir()

查看詳細介紹

顯示對象所有的屬性和方法。打印當前程序的所有變量。最好用的輔助函數之一。

>>> dir()
['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'builtins', 'r', 's']

>>> dir([1,2,])
['__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']

int()、float()、list()、dict()、set()、tuple()

與bool()、str()、bytes()一樣,它們都是實例化對應數據類型的類。

divmod()

除法,同時返回商和余數的元組。

>>> divmod(10,3)
(3, 1)
>>> divmod(11,4)
(2, 3)

enumerate()

enumerate() 函數用於將一個可遍歷的數據對象(如列表、元組或字符串)組合為一個索引序列,同時列出數據和數據下標,一般用在 for 循環當中。

Python 2.3. 以上版本可用,2.6 添加 start 參數。

語法

以下是 enumerate() 方法的語法:

enumerate(sequence, [start=0])

參數

  • sequence -- 一個序列、迭代器或其他支持迭代對象。
  • start -- 下標起始位置。
# 實例
# 以下展示了使用 enumerate() 方法的實例:

>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 小標從 1 開始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

# 普通的 for 循環
>>>i = 0
>>> seq = ['one', 'two', 'three']
>>> for element in seq:
...     print i, seq[i]
...     i +=1
... 
0 one
1 two
2 three

# for 循環使用 enumerate
>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
...     print i, element
... 
0 one
1 two
2 three

  

通常用於對那些無法提供序號的迭代對象使用。但對於字典,依然是無序的。

eval()

eval() 函數用來執行一個字符串表達式,並返回表達式的值。

語法

以下是 eval() 方法的語法:

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

參數

  • expression -- 表達式。
  • globals -- 變量作用域,全局命名空間,如果被提供,則必須是一個字典對象。
  • locals -- 變量作用域,局部命名空間,如果被提供,可以是任何映射對象。

返回值

返回表達式計算結果。

實例

以下展示了使用 eval() 方法的實例:

>>>x = 7 
>>> eval( '3 * x' ) 
21 
>>> eval('pow(2,2)')
 4 
>>> eval('2 + 2')
 4 
>>> n=81 
>>> eval("n + 4") 
85

exec()

描述

exec 執行儲存在字符串或文件中的Python語句,相比於 eval,exec可以執行更復雜的 Python 代碼。

需要說明的是在 Python2 中exec不是函數,而是一個內置語句(statement),但是Python 2中有一個 execfile() 函數。可以理解為 Python 3 把 exec 這個 statement 和 execfile() 函數的功能夠整合到一個新的 exec() 函數中去了。

 

語法

以下是 exec 的語法:

exec obj

參數

  • obj -- 要執行的表達式。

返回值

exec 返回值永遠為 None。

實例

以下展示了使用 exec 的實例:

實例 1

>>>exec 'print "Hello World"'
Hello World
# 單行語句字符串
>>> exec "print 'runoob.com'"
runoob.com
 
#  多行語句字符串
>>> exec """
...for i in range(5): ... print "iter time: %d" % i ... """ iter time: 0 iter time: 1 iter time: 2 iter time: 3 iter time: 4

實例 2

x = 10
expr = """
z = 30
sum = x + y + z
print(sum)
"""
def func():
    y = 20
    exec(expr)
    exec(expr, {'x': 1, 'y': 2})
    exec(expr, {'x': 1, 'y': 2}, {'y': 3, 'z': 4})
    
func()

輸出結果:

60
33
34

eval() exec() 

eval()只能處理單行代碼而exec()可以處理多行代碼

eval()有返回值,exec沒有返回值

res = eval('1+3+2')
res2 = exec('1+3+2')
print('res', res, res2)

# 執行結果
res 7 None

format()

查看詳細講解

執行format(),其實就是調用該對象所屬類的__format__方法。類似print功能。

>>> format("324324")
'324324'
>>> format([1,2,3])
'[1, 2, 3]'

frozenset()

描述

frozenset() 返回一個凍結的集合,凍結后集合不能再添加或刪除任何元素。

語法

frozenset() 函數語法:

class frozenset([iterable])

參數

  • iterable -- 可迭代的對象,比如列表、字典、元組等等。

返回值

返回新的 frozenset 對象,如果不提供任何參數,默認會生成空集合。

實例

以下實例展示了 frozenset() 的使用方法:

>>>a = frozenset(range(10))     # 生成一個新的不可變集合
>>> a
frozenset([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = frozenset('runoob') 
>>> b
frozenset(['b', 'r', 'u', 'o', 'n'])   # 創建不可變集合
>>>

  

globals()

列出當前環境下所有的全局變量。注意要與global關鍵字區分!在本節的開始,我們就已經展示了它的用法。

hash()

為不可變對象,例如字符串生成哈希值的函數!

>>> hash("i am jack")
5602200374213231465
>>> hash(1)
1
>>> hash(100000)
100000
>>> hash([1,2,3,])
Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    hash([1,2,3,])
TypeError: unhashable type: 'list'
>>> hash((1,2,3))
2528502973977326415

help()

返回對象的幫助文檔。誰用誰知道!

>>> a = [1,2,3] >>> help(a) Help on list object: class list(object) | list() -> new empty list | list(iterable) -> new list initialized from iterable's items ... 

id()

返回對象的內存地址,常用來查看變量引用的變化,對象是否相同等。常用功能之一!

>>> id(0)
1456845856
>>> id(True)
1456365792
>>> a = "Python"
>>> id(a)
37116704

input()

接收用戶輸入,返回一個輸入的字符串。

>>> a = input("Please input a number:  ")
Please input a number:  100
>>> a
'100'
>>> type(a)
<class 'str'>

isinstance()

判斷一個對象是否是某個類的實例。比type()方法適用面更廣。

>>> isinstance("haha", str)
True
>>> isinstance(1, str)
False

issubclass()

issubclass(a,b),判斷a是否是b的子類。

>>> class Foo:
    pass
>>> class Goo(Foo):
    pass
>>> issubclass(Goo, Foo)
True

iter()

制造一個迭代器,使其具備next()能力。

>>> lis = [1, 2, 3]
>>> next(lis)
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    next(lis)
TypeError: 'list' object is not an iterator
>>> i = iter(lis)
>>> i
<list_iterator object at 0x0000000002B4A128>
>>> next(i)
1

len()

返回對象的長度。不能再常用的函數之一了。

locals()

locals() 函數會以字典類型返回當前位置的全部局部變量。簡單點就是返回局部變量。

對於函數, 方法, lambda 函式, 類, 以及實現了 __call__ 方法的類實例, 它都返回 True。

返回值:字典類型的局部變量

>>>def runoob(arg):    # 兩個局部變量:arg、z
...     z = 1
...     print (locals())
... 
>>> runoob(4)
{'z': 1, 'arg': 4}      # 返回一個名字/值對的字典
>>>

  

max()/min():

返回給定集合里的最大或者最小的元素。可以指定排序的方法!

lst=['abcdhush8','abc9iujtwertwert','abcdjlas','abcdj897h']
a = min(lst,key=len)
print(a)

memoryview(obj)

返回obj的內存視圖對象。obj只能是bytes或bytesarray類型。memoryview對象的使用方法如下:

>>> v = memoryview(b'abcefg')
>>> v[1]
98
>>> v[-1]
103
>>> v[1:4]
<memory at 0x7f3ddc9f4350>
>>> bytes(v[1:4])
b'bce'

next()

通過調用迭代器的__next__()方法,獲取下一個元素。

object()

該方法不接收任何參數,返回一個沒有任何功能的對象。object是Python所有類的基類。

open()

打開文件的方法。在Python2里,還有一個file()方法,Python3中被廢棄了。后面章節會詳細介紹open()的用法。

pow()

冪函數。

>>> pow(3, 2)
9

print()

語法

以下是 print() 方法的語法:

print(*objects, sep=' ', end='\n', file=sys.stdout)

參數

  • objects -- 復數,表示可以一次輸出多個對象。輸出多個對象時,需要用 , 分隔。
  • sep -- 用來間隔多個對象,默認值是一個空格。
  • end -- 用來設定以什么結尾。默認值是換行符 \n,我們可以換成其他字符串。
  • file -- 要寫入的文件對象。
>>> print("www","runoob","com",sep=".")  # 設置間隔符
www.runoob.com
>>>print(1)
1
>>> print("Hello World")
Hello World
>>> a = 1
>>> b = 'runoob'
>>> print(a,b)
1 runoob
>>> print("aaa""bbb")
aaabbb
>>> print("aaa","bbb")
aaa bbb

range()

沒錯,這是Python內置的函數,前面已經介紹了。

repr()

repr() 函數將對象轉化為供解釋器讀取的形式。並且返回一個對象的 string 格式。

>>>s = 'RUNOOB'
>>> repr(s)
"'RUNOOB'"
>>> dict = {'runoob': 'runoob.com', 'google': 'google.com'};
>>> repr(dict)
"{'google': 'google.com', 'runoob': 'runoob.com'}"

reversed()

反轉,逆序對象

>>> reversed            # reversed本身是個類
<class 'reversed'>
>>> reversed([1,2,3,4,5])   # 獲得一個列表反轉器
<list_reverseiterator object at 0x0000022E322B5128>
>>> a = reversed([1,2,3,4,5])
>>> a
<list_reverseiterator object at 0x0000022E32359668>
>>> list(a)         # 使用list方法將它轉換為一個列表
[5, 4, 3, 2, 1]

round()

描述

round() 方法返回浮點數x的四舍五入值。

語法

以下是 round() 方法的語法:

round( x [, n] )

參數

  • x -- 數值表達式。
  • n -- 數值表達式。

返回值

返回浮點數x的四舍五入值。
a = round(2.33333, 2)
print(a)

b = round(3.555, 1)
print(b)

# 執行結果
2.33
3.6

slice()

返回一個切片類型的對象。slice是一個類,一種Python的數據類型。Python將對列表等序列數據類型的切片功能單獨拿出來設計了一個slice類,可在某些場合下使用。

>>> s = slice(1, 10, 2)
>>> s
slice(1, 10, 2)
>>> type(s)
<class 'slice'>
>>> lis = [i for i in range(10)]
>>> lis
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> lis[s]          # 注意用法
[1, 3, 5, 7, 9]

sum()

求和.

>>> sum(1,2,3)          # 需要傳入一個可迭代的對象
Traceback (most recent call last):
  File "<pyshell#15>", line 1, in <module>
    sum(1,2,3)
TypeError: sum expected at most 2 arguments, got 3
>>> sum([1,2,3])            # 傳入一個列表
6
>>> sum({1:1,2:2})          # 突發奇想,作死傳入一個字典
3

super()

調用父類。面向對象中類的機制相關。后面介紹。

type()

顯示對象所屬的數據類型。常用方法!前面已經展示過。

vars()

與dir()方法類似,不過dir()方法返回的是key,vars()方法返回key的同時還把value一起打印了。

>>> vars() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'a': <list_reverseiterator object at 0x0000022E32359668>, 's': 'ha'} 

map()

描述

map() 會根據提供的函數對指定序列做映射。

第一個參數 function 以參數序列中的每一個元素調用 function 函數,返回包含每次 function 函數返回值的新列表。

語法

map() 函數語法:

map(function, iterable, ...)

參數

  • function -- 函數,有兩個參數
  • iterable -- 一個或多個序列

返回值

Python 2.x 返回列表。

Python 3.x 返回迭代器。

實例

以下實例展示了 map() 的使用方法:

>>>def square(x) :            # 計算平方數
...     return x ** 2
... 
>>> map(square, [1,2,3,4,5])   # 計算列表各個元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函數
[1, 4, 9, 16, 25]
 
# 提供了兩個列表,對相同位置的列表數據進行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]

  

filter()

描述

filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。

該接收兩個參數,第一個為函數,第二個為序列,序列的每個元素作為參數傳遞給函數進行判,然后返回 True 或 False,最后將返回 True 的元素放到新列表中。

語法

以下是 filter() 方法的語法:

filter(function, iterable)

參數

  • function -- 判斷函數。
  • iterable -- 可迭代對象。

返回值

返回列表。

實例

以下展示了使用 filter 函數的實例:

過濾出列表中的所有奇數:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
def is_odd(n):
    return n % 2 == 1
 
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)

#執行結果
[1, 3, 5, 7, 9] 

過濾出1~100中平方根是整數的數:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import math
def is_sqr(x):
    return math.sqrt(x) % 1 == 0
 
newlist = filter(is_sqr, range(1, 101))
print(newlist)

# 輸出結果 :

[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

zip()

描述

zip() 函數用於將可迭代的對象作為參數,將對象中對應的元素打包成一個個元組,然后返回由這些元組組成的列表。

如果各個迭代器的元素個數不一致,則返回列表長度與最短的對象相同,利用 * 號操作符,可以將元組解壓為列表。

zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中為了減少內存,zip() 返回的是一個對象。如需展示列表,需手動 list() 轉換。

如果需要了解 Pyhton3 的應用,可以參考 Python3 zip()

語法

zip 語法:

zip([iterable, ...])

參數說明:

  • iterabl -- 一個或多個迭代器;

返回值

返回元組列表。

實例

以下實例展示了 zip 的使用方法:

>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 打包為元組的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)              # 元素個數與最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)          # 與 zip 相反,*zipped 可理解為解壓,返回二維矩陣式
[(1, 2, 3), (4, 5, 6)]

sorted()

排序方法。有key和reverse兩個重要參數。

基礎用法: 直接對序列進行排序

>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

指定排序的關鍵字。關鍵字必須是一個可調用的對象。例如下面的例子,規則是誰的絕對值大,誰就排在后面。

>>> sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]

# 或者可以使用lambda函數指定列表的那個排序
d = {}
for i in range(10):
d[i] = i - 50
print(d)
d2 = d.items()
d[2] = 5
d3 = sorted(d2, key=lambda x:x[1])  # key后面還可以添加recerse = True進行反轉排序
print(d3)

# 執行結果

# {0: -50, 1: -49, 2: -48, 3: -47, 4: -46, 5: -45, 6: -44, 7: -43, 8: -42, 9: -41}
# [(0, -50), (1, -49), (3, -47), (4, -46), (5, -45), (6, -44), (7, -43), (8, -42), (9, -41), (2, 5)]

  

指定按反序排列。下面的例子,首先按忽略大小寫的字母順序排序,然后倒序排列。

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

hash()

描述

hash() 用於獲取取一個對象(字符串或者數值等)的哈希值。

語法

hash 語法:

hash(object)

參數說明:

  • object -- 對象;

返回值

返回對象的哈希值。

實例

以下實例展示了 hash 的使用方法:

>>>hash('test')            # 字符串
2314058222102390712
>>> hash(1)                 # 數字
1
>>> hash(str([1,2,3]))      # 集合
1335416675971793195
>>> hash(str(sorted({'1':1}))) # 字典
7666464346782421378
>>>

__import__(name)

這個方法為我們提供了一種通過字符串反射包、庫或模塊的手段。其中的name是你想要導入的庫的名稱的字符串。

t = __import__("time")
print(t.time())

例子中,利用字符串“time”,導入了實際的time庫,並賦值給t變量。這個變量實際就相當於import time的結果。然后使用t.time()進行調用。

在某些場景下,這個方法非常有用。但是很多時候,它也存在安全問題,Python官方不建議經常使用它。

至此,除了個別遺留,近80個內置函數就基本介紹完畢。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM