天天看點

Python标準内置函數(21-25)

1.21  函數filter()

在Python程式中,函數filter()的功能是過濾序列,過濾掉不符合條件的元素,傳回一個filter類。filter類實作了__iter__和__next__方法, 可以看成是一個疊代器, 有惰性運算的特性。使用函數filter()的文法格式如下所示。

filter(function, iterable)
           
  1. function:判斷函數;
  2. iterable:可疊代對象。

在下面的執行個體檔案filter.py中,示範了使用函數filter()過濾資料的過程。

# 過濾出清單中的所有奇數:

def is_odd(n):

    return n % 2 == 1



newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

①print(newlist)

print(list(newlist))



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

import math

def is_sqr(x):

    return math.sqrt(x) % 1 == 0



newlist = filter(is_sqr, range(1, 101))

②print(newlist)

print(list(newlist))
           

執行後會輸出:

<filter object at 0x000002021CFDF668>

[1, 3, 5, 7, 9]

<filter object at 0x000002021CFDF588>

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

在Python 2版本中,①行代碼執行後會輸出清單“[1, 3, 5, 7, 9]”,②行代碼執行後會輸出清單“[[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]]”,這是因為Python 2版本傳回的是過濾後的清單, 而Python 3版本中傳回到是一個filter類。要想在Python 3程式中傳回過濾後的清單,需要使用函數list()将其轉化過來。

1.22  函數float()

在Python程式中,函數float()的功能是将整數和字元串轉換成浮點數。使用函數float()的文法格式如下所示。

class float([x])
           

參數“x”是一個整數或字元串,如果參數“x”是一個字元串,它應該包含一個十進制數,可選地前面有一個符号,并且可選地嵌入在空格中。可選的sign可以是'+'或'–'; '+'符号對生成的值沒有影響。參數“x”還可以是表示NaN(非數字)或正或負無窮大的字元串。更确切地說,輸入必須符合如下所示的文法,前導和尾随空白字元被删除:

sign           ::=  "+" | "-"

infinity       ::=  "Infinity" | "inf"

nan            ::=  "nan"

numeric_value  ::=  floatnumber | infinity | nan

numeric_string ::=  [sign] numeric_value
           

在上述格式中,floatnumber是在浮點字面值中描述的Python浮點字面值的形式。例如“inf”、“Inf”、“INFINITY”和“iNfINity”都是正無窮大的可接受拼寫。如果參數“x”是整數或浮點數,則傳回具有相同值(在Python的浮點精度内)的浮點數。如果參數“x”在Python浮點數的範圍之外,則引發一個OverflowError錯誤。對于一般的Python對象x,float(x)委托給x .__float__()。如果沒有給出參數“x”,則傳回0.0。

在下面的執行個體檔案fl.py中,示範了使用函數float()将參數轉換為浮點數的過程。

print(float(1))

print(float(112))

print(float(-123.6))

print(float('123') )   # 字元串

print( float())#不提供參數的時候,傳回0.0
           

執行後會輸出:

1.0

11.0

-123.6

123.0

0.0
           

在使用函數float()時,字元串必須能正确轉換成浮點型數值的,否則報錯。例如下面的示範過程。

>>> float('3.14.15926')

Traceback (most recent call last):

  File "<pyshell#3>", line 1, in <module>

    float('3.14.15926')

ValueError: could not convert string to float: '3.14.15926'
           

在使用函數float()時,在字元串中允許出現“+”、“-”兩個符号,兩個符号和數字之間不能出現空格,但是符号前面和數字後面允許出現空格。例如下面的示範過程。

>>> float('+3.14') #帶正号

3.14

>>> float('-3.14') #帶負号

-3.14

>>> float('  -3.14  ') #正負号前、數字後可以有空格

-3.14

>>> float('- 3.14') #正負号與數字間不可以有空格

Traceback (most recent call last):

  File "<pyshell#8>", line 1, in <module>

    float('- 3.14')

ValueError: could not convert string to float: '- 3.14'
           

在使用函數float()時,有幾個特殊的字元串能正确轉換,例如"Infinity"或者“inf”(不區分大小寫),能正确轉換,表示無窮大,可以和“+”、“-”一起使用;“nan”也能正确轉換,表示沒有值。例如下面的執行個體檔案fl1.py示範了函數float()的這一功能。

