Skróty zorientowane obiektowo

W tym rozdziale omówiono szczegółowo różne funkcje wbudowane w Pythonie, operacje we / wy na plikach i koncepcje przeciążania.

Funkcje wbudowane w Pythonie

Interpreter Pythona ma wiele funkcji nazywanych funkcjami wbudowanymi, które są łatwo dostępne do użycia. W swojej najnowszej wersji Python zawiera 68 wbudowanych funkcji wymienionych w poniższej tabeli -

WBUDOWANE FUNKCJE
abs () dict () Wsparcie() min () setattr ()
wszystko() reż () klątwa() Kolejny() plasterek()
każdy() divmod () ID() obiekt() posortowane ()
ascii () wyliczać() Wejście() paź () staticmethod ()
kosz() eval () int () otwarty() str ()
bool () exec () isinstance () ord () suma()
bytearray () filtr() issubclass () pow () Wspaniały()
bajty () pływak() iter () wydrukować() krotka ()
wywoływany () format() len () własność() rodzaj()
chr () Frozenset () lista() zasięg() vars ()
classmethod () getattr () miejscowi () repr () zamek błyskawiczny()
skompilować() globale () mapa() wywrócony() __import__()
złożony() hasattr () max () okrągły()
delattr () haszysz() Widok pamięciowy() zestaw()

W tej sekcji omówiono pokrótce niektóre z ważnych funkcji -

funkcja len ()

Funkcja len () pobiera długość łańcuchów, listy lub kolekcji. Zwraca długość lub liczbę elementów obiektu, gdzie obiekt może być łańcuchem, listą lub kolekcją.

>>> len(['hello', 9 , 45.0, 24])
4

Funkcja len () działa wewnętrznie jak list.__len__() lub tuple.__len__(). W związku z tym zwróć uwagę, że len () działa tylko na obiektach, które mają znak __len__() metoda.

>>> set1
{1, 2, 3, 4}
>>> set1.__len__()
4

Jednak w praktyce wolimy len() zamiast tego __len__() działają z następujących powodów -

  • Jest bardziej wydajna. I nie jest konieczne, aby określona metoda była napisana w celu odmowy dostępu do metod specjalnych, takich jak __len__.

  • Jest łatwy w utrzymaniu.

  • Obsługuje kompatybilność wsteczną.

Reversed (seq)

Zwraca iterator odwrotny. seq musi być obiektem, który ma metodę __reversed __ () lub obsługuje protokół sekwencji (metodę __len __ () i metodę __getitem __ ()). Jest zwykle używany wfor pętle, gdy chcemy zapętlić elementy od tyłu do przodu.

>>> 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=", ")

Pętla for na końcu wypisuje odwróconą listę normalnej listy oraz wystąpienia dwóch niestandardowych sekwencji. Dane wyjściowe to pokazująreversed() działa na wszystkich trzech z nich, ale daje bardzo różne wyniki, kiedy je definiujemy __reversed__.

Wynik

Po wykonaniu powyższego kodu można zaobserwować następujące dane wyjściowe -

list: 9, 7, 5, 4, 2,
CustomSequence: x4, x3, x2, x1, x0,
funkyback: b, a, c, k, w, a, r, d, s, !,

Wyliczać

Plik enumerate () metoda dodaje licznik do iterowalnej i zwraca obiekt wyliczeniowy.

Składnia enumerate () to -

enumerate(iterable, start = 0)

