Python標準內建函式(31-35)
1.31 函式id()
在Python程式中,使用函式id()的語法格式如下所示。
id(object)
函式id()的功能是獲取物件object的記憶體地址,這個記憶體地址是一個整數,能夠保證在該物件的生命週期內是唯一的和恆定的。在Python程式中,具有不重疊壽命的兩個物件可以具有相同的id()值。
例如在下面的例項檔案id.py中,演示了用函式id()獲取指定物件記憶體地址的過程。
a = 1 print(id(a)) print(id(1)) b=1.0 print(id(b)) print(id(1.0)) a = 'some text' print(id(a))
在上述程式碼中,1和1.0的記憶體地址是不同的,所以使用id()執行後的結果也不相同。執行後會輸出:
1556399792
1556399792
2893235631592
2893235631592
2893235760496
1.32 函式input()
在Python程式中,使用函式input()的語法格式如下所示。
input([prompt])
函式input()的功能是獲取使用者在控制檯中輸入的資訊。如果有prompt引數,則將它輸出到標準輸出且不帶換行。然後函式input()從標準輸入讀取一行,將它轉換成一個字串(去掉一個末尾的換行符),然後返回它。當讀取到EOF時,會產生EOFError錯誤。
例如在下面的例項檔案input.py中,演示了用函式input()獲取控制檯資訊的過程。
s = input('please input your name:')
print(s)
a = input("input a num:")
①print(type(a))
a = input("input a num:")
②b=eval(a)
③print(type(b))
執行後會輸出:
please input your name:guan guan input a num:100 <class 'str'> input a num:100 <class 'int'>
①行程式碼執行後如果輸入了數字“123”,但是執行後函式input()將設定預設輸入的是字串型別,所以執行後顯示為“<class 'str'>”。因為在②使用函式eval()將輸入的數字“123”進行轉換,所以③執行後會顯示正確的型別“<class 'int'>”。
1.33 函式int()
在Python程式中,使用函式int()的語法格式如下所示。
class int(x=0)
class int(x, base=10)
函式int()的功能是將一個字串或數字轉換為整型。引數x是一個字串或數字,引數base 表示進位制數,預設為十進位制。函式int()能夠從數字或字串(x)構造並返回一個整數物件,如果沒有給出引數x則返回0。如果 x 是一個數字,返回 x.__int__()。如果x是一個浮點數,將截斷到零隻取整。如果引數x不是數字,或者如果給定引數base,則x必須是字串bytes bytearray例項代表基數base中的integer literal。字面量的前面可以有+或者-(中間不能有空格),周圍可以有空白。以n為基數的字面量包含數字0到n-1,用a到z(或者A到Z)來表示10到35。Base的預設值是10。如果base為0則意味著完全解釋為程式碼字面值,使得實際基數為2,8,10或16,並且使得int('010',0)是不合法的,而int('010')是以及int('010',8)。
例如在下面的例項檔案int.py中,演示了用函式int()處理數字的過程。
#不傳入引數時,得到結果0。
print(int())
#傳入數值時,呼叫其__int__()方法,浮點數將向下取整。
print(int(3))
print(int(3.6)) # 傳入字串時,預設以10進位制進行轉換。
#print(int('3.6'))#這行程式碼將會出錯
print(int('12',16)) # 如果是帶引數base的話,12要以字串的形式進行輸入,12 為 16進位制
print(int('0xa',16))
print(int('10',8))
#傳入字串,並指定了進位制,則按對應進位制將字串轉換成10進位制整數。
print(int('01',2))
print(int('02',3))
print(int('07',8))
print(int('0f',16))
執行後會輸出:
0
3
3
18
10
8
1
2
7
15
在使用函式int()時,允許在處理的字串中包含"+"、"-"號,但是加減號與數值之間不能有空格,在數值後、符號前可以出現空格。例如下面的演示程式碼說明了這一點。
>>> int('+36')
36
>>> int('-36')
-36
>>> int(' -36 ')
-36
>>> int(' - 36 ')
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
int(' - 36 ')
ValueError: invalid literal for int() with base 10: ' - 36
1.34 函式isinstance()
在Python程式中,使用函式isinstance()的語法格式如下所示。
isinstance(object, classinfo)
- object:例項物件;
- classinfo:可以是直接或間接類名、基本型別或者有它們組成的元組。
函式isinstance()的功能是判斷一個物件是否是一個已知的型別,其功能類似於函式type()。如果bject物件的型別與引數classinfo的型別相同則返回True,否則返回False。
注意:isinstance()與type()的區別
- 函式type()不會認為子類是一種父類型別,不考慮繼承關係。
- 函式isinstance()會認為子類是一種父類型別,考慮繼承關係。
- 如果要判斷兩個型別是否相同,則推薦使用函式isinstance()。
例如在下面的例項檔案ins.py中,演示了用函式isinstance()處理指定物件的過程。
a = 2
print(isinstance (a,int))
print(isinstance (a,str))
print(isinstance (a,(str,int,list)) )# 是元組中的一個返回 True
print(isinstance(1,int))
print(isinstance(1,str))
# 定義3各類:C繼承B,B繼承A
class A:
pass
class B(A):
pass
class C(B):
pass
a = A()
b = B()
c = C()
print(isinstance(a,A))#直接例項
print(isinstance(a,B))
print(isinstance(b,A))#子類例項
print(isinstance(c,A))#孫子類例項
執行後會輸出:
True
False
True
True
False
True
False
True
True
如果引數object傳入的是型別物件,則始終返回False,例如下面的演示過程。
>>> isinstance(str,str)
False
>>> isinstance(bool,int)
False
如果classinfo型別物件是多個型別物件組成的元組,如果object物件是元組的任一型別物件中例項,則返回True,否則返回False。例如下面的演示過程。
>>> isinstance(a,(B,C))
False
>>> isinstance(a,(A,B,C))
True
如果classinfo型別物件不是一個型別物件或者由多個型別物件組成的元組,則會報錯(TypeError),例如下面的演示過程。
>>> isinstance(a,[A,B,C])
Traceback (most recent call last):
File "<pyshell#23>", line 1, in <module>
isinstance(a,[A,B,C])
TypeError: isinstance() arg 2 must be a type or tuple of types
下面的例項程式碼演示了函式type()與isinstance()的區別:
class A:
pass
class B(A):
pass
isinstance(A(), A) #returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False
1.35 函式issubclass()
在Python程式中,使用函式issubclass()的語法格式如下所示。
issubclass(class, classinfo)
- class:類,表示需要檢查的型別物件;
- classinfo:類,表示需要對比型別物件。
函式issubclass()的功能是判斷引數class是否是型別引數classinfo的子類。如果class引數是引數classinfo的型別物件(或者classinfo類物件的直接、間接、虛擬子類)的例項,返回True。
例如在下面的例項檔案iss.py中,演示了用函式issubclass()處理指定物件的過程。
print(issubclass(bool, int))
print(issubclass(bool, (str)))
class A:
pass
class B(A):
pass
print(issubclass(B, A)) # 返回 True
執行後會輸出:
True
False
True
任何一個類都是自己類的子類,即class和calssinfo傳入相同型別時會返回True。例如下面的演示過程。
>>> class A:
pass
>>> issubclass(A,A)
True
如果classinfo型別物件是多個型別物件組成的元組,如果class型別物件是元組的任一型別物件的子類,則返回True,否則返回False。例如下面的演示過程。
>>> issubclass(bool,int)
True
>>> issubclass(bool,str)
False
>>> issubclass(bool,(str,int))
如果classinfo型別物件不是一個型別物件或者由多個型別物件組成的元組,則會報錯(TypeError)。例如下面的演示過程。
>>> issubclass(bool,[str,int])
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
issubclass(bool,[str,int])
TypeError: issubclass() arg 2 must be a class or tuple of classes