print(float('Infinity'))

print(float('inf'))

print(float('inFinIty')) #不區分大小寫

print(float('+inFinIty'))#正無窮

print(float('-inFinIty')) #負無窮

print(float('nan'))#沒有值
           

執行後會輸出:

inf

inf

inf

inf

-inf

Nan
           

在Python程式中,定義的對象如果要被float()函數正确轉換成浮點數,則需要定義__float__函數。例如執行下面的代碼将會報錯:

>>> class X:

    def __init__(self,score):

        self.score = score



>>> x = X(9.7)

>>> float(x) #不能轉換

Traceback (most recent call last):

  File "<pyshell#20>", line 1, in <module>

    float(x)

TypeError: float() argument must be a string or a number, not 'X'
           

而執行下面的執行個體檔案fl2.py就會成功。

class X: #重新定義類,加入__float__方法

    def __init__(self,score):

        self.score = score

    def __float__(self):

        return self.score



x = X(9.7)

print(float(x))#可以轉換
           

執行後會輸出:

9.7
           

1.23  函數format()

在Python程式中,函數format()是一種格式化字元串的函數,它增強了字元串格式化的功能。使用函數format()的文法格式如下所示。

format(value[, format_spec])
           

函數format()的功能是将value轉化成“格式化”的表現形式,格式由format_spec控制。對format_spec的解釋依賴于參數value的類型,大多數内置類型有标準的格式化文法。format_spec是一個格式化參數,預設是一個空字元串,通常給出與調用str(value)相同的效果。對參數format_spec的調用将被轉換為type(value).__ format __(value, t4> format_spec)其在搜尋值的__format__()方法時繞過執行個體字典。如果方法搜尋到達object并且format_spec不為空,或者如果format_spec,則會引發TypeError t7>或傳回值不是字元串。

如果沒有提供參數format_spec,則和調用str(value)效果相同,轉換成字元串格式化。

在使用函數format()時,可以接受不限個數的參數,位置可以不按順序排列。例如下面的執行個體檔案for.py示範了函數format()的這一功能。

print("{} {}".format("hello", "world"))  # 不設定指定位置,按預設順序

print("{0} {1}".format("hello", "world"))  # 設定指定位置

print("{1} {0} {1}".format("hello", "world"))  # 設定指定位置
           

執行後會輸出:

hello world

hello world

world hello world
           

在使用函數format()時,也可以設定指定的參數,例如下面的執行個體檔案for1.py示範了函數format()的這一功能。

print("網站名:{name}, 位址 {url}".format(name="Python教程", url="www.toppr.net"))



# 通過字典設定參數

site = {"name": "Python教程", "url": "www.toppr.net"}

print("網站名:{name}, 位址 {url}".format(**site))



# 通過清單索引設定參數

my_list = ['Python教程', 'www.toppr.net']

print("網站名:{0[0]}, 位址 {0[1]}".format(my_list))  # "0" 是必須的
           

執行後會輸出:

網站名:Python教程, 位址 www.toppr.net

網站名:Python教程, 位址 www.toppr.net

網站名:Python教程, 位址 www.toppr.net
           

在使用函數format()時,也可以向函數str.format()傳入對象,例如下面的執行個體檔案for2.py示範了函數format()的這一功能。

class AssignValue(object):

    def __init__(self, value):

        self.value = value

my_value = AssignValue(6)

print('value 為: {0.value}'.format(my_value))  # "0" 是可選的
           

執行後會輸出:

value 為: 6
           

在Python程式中,函數format()實作數字格式化功能的說明如表1-1所示。

                                                                   表1-1  實作數字格式化功能的說明

