Scorciatoie orientate agli oggetti

Questo capitolo parla in dettaglio di varie funzioni integrate in Python, operazioni di I / O su file e concetti di sovraccarico.

Funzioni integrate di Python

L'interprete Python ha un numero di funzioni chiamate funzioni incorporate che sono prontamente disponibili per l'uso. Nella sua ultima versione, Python contiene 68 funzioni integrate come elencato nella tabella riportata di seguito:

FUNZIONI INTEGRATE
addominali() dict () Aiuto() min () setattr ()
tutti() dir () esadecimale() Il prossimo() fetta()
qualunque() divmod () id () oggetto() smistato()
ascii () enumerare() ingresso() ott () staticmethod ()
bidone() eval () int () Aperto() str ()
bool () exec () isinstance () ord () somma()
bytearray () filtro() issubclass () pow () super()
byte () galleggiante() iter () Stampa() tupla ()
richiamabile () formato() len () proprietà() genere()
chr () frozenset () elenco() gamma() vars ()
classmethod () getattr () locali () repr () cerniera lampo()
compilare() globali () carta geografica() invertito () __importare__()
complesso() hasattr () max () il giro()
delattr () hash () memoryview () impostato()

Questa sezione discute in breve alcune delle funzioni importanti:

funzione len ()

La funzione len () ottiene la lunghezza di stringhe, elenchi o raccolte. Restituisce la lunghezza o il numero di elementi di un oggetto, dove l'oggetto può essere una stringa, un elenco o una raccolta.

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

La funzione len () internamente funziona come list.__len__() o tuple.__len__(). Quindi, nota che len () funziona solo su oggetti che hanno un __len__() metodo.

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

Tuttavia, in pratica, preferiamo len() invece di __len__() funzione per i seguenti motivi:

  • È più efficiente. E non è necessario che un metodo particolare sia scritto per rifiutare l'accesso a metodi speciali come __len__.

  • È facile da mantenere.

  • Supporta la compatibilità con le versioni precedenti.

Invertito (seq)

Restituisce l'iteratore inverso. seq deve essere un oggetto che ha il metodo __reversed __ () o supporta il protocollo di sequenza (il metodo __len __ () e il metodo __getitem __ ()). Viene generalmente utilizzato infor loop quando vogliamo scorrere gli elementi da dietro a davanti.

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

Il ciclo for alla fine stampa l'elenco invertito di un elenco normale e le istanze delle due sequenze personalizzate. L'output lo mostrareversed() funziona su tutti e tre, ma ha risultati molto diversi quando definiamo __reversed__.

Produzione

È possibile osservare il seguente output quando si esegue il codice sopra riportato:

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

Enumerare

Il enumerate () metodo aggiunge un contatore a un iterabile e restituisce l'oggetto enumerate.

La sintassi di enumerate () è -

enumerate(iterable, start = 0)

Ecco il secondo argomento start è facoltativo e per impostazione predefinita l'indice inizia con zero (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')]
>>>

Così enumerate()restituisce un iteratore che restituisce una tupla che tiene il conteggio degli elementi nella sequenza passata. Poiché il valore restituito è un iteratore, accedervi direttamente non è molto utile. Un approccio migliore per enumerate () è mantenere il conteggio all'interno di un ciclo 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

Ci sono molte altre funzioni nella libreria standard, ed ecco un altro elenco di alcune funzioni più ampiamente utilizzate:

  • hasattr, getattr, setattr e delattr, che consente agli attributi di un oggetto di essere manipolati dai loro nomi di stringa.

  • all e any, che accetta un oggetto iterabile e restituisce True se tutti o alcuni degli elementi valutano essere veri.

  • nzip, che accetta due o più sequenze e restituisce una nuova sequenza di tuple, dove ogni tupla contiene un singolo valore da ogni sequenza.

File I / O

Il concetto di file è associato al termine programmazione orientata agli oggetti. Python ha racchiuso l'interfaccia fornita dai sistemi operativi nell'astrazione che ci consente di lavorare con gli oggetti file.

Il open()La funzione incorporata viene utilizzata per aprire un file e restituire un oggetto file. È la funzione più comunemente usata con due argomenti:

open(filename, mode)

La funzione open () chiama due argomenti, il primo è il nome del file e il secondo è la modalità. Qui la modalità può essere 'r' per la modalità di sola lettura, 'w' per la sola scrittura (un file esistente con lo stesso nome verrà cancellato) e 'a' apre il file per l'aggiunta, tutti i dati scritti nel file vengono aggiunti automaticamente all'estremità. 'r +' apre il file sia in lettura che in scrittura. La modalità predefinita è di sola lettura.

Su Windows, "b" aggiunto alla modalità apre il file in modalità binaria, quindi ci sono anche modalità come "rb", "wb" e "r + b".

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

In alcuni casi, vogliamo semplicemente aggiungere al file esistente piuttosto che sovrascriverlo, per questo potremmo fornire il valore 'a' come argomento di modalità, da aggiungere alla fine del file, piuttosto che sovrascrivere completamente il file esistente Contenuti.

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

Una volta che un file è aperto per la lettura, possiamo chiamare il metodo read, readline o readlines per ottenere il contenuto del file. Il metodo read restituisce l'intero contenuto del file come un oggetto str o bytes, a seconda che il secondo argomento sia "b".

Per la leggibilità e per evitare di leggere un file di grandi dimensioni in una volta sola, è spesso meglio usare un ciclo for direttamente su un oggetto file. Per i file di testo, leggerà ogni riga, una alla volta, e possiamo elaborarla all'interno del corpo del ciclo. Per i file binari, tuttavia, è meglio leggere blocchi di dati di dimensioni fisse utilizzando il metodo read (), passando un parametro per il numero massimo di byte da leggere.

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

Scrivendo su un file, tramite il metodo di scrittura sugli oggetti file, verrà scritto un oggetto stringa (byte per i dati binari) nel file. Il metodo writelines accetta una sequenza di stringhe e scrive ciascuno dei valori iterati nel file. Il metodo writelines non aggiunge una nuova riga dopo ogni elemento nella sequenza.

Infine il metodo close () dovrebbe essere chiamato quando abbiamo finito di leggere o scrivere il file, per assicurarci che tutte le scritture memorizzate nel buffer siano scritte sul disco, che il file sia stato adeguatamente ripulito e che tutte le risorse legate al file vengano rilasciate il sistema operativo. È un approccio migliore chiamare il metodo close () ma tecnicamente ciò avverrà automaticamente quando esiste lo script.

Un'alternativa al sovraccarico del metodo

Il sovraccarico del metodo si riferisce alla presenza di più metodi con lo stesso nome che accettano diversi set di argomenti.

Dato un singolo metodo o funzione, possiamo specificare il numero di parametri noi stessi. A seconda della definizione della funzione, può essere chiamata con zero, uno, due o più parametri.

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

Produzione

Hello
Hello Rahul

Argomenti predefiniti

Anche le funzioni sono oggetti

Un oggetto richiamabile è un oggetto che può accettare alcuni argomenti e possibilmente restituirà un oggetto. Una funzione è l'oggetto richiamabile più semplice in Python, ma ce ne sono anche altre come classi o determinate istanze di classe.

Ogni funzione in un Python è un oggetto. Gli oggetti possono contenere metodi o funzioni ma l'oggetto non è una funzione necessaria.

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)

Nel codice sopra, siamo in grado di passare due diverse funzioni come argomento nella nostra terza funzione e ottenere un output diverso per ciascuna -

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.