Atajos orientados a objetos

Este capítulo habla en detalle sobre varias funciones integradas en Python, operaciones de E / S de archivos y conceptos de sobrecarga.

Funciones integradas de Python

El intérprete de Python tiene una serie de funciones llamadas funciones integradas que están disponibles para su uso. En su última versión, Python contiene 68 funciones integradas que se enumeran en la tabla que se muestra a continuación:

FUNCIONES INTEGRADAS
abdominales() dictar () ayuda() min () setattr ()
todas() dir () maleficio() siguiente() rebanada()
ninguna() divmod () carné de identidad() objeto() ordenado ()
ascii () enumerar() entrada() oct() método estático ()
compartimiento() eval () En t() abierto() str ()
bool () ejecutivo () isinstance () ord () suma()
bytearray () filtrar() issubclass () pow () súper()
bytes () flotador() iter () impresión() tupla ()
invocable () formato() len () propiedad() tipo()
chr () congelado () lista() rango() vars ()
método de clase () getattr () lugareños () repr () Código Postal()
compilar() globals () mapa() invertido () __importar__()
complejo() hasattr () max () redondo()
delattr () picadillo() vista de la memoria() conjunto()

Esta sección discute algunas de las funciones importantes en breve:

función len ()

La función len () obtiene la longitud de cadenas, listas o colecciones. Devuelve la longitud o el número de elementos de un objeto, donde el objeto puede ser una cadena, una lista o una colección.

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

La función len () funciona internamente como list.__len__() o tuple.__len__(). Por lo tanto, tenga en cuenta que len () funciona solo en objetos que tienen un __len__() método.

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

Sin embargo, en la práctica, preferimos len() en vez de __len__() funcionan debido a las siguientes razones:

  • Es más eficiente. Y no es necesario que se escriba un método en particular para rechazar el acceso a métodos especiales como __len__.

  • Es de fácil mantenimiento.

  • Es compatible con la compatibilidad con versiones anteriores.

Invertido (seq)

Devuelve el iterador inverso. seq debe ser un objeto que tenga el método __reversed __ () o que admita el protocolo de secuencia (el método __len __ () y el método __getitem __ ()). Generalmente se usa enfor se repite cuando queremos recorrer elementos de atrás hacia adelante.

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

El bucle for al final imprime la lista invertida de una lista normal y las instancias de las dos secuencias personalizadas. La salida muestra quereversed() funciona en los tres, pero tiene resultados muy diferentes cuando definimos __reversed__.

Salida

Puede observar la siguiente salida cuando ejecuta el código dado anteriormente:

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

Enumerar

los enumerate () El método agrega un contador a un iterable y devuelve el objeto enumerado.

La sintaxis de enumerate () es -

enumerate(iterable, start = 0)

Aquí el segundo argumento start es opcional y, por defecto, el índice comienza con cero (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')]
>>>

Entonces enumerate()devuelve un iterador que produce una tupla que mantiene el recuento de los elementos en la secuencia pasada. Dado que el valor de retorno es un iterador, acceder directamente a él no es muy útil. Un mejor enfoque para enumerate () es mantener el recuento dentro de un bucle 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

Hay muchas otras funciones en la biblioteca estándar, y aquí hay otra lista de algunas funciones más utilizadas:

  • hasattr, getattr, setattr y delattr, que permite que los atributos de un objeto sean manipulados por sus nombres de cadena.

  • all y any, que aceptan un objeto iterable y devuelven True si todos o algunos de los elementos se evalúan como verdaderos.

  • nzip, que toma dos o más secuencias y devuelve una nueva secuencia de tuplas, donde cada tupla contiene un único valor de cada secuencia.

E / S de archivos

El concepto de archivos está asociado con el término programación orientada a objetos. Python ha envuelto la interfaz que los sistemas operativos proporcionan en abstracción que nos permite trabajar con objetos de archivo.

los open()La función incorporada se utiliza para abrir un archivo y devolver un objeto de archivo. Es la función más utilizada con dos argumentos:

open(filename, mode)

La función open () llama a dos argumentos, el primero es el nombre del archivo y el segundo es el modo. Aquí el modo puede ser 'r' para modo de solo lectura, 'w' para solo escritura (se borrará un archivo existente con el mismo nombre), y 'a' abre el archivo para agregarlo, cualquier dato escrito en el archivo se agrega automáticamente hasta el final. 'r +' abre el archivo tanto para lectura como para escritura. El modo predeterminado es solo lectura.

En Windows, la 'b' adjunta al modo abre el archivo en modo binario, por lo que también hay modos como 'rb', 'wb' y 'r + b'.

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

En algunos casos, solo queremos agregar al archivo existente en lugar de sobrescribirlo, para eso podríamos proporcionar el valor 'a' como un argumento de modo, para agregar al final del archivo, en lugar de sobrescribir completamente el archivo existente contenido.

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

Una vez que se abre un archivo para su lectura, podemos llamar al método read, readline o readlines para obtener el contenido del archivo. El método de lectura devuelve todo el contenido del archivo como un objeto str o bytes, dependiendo de si el segundo argumento es 'b'.

Para facilitar la lectura y para evitar leer un archivo grande de una sola vez, a menudo es mejor usar un bucle for directamente en un objeto de archivo. Para archivos de texto, leerá cada línea, una a la vez, y podemos procesarla dentro del cuerpo del bucle. Sin embargo, para archivos binarios es mejor leer fragmentos de datos de tamaño fijo usando el método read (), pasando un parámetro para el número máximo de bytes a leer.

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

Al escribir en un archivo, mediante el método de escritura en objetos de archivo, se escribe un objeto de cadena (bytes para datos binarios) en el archivo. El método Writelines acepta una secuencia de cadenas y escribe cada uno de los valores iterados en el archivo. El método de líneas de escritura no agrega una nueva línea después de cada elemento de la secuencia.

Finalmente, se debe llamar al método close () cuando hayamos terminado de leer o escribir el archivo, para garantizar que las escrituras almacenadas en el búfer se escriban en el disco, que el archivo se haya limpiado correctamente y que todos los recursos vinculados con el archivo se devuelvan a El sistema operativo. Es un mejor enfoque para llamar al método close () pero técnicamente esto sucederá automáticamente cuando exista el script.

Una alternativa a la sobrecarga de métodos

La sobrecarga de métodos se refiere a tener varios métodos con el mismo nombre que aceptan diferentes conjuntos de argumentos.

Dado un solo método o función, podemos especificar el número de parámetros nosotros mismos. Dependiendo de la definición de la función, se puede llamar con cero, uno, dos o más parámetros.

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

Salida

Hello
Hello Rahul

Argumentos predeterminados

Las funciones también son objetos

Un objeto invocable es un objeto que puede aceptar algunos argumentos y posiblemente devolverá un objeto. Una función es el objeto invocable más simple en Python, pero también hay otros como clases o ciertas instancias de clase.

Cada función en un Python es un objeto. Los objetos pueden contener métodos o funciones, pero el objeto no es necesariamente una función.

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)

En el código anterior, podemos pasar dos funciones diferentes como argumento a nuestra tercera función y obtener una salida diferente para cada una:

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.