數字 格式 輸出 描述
3.1415926 {:.2f} 3.14 保留小數點後兩位
3.1415926 {:+.2f} +3.14 帶符号保留小數點後兩位
-1 {:+.2f} -1.00 帶符号保留小數點後兩位
2.71828 {:.0f} 3 不帶小數
5 {:0>2d} 05 數字補零 (填充左邊, 寬度為2)
5 {:x<4d} 5xxx 數字補x (填充右邊, 寬度為4)
10 {:x<4d} 10xx 數字補x (填充右邊, 寬度為4)
1000000 {:,} 1,000,000 以逗号分隔的數字格式
0.25 {:.2%} 25.00% 百分比格式
1000000000 {:.2e} 1.00e+09 指數記法
13 {:10d} 13 右對齊 (預設, 寬度為10)
13 {:<10d} 13 左對齊 (寬度為10)
13 {:^10d} 13 中間對齊 (寬度為10)
11

'{:b}'.format(11)

'{:d}'.format(11)

'{:o}'.format(11)

'{:x}'.format(11)

'{:#x}'.format(11)

'{:#X}'.format(11)

1011

11

13

b

0xb

0XB

進制

其中^、<、> 分别是居中、左對齊、右對齊,後面帶寬度, : 号後面帶填充的字元,隻能是一個字元,不指定則預設是用空格填充。+ 表示在正數前顯示 +,負數前顯示 -;  (空格)表示在正數前加空格。b、d、o、x 分别是二進制、十進制、八進制、十六進制。此外還可以使用大括号{}來轉義大括号,例如下面的示範代碼:

print ("{} 對應的位置是 {{0}}".format("runoob"))
           

執行後會輸出:

runoob 對應的位置是 {0}
           

1.24  函數frozenset()

在Python程式中,函數frozenset()的功能是傳回一個當機的集合,當機後的集合不能再添加或删除任何元素。使用函數frozenset()的文法格式如下所示。

class frozenset([iterable])
           

函數frozenset()能夠傳回一個新的frozenset對象,參數iterable 是一個可疊代的對象,例如清單、字典、元組等等。如果可選參數iterable存在,則frozenset的元素來自于iterable。

例如在下面的執行個體檔案fro.py中,示範了使用函數frozenset()處理結合元素的過程。

#傳入一個可疊代對象,生成一個新的不可變集合

a = frozenset(range(10))

print(a)

frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})

b = frozenset('I am a Pythoner')

print(b)



#不傳入參數時,生成的空的不可變集合。

c = frozenset()

print(c)
           

執行後會輸出:

frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9})

frozenset({'P', 'h', ' ', 'I', 'y', 't', 'e', 'm', 'n', 'a', 'r', 'o'})

frozenset()
           

1.25  函數getattr()

在Python程式中,函數getattr()的功能是傳回一個對象屬性值。使用函數getattr()的文法格式如下所示。

getattr(object, name[, default])
           
  1. object:是一個對象,函數getattr()的功能是從對象object中擷取名為name的屬性,等效與調用object.name。
  2. name:對象屬性,name必須是一個字元串。如果字元串是對象某個屬性的名字,則傳回該屬性的值。例如,getattr(x, 'foobar')等同于x.foobar。如果這個名字的屬性不存在,如果提供default則傳回它,否則引發AttributeError。
  3. default:預設傳回值,如果不提供該參數,在沒有對應屬性時,将觸發 AttributeError。

例如在下面的執行個體檔案get.py中,示範了使用函數getattr()擷取對象屬性的過程。

# 定義類Student

class Student:

    def __init__(self, name):

        self.name = name



s = Student('Aim')

print(getattr(s, 'name'))  # 等效于調用s.name

print(s.name)
           

執行後會輸出:

Aim

Aim
           

在函數getattr()中,第三個參數default為可選參數,如果在對象object中包含屬性name,則傳回屬性name的值。如果沒有屬性name,則傳回default值。如果default未傳入值,則報錯。例如下面的執行個體檔案get1.py示範了函數getattr()的這一用法。

#定義類Student

class Student:

    def __init__(self,name):

        self.name = name



s = Student('Aim')

print(getattr(s,'name'))#存在屬性name

print(getattr(s,'age',6))#不存在屬性age,但提供了預設值,傳回預設值6

print(getattr(s,'age') )#不存在屬性age,未提供預設值,調用報錯
           

執行後會輸出:

Aim

Traceback (most recent call last):

6

  File "get1.py", line 9, in <module>

    print(getattr(s,'age') )#不存在屬性age,未提供預設值,調用報錯

AttributeError: 'Student' object has no attribute 'age'