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

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)
  1. object:例項物件;
  2. classinfo:可以是直接或間接類名、基本型別或者有它們組成的元組。

函式isinstance()的功能是判斷一個物件是否是一個已知的型別,其功能類似於函式type()。如果bject物件的型別與引數classinfo的型別相同則返回True,否則返回False。

注意:isinstance()與type()的區別

  1. 函式type()不會認為子類是一種父類型別,不考慮繼承關係。
  2. 函式isinstance()會認為子類是一種父類型別,考慮繼承關係。
  3. 如果要判斷兩個型別是否相同,則推薦使用函式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)
  1. class:類,表示需要檢查的型別物件;
  2. 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