1. 程式人生 > >Python標準內建函式(21-25)

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'