Python標準內建函式(21-25)
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'