Tutaj drugi argument start jest opcjonalny i domyślnie indeks zaczyna się od zera (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')]
>>>

Więc enumerate()zwraca iterator, który zwraca krotkę, która przechowuje liczbę elementów w przekazanej sekwencji. Ponieważ wartość zwracana jest iteratorem, bezpośredni dostęp do niej nie jest zbyt przydatny. Lepszym podejściem do enumerate () jest utrzymywanie count w pętli 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

W bibliotece standardowej znajduje się wiele innych funkcji, a oto kolejna lista bardziej powszechnie używanych funkcji -

  • hasattr, getattr, setattr i delattr, co pozwala na manipulowanie atrybutami obiektu za pomocą ich nazw łańcuchowych.

  • all i any, które akceptują iterowalny obiekt i zwracają True jeśli wszystkie lub jakiekolwiek elementy zostaną ocenione jako prawdziwe.

  • nzip, który przyjmuje dwie lub więcej sekwencji i zwraca nową sekwencję krotek, gdzie każda krotka zawiera jedną wartość z każdej sekwencji.

We / wy pliku

Pojęcie plików jest związane z terminem programowania obiektowego. Python opakował interfejs udostępniany przez systemy operacyjne w sposób abstrakcyjny, co pozwala nam pracować z obiektami plików.

Plik open()wbudowana funkcja służy do otwierania pliku i zwracania obiektu pliku. Jest to najczęściej używana funkcja z dwoma argumentami -

open(filename, mode)

Funkcja open () wywołuje dwa argumenty, pierwszy to nazwa pliku, a drugi to tryb. Tutaj trybem może być „r” dla trybu tylko do odczytu, „w” dla samego zapisu (istniejący plik o tej samej nazwie zostanie usunięty), a „a” otwiera plik do dołączenia, wszelkie dane zapisane w pliku są automatycznie dodawane do końca. „r +” otwiera plik do odczytu i zapisu. Domyślnym trybem jest tylko do odczytu.

W systemie Windows, „b” dołączone do trybu otwiera plik w trybie binarnym, więc są też tryby takie jak „rb”, „wb” i „r + b”.

>>> text = 'This is the first line'
>>> file = open('datawork','w')
>>> file.write(text)
22
>>> file.close()

W niektórych przypadkach chcemy po prostu dopisać do istniejącego pliku zamiast go nadpisywać, w tym celu moglibyśmy podać wartość 'a' jako argument trybu, aby dołączyć do końca pliku, zamiast całkowicie nadpisywać istniejący plik zawartość.

>>> f = open('datawork','a')
>>> text1 = ' This is second line'
>>> f.write(text1)
20
>>> f.close()

Po otwarciu pliku do odczytu możemy wywołać metodę read, readline lub readlines, aby pobrać zawartość pliku. Metoda read zwraca całą zawartość pliku jako obiekt str lub bajtów, w zależności od tego, czy drugi argument to „b”.

Aby zapewnić czytelność i uniknąć odczytywania dużego pliku za jednym razem, często lepiej jest użyć pętli for bezpośrednio na obiekcie pliku. W przypadku plików tekstowych odczyta każdą linię, pojedynczo i możemy przetworzyć ją wewnątrz ciała pętli. Jednak w przypadku plików binarnych lepiej jest odczytywać fragmenty danych o stałej wielkości przy użyciu metody read (), przekazując parametr określający maksymalną liczbę bajtów do odczytania.

>>> f = open('fileone','r+')
>>> f.readline()
'This is the first line. \n'
>>> f.readline()
'This is the second line. \n'

Zapis do pliku, poprzez metodę write na obiektach pliku, zapisze obiekt typu string (bajty dla danych binarnych) do pliku. Metoda writelines akceptuje sekwencję ciągów i zapisuje każdą z iterowanych wartości do pliku. Metoda writelines nie dodaje nowego wiersza po każdym elemencie w sekwencji.

Na koniec należy wywołać metodę close (), gdy skończymy odczytywać lub zapisywać plik, aby upewnić się, że wszelkie buforowane zapisy są zapisywane na dysku, plik został odpowiednio wyczyszczony i że wszystkie zasoby powiązane z plikiem są z powrotem system operacyjny. Lepszym podejściem jest wywołanie metody close (), ale technicznie rzecz biorąc, nastąpi to automatycznie, gdy skrypt istnieje.

Alternatywa dla przeciążania metod

Przeciążanie metod odnosi się do posiadania wielu metod o tej samej nazwie, które akceptują różne zestawy argumentów.

Mając jedną metodę lub funkcję, możemy sami określić liczbę parametrów. W zależności od definicji funkcji można ją wywołać z zerem, jednym, dwoma lub więcej parametrami.

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')

Wynik

Hello
Hello Rahul

Argumenty domyślne

Funkcje też są obiektami

Obiekt wywoływalny to obiekt, który może przyjmować pewne argumenty i prawdopodobnie zwróci obiekt. Funkcja jest najprostszym wywoływalnym obiektem w Pythonie, ale są też inne, takie jak klasy lub niektóre instancje klas.

Każda funkcja w Pythonie jest obiektem. Obiekty mogą zawierać metody lub funkcje, ale obiekt nie jest funkcją.

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)

W powyższym kodzie jesteśmy w stanie przekazać dwie różne funkcje jako argument do naszej trzeciej funkcji i uzyskać różne dane wyjściowe dla każdej z nich -

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 
       
      

callable objects

Just as functions are objects that can have attributes set on them, it is possible to create an object that can be called as though it were a function.

In Python any object with a __call__() method can be called using function-call syntax.