una ultimo suma palabra operaciones metodos largo ejercicios contar con caracteres caracter cadenas python

ultimo - suma de cadenas python



¿Hay alguna razón por la cual las cadenas de Python no tengan un método de longitud de cadena? (8)

Sé que Python tiene una función len() que se usa para determinar el tamaño de una cadena, pero me preguntaba por qué no es un método del objeto de cadena.

Actualizar

Ok, me di cuenta de que estaba avergonzantemente equivocado. __len__() es en realidad un método de un objeto de cadena. Parece extraño ver el código orientado a objetos en Python usando la función len en objetos de cadena. Además, también es extraño ver a __len__ como el nombre en lugar de solo len.


Aquí hay algunas respuestas excelentes, así que antes de dar las mías, me gustaría destacar algunas de las gemas (sin juego de palabras con rubí) que he leído aquí.

  • Python no es un lenguaje OOP puro: es un lenguaje multi-paradigma de propósito general que le permite al programador utilizar el paradigma con el que se siente más cómodo y / o el paradigma más adecuado para su solución.
  • Las funciones tienen funciones de primera clase, por lo que len es en realidad un objeto. Ruby, por otro lado, no tiene funciones de primera clase. Entonces, el objeto de la función len tiene sus propios métodos que puede inspeccionar ejecutando dir(len) .

Si no le gusta la forma en que esto funciona en su propio código, es trivial para usted volver a implementar los contenedores utilizando su método preferido (ver el ejemplo a continuación).

>>> class List(list): ... def len(self): ... return len(self) ... >>> class Dict(dict): ... def len(self): ... return len(self) ... >>> class Tuple(tuple): ... def len(self): ... return len(self) ... >>> class Set(set): ... def len(self): ... return len(self) ... >>> my_list = List([1,2,3,4,5,6,7,8,9,''A'',''B'',''C'',''D'',''E'',''F'']) >>> my_dict = Dict({''key'': ''value'', ''site'': ''''}) >>> my_set = Set({1,2,3,4,5,6,7,8,9,''A'',''B'',''C'',''D'',''E'',''F''}) >>> my_tuple = Tuple((1,2,3,4,5,6,7,8,9,''A'',''B'',''C'',''D'',''E'',''F'')) >>> my_containers = Tuple((my_list, my_dict, my_set, my_tuple)) >>> >>> for container in my_containers: ... print container.len() ... 15 2 15 15


Hay un método len :

>>> a = ''a string of some length'' >>> a.__len__() 23 >>> a.__len__ <method-wrapper ''__len__'' of str object at 0x02005650>


La respuesta de Jim a esta pregunta puede ayudar; Lo copio aquí Citando a Guido van Rossum:

Antes que nada, elegí len (x) sobre x.len () para razones de HCI (def __len __ () llegó mucho más tarde). En realidad, hay dos razones entrelazadas, ambas HCI:

(a) Para algunas operaciones, la notación de prefijo simplemente lee mejor que postfix - las operaciones de prefijo (¡e infijo!) tienen una larga tradición en matemáticas a las que les gustan las notaciones donde los elementos visuales ayudan al matemático a pensar en un problema. Compare la facilidad con la que reescribimos una fórmula como x * (a + b) en x a + x b a la torpeza de hacer lo mismo usando una notación OO cruda.

(b) Cuando leo un código que dice len (x) sé que está pidiendo la longitud de algo. Esto me dice dos cosas: el resultado es un número entero, y el argumento es algún tipo de contenedor. Por el contrario, cuando leo x.len (), tengo que saber que x es un tipo de contenedor que implementa una interfaz o hereda de una clase que tiene un len () estándar. Sea testigo de la confusión que ocasionalmente tenemos cuando una clase que no implementa una asignación tiene un método get () o keys (), o algo que no es un archivo tiene un método write ().

Al decir lo mismo de otra manera, veo ''len'' como una operación incorporada. Odiaría perder eso. / ... /


Las cadenas tienen un método de longitud: __len__()

El protocolo en Python es implementar este método en objetos que tienen una longitud y usan la función len() incorporada, que lo llama por usted, similar a la forma en que implementaría __iter__() y usaría el iter() incorporado iter() función (o hacer que el método se llame entre bastidores para usted) en objetos que son iterables.

Vea Emular tipos de contenedor para más información.

Aquí hay una buena lectura sobre el tema de los protocolos en Python: Python y el principio de asombro mínimo


No?

>>> "abc".__len__() 3


Python es un lenguaje de programación pragmático, y las razones para que len() sea ​​una función y no un método de str , list , dict , etc. son pragmáticas.

La función incorporada len() trata directamente con los tipos incorporados: la implementación CPython de len() realmente devuelve el valor del campo ob_size en la PyVarObject C de PyVarObject que representa cualquier objeto incorporado de tamaño variable en la memoria. Esto es mucho más rápido que llamar a un método; no es necesario que se realicen búsquedas de atributos. Obtener la cantidad de elementos en una colección es una operación común y debe funcionar de manera eficiente para tipos básicos y diversos como str , list , array.array , etc.

Sin embargo, para promover la coherencia, al aplicar len(o) a un tipo definido por el usuario, Python llama a o.__len__() como una alternativa. __len__ , __abs__ y todos los demás métodos especiales documentados en Python Data Model facilitan la creación de objetos que se comportan como los integrables, lo que permite las API expresivas y altamente consistentes que llamamos "Pythonic".

Al implementar métodos especiales, sus objetos pueden admitir iteraciones, sobrecargar operadores infix, administrar contextos with bloques, etc. Puede pensar en el Modelo de Datos como una forma de usar el lenguaje Python como un marco donde los objetos que crea pueden integrarse sin problemas.

Una segunda razón, respaldada por citas de Guido van Rossum como esta , es que es más fácil leer y escribir len(s) que s.len() .

La notación len(s) es consistente con operadores unarios con notación de prefijo, como abs(n) . len() se usa mucho más a menudo que abs() , y merece ser tan fácil de escribir.

También puede haber una razón histórica: en el lenguaje ABC que precedió a Python (y fue muy influyente en su diseño), había un operador unario escrito como #s que significa len(s) .


También puede decir

>> x = ''test'' >> len(x) 4

Usando Python 2.7.3.


met% python -c ''import this'' | grep ''only one'' There should be one-- and preferably only one --obvious way to do it.