1.21 函數filter()
在Python程式中,函數filter()的功能是過濾序列,過濾掉不符合條件的元素,傳回一個filter類。filter類實作了__iter__和__next__方法, 可以看成是一個疊代器, 有惰性運算的特性。使用函數filter()的文法格式如下所示。
filter(function, iterable)
- function:判斷函數;
- 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])
- object:是一個對象,函數getattr()的功能是從對象object中擷取名為name的屬性,等效與調用object.name。
- name:對象屬性,name必須是一個字元串。如果字元串是對象某個屬性的名字,則傳回該屬性的值。例如,getattr(x, 'foobar')等同于x.foobar。如果這個名字的屬性不存在,如果提供default則傳回它,否則引發AttributeError。
- 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'