面向對象捷徑
本章詳細討論Python中的各種內置函數,文件I/O
操作和重載概念。
Python內置函數
Python解釋器有許多稱爲內置函數的函數,可以隨時使用。 在其最新版本中,Python包含68
個內置函數,如下表所列 -
—
—
—
—
—
any()
divmod()
id()
object()
sorted()
ascii()
enumerate()
input()
oct()
staticmethod()
bin()
eval()
int()
open()
str()
bool()
exec()
isinstance()
ord()
sum()
bytearray()
filter()
issubclass()
pow()
super()
bytes()
float()
iter()
print()
tuple()
callable()
format()
len()
property()
type()
chr()
frozenset()
list()
range()
vars()
classmethod()
getattr()
locals()
repr()
zip()
compile()
globals()
map()
reversed()
import()
complex()
hasattr()
max()
round(
-
delattr()
hash()
memoryview()
set()
-
本節簡要介紹一些重要函數/功能 -
len()函數
len()
函數獲取字符串,列表或集合的長度。 它返回對象的項目的長度或數量,其中對象可以是字符串,列表或集合。
>>> len(['hello', 9 , 45.0, 24])
4
len()
函數內部工作方式如list.__len__()
或tuple.__ len __()
。 因此,請注意,len()
僅適用於具有__len __()
方法的對象。
>>> set1
{1, 2, 3, 4}
>>> set1.__len__()
4
但是,在實踐中,我們更頃向於使用len()
而不是__len __()
函數,原因如下 -
- 它更高效。 並且寫一個特定的方法來拒絕訪問諸如
__len__
這樣的特殊方法是沒有必要的。 - 它易於維護。
- 它支持向後兼容性。
Reversed(seq)方法
它返回反向迭代器。 seq
必須是具有__reversed __()
方法或支持序列協議(__len __()
方法和__getitem __()
方法)的對象。 當我們想從後到前循環項目時,它通常用於循環。
>>> normal_list = [2, 4, 5, 7, 9]
>>>
>>> class CustomSequence():
def __len__(self):
return 5
def __getitem__(self,index):
return "x{0}".format(index)
>>> class funkyback():
def __reversed__(self):
return 'backwards!'
>>> for seq in normal_list, CustomSequence(), funkyback():
print('\n{}: '.format(seq.__class__.__name__), end="")
for item in reversed(seq):
print(item, end=", ")
最後的for
循環打印正常列表的反轉列表,以及兩個自定義序列的實例。 輸出顯示revers()
適用於它們中的所有三個,但是當定義__reversed__
時,結果會有很大不同。
執行上面給出的代碼時,可以觀察到以下輸出 -
list: 9, 7, 5, 4, 2,
CustomSequence: x4, x3, x2, x1, x0,
funkyback: b, a, c, k, w, a, r, d, s, !,
枚舉enumerate()
方法向iterable
添加一個計數器並返回枚舉對象。enumerate()
的語法是 -
enumerate(iterable, start = 0)
這裏第二個參數起始是可選的,默認情況下索引從零開始(0)。
>>> # Enumerate
>>> names = ['Rajesh', 'Rahul', 'Aarav', 'Sahil', 'Trevor']
>>> enumerate(names)
<enumerate object at 0x031D9F80>
>>> list(enumerate(names))
[(0, 'Rajesh'), (1, 'Rahul'), (2, 'Aarav'), (3, 'Sahil'), (4, 'Trevor')]
>>>
因此·enumerate()·返回一個迭代器,它產生一個元組,用於保持傳遞的序列中元素的計數。 由於返回值是一個迭代器,直接訪問它並沒有多大用處。 enumerate()
的更好方法是將計數保持在for
循環中。
>>> for i, n in enumerate(names):
print('Names number: ' + str(i))
print(n)
Names number: 0
Rajesh
Names number: 1
Rahul
Names number: 2
Aarav
Names number: 3
Sahil
Names number: 4
Trevor
標準庫中還有許多其他功能,下面是另一些更廣泛使用的功能列表 -
-
hasattr
,getattr
,setattr
和delattr
,它允許對象的屬性由其字符串名稱操作。 -
all
和any
,接受可迭代對象,如果所有或任何項目評估爲真,則返回True
。 -
nzip
,它採用兩個或多個序列並返回一個新的元組序列,其中每個元組包含每個序列的單個值。
文件I/O
文件的概念與術語面向對象編程相關。 Python封裝了操作系統在抽象中提供的接口,使我們可以使用文件對象。
open()
內置函數用於打開文件並返回文件對象。 它是兩個參數中最常用的函數 -
open(filename, mode)
open()
函數調用兩個參數,第一個是文件名,第二個是模式。 這裏的模式可以是隻讀模式的'r'
,只有寫入的模式'w'
(同名的現有文件將被刪除),'a'
打開要附加的文件,任何寫入文件的數據都會自動添加 到最後。 'r +'
打開文件進行讀寫。 默認模式是隻讀的。
在窗口中,模式附加的'b'
以二進制模式打開文件,所以也有'rb'
,'wb'
和'r + b'
等模式。
>>> text = 'This is the first line'
>>> file = open('datawork','w')
>>> file.write(text)
22
>>> file.close()
在某些情況下,我們只想附加到現有文件而不是覆蓋它,因爲可以提供值'a'
作爲模式參數,附加到文件的末尾,而不是完全覆蓋現有文件內容。
>>> f = open('datawork','a')
>>> text1 = ' This is second line'
>>> f.write(text1)
20
>>> f.close()
當打開一個文件進行讀取,可以調用read
,readline
或readlines
方法來獲取文件的內容。 read
方法將文件的全部內容作爲str
或bytes
對象返回,具體取決於第二個參數是否爲'b'
。
爲了便於閱讀,並且爲了避免一次性讀取大文件,通常最好直接在文件對象上使用for
循環。 對於文本文件,它將逐行讀取每一行,並且可以在循環體內處理它。 但對於二進制文件,最好使用read()
方法讀取固定大小的數據塊,並傳遞參數以獲取最大字節數。
>>> f = open('fileone','r+')
>>> f.readline()
'This is the first line. \n'
>>> f.readline()
'This is the second line. \n'
通過對文件對象的寫入方法寫入文件將向該文件寫入一個字符串(二進制數據的字節)對象。 writelines
方法接受一系列字符串並將每個迭代值寫入文件。 writelines
方法不在序列中的每個項目之後追加一個新行。
最後,在完成讀取或寫入文件時,應調用close()
方法,以確保將任何緩衝寫入寫入磁盤,文件已被正確清理,並將與該文件綁定的所有資源釋放回操作系統。 調用close()
方法是一個更好的方法,但從技術上講,這將在腳本存在時自動發生。
方法重載的替代方法
方法重載是指具有多個接受不同參數集的同名方法。
給定單個方法或函數,可以指定自己的參數數量。 根據函數定義,可以使用零個,一個,兩個或多個參數來調用它。
class Human:
def sayHello(self, name = None):
if name is not None:
print('Hello ' + name)
else:
print('Hello ')
#Create Instance
obj = Human()
#Call the method, else part will be executed
obj.sayHello()
#Call the method with a parameter, if part will be executed
obj.sayHello('Rahul')
執行上面示例代碼,得到以下結果 -
Hello
Hello Rahul
默認參數
函數也是對象
可調用對象是一個對象可以接受一些參數,並可能返回一個對象。 函數是Python中最簡單的可調用對象,但也有其他類似於類或某些類實例。
Python中的每個函數都是一個對象。 對象可以包含方法或函數,但對象不是必需的函數。
def my_func():
print('My function was called')
my_func.description = 'A silly function'
def second_func():
print('Second function was called')
second_func.description = 'One more sillier function'
def another_func(func):
print("The description:", end=" ")
print(func.description)
print('The name: ', end=' ')
print(func.__name__)
print('The class:', end=' ')
print(func.__class__)
print("Now I'll call the function passed in")
func()
another_func(my_func)
another_func(second_func)
在上面的代碼中,可以將兩個不同的函數作爲參數傳遞給第三個函數,併爲每個函數獲取不同的輸出 -
The description: A silly function
The name: my_func
The class:
Now I'll call the function passed in
My function was called
The description: One more sillier function
The name: second_func
The class:
Now I'll call the function passed in
Second function was called
可調用的對象
就像函數是可以在其上設置屬性的對象一樣,可以創建一個可以被調用的對象,就像它是一個函數一樣。
在Python中,可以使用函數調用語法來調用帶有__call __()
方法的任何對象。