## A little helper program that capitalizes the first letter of a word
def Cap (s):
    s = s.upper()[0]+s[1:]
    return s 

Me da este error :

Traceback (most recent call last):
  File "\prov-dc\students\jadewusi\crack2.py", line 447, in <module>
    sys.exit(main(sys.argv[1:]))
  File "\prov-dc\students\jadewusi\crack2.py", line 398, in main
    foundit = search_method_3("passwords.txt")
  File "\prov-dc\students\jadewusi\crack2.py", line 253, in search_method_3
    ourguess_pass = Cap(ourguess_pass)
  File "\prov-dc\students\jadewusi\crack2.py", line 206, in Cap
    s = s.upper()[0]+s[1:]
IndexError: string index out of range
  • Esto significa s es una cadena vacía. Usted tendrá que averiguar por qué ourguess_pass está vacía.
  • ¿cuál es tu entrada ‘s’?
InformationsquelleAutor user2894 | 2014-03-20

4 Comentarios

  1. 4

    Como otros ya han señalado, el problema es que usted está tratando de acceder a un elemento en una cadena vacía. En lugar de añadir un tratamiento especial en su aplicación, usted puede simplemente utilizar capitalizar:

    'hello'.capitalize()
    => 'Hello'
    ''.capitalize()
    => ''
    • El OP de error indica claramente que la cadena con la que él está tratando de trabajar está vacía. Por el momento, esto no es una solución para el problema, ya que ignora el verdadero problema por lo tanto no funcionará bien.
    • capitalizar no tiro un error aunque, no le va a devolver la cadena vacía (lo que parece razonable el comportamiento en el dado caso de uso), por lo que yo diría que esto es una clara mejora sobre el enfoque OP presentado.
    • Este no es el mismo que el OP del código cuando se trabaja, aunque. La OP del código se escribe con mayúscula la primera letra, pero deja el resto solo. Llamar .capitalize() letras minúsculas las letras restantes también. Para aquellos de nosotros cuya familia que los nombres de dos letras mayúsculas, como en MacGregor o O'Sullivan, esto puede ser muy molesto.
  2. 3

    Sopla hasta que, supuestamente, porque no hay indexación de una cadena vacía.

    >>> ''[0]
    Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
    IndexError: string index out of range

    Y como se ha señalado, la división de una cadena de llamar str.upper() en una sola letra puede ser suplantado por str.capitalize().

    Además, si usted regularmente debe encontrarse en una situación donde esto sería pasa una cadena vacía, se puede manejar de dos maneras:

    …#whatever previous code comes before your function
    if my_string:
        Cap(my_string)    #or str.capitalize, or…

    if my_string ser más o menos como if len(my_string) > 0.

    Y siempre hay os de edad try/except, aunque creo que usted querrá considerar el ye olde refactorizar primero:

    #your previous code, leading us to here…
    try:
        Cap(my_string)
    except IndexError:
        pass

    Yo no permanecer casado con la indexación de una cadena de llamar str.upper() en un solo personaje, pero usted puede tener un único conjunto de razones para hacerlo. Todas las cosas en igualdad de condiciones, sin embargo, str.capitalize() realiza la misma función.

  3. 2
    >>> s = 'macGregor'
    >>> s.capitalize()
    'Macgregor'
    >>> s[:1].upper() + s[1:]
    'MacGregor'
    >>> s = ''
    >>> s[0]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    IndexError: string index out of range
    >>> s[:1].upper() + s[1:]
    ''

    ¿Por qué s[1:] no la libertad bajo fianza en una cadena vacía?

    Tutorial sobre cadenas dice:

    Degenerados rebanada índices son manejados correctamente: un índice que es demasiado
    grande es reemplazado por el tamaño de la cadena, un límite superior más pequeño que el
    límite inferior devuelve una cadena vacía.

    Ver también Python rebanada de notación.

    • +1 me gusta. ¿Por qué s[1:] no la libertad bajo fianza en una cadena vacía?
    • He actualizado la respuesta
    • El mensaje de error mencionado en el OP aparece también cuando la cadena no está vacía. Acabo de imprimir el argumento de cadena justo después de entrar en la función y antes de acceder a ella mediante el uso de [ ], no se imprime la cadena que ciertamente no estaba vacía.
    • plantea IndexError sólo para las cadenas vacías.
  4. 0

    Yo sólo tenía el mismo error, mientras que yo estaba seguro que mi cadena no está vacía. Así que pensé en compartir esto aquí, para que la gente que llegue ese error tiene como muchos potentional razones como sea posible.

    En mi caso, yo he declarado una cadena de caracteres, y python al parecer lo vio como un tipo char. Funcionó cuando he añadido otro personaje. No sé por qué no convertir de forma automática, pero esto podría ser una razón que hace que un «IndexError: string index out of range», incluso si usted piensa que la supuesta cadena no está vacía.

    Puede variar entre diferentes versiones de Python, veo a la pregunta original, se refiere a Python 3. Yo Python 2.6 cuando esto sucedió.

Dejar respuesta

Please enter your comment!
Please enter your name here