Quiero poder convertir una cadena en una función de aceptación y devolver una cadena resultante en la que todas las letras pares estén en mayúsculas y las impares en minúsculas. Por ejemplo, "europe" se convertiría en "eUrOpE". Mi siguiente código arroja un error de sintaxis en la línea 3. ¿Qué pasa?

       def myfunc(mystring):
             for i, c in enumerate(mystring):
                  if i%2 = 0:
                        c = c.upper()
                  else:
                        c = c.lower()
                 newstring = c + c
             return newstring
-2
Raghu 10 oct. 2019 a las 06:47

4 respuestas

La mejor respuesta

Eso debería ser i%2 == 0: está asignando con =, no comparándolo con ==.

Además, si esa condición es verdadera, desea que c sea c.lower(), y viceversa, en este momento su código devolverá "EuRoPe" ya que las matrices están indexadas a cero en Python.

Finalmente, newstring solo contendrá dos copias de la última letra que le dé como está escrita en este momento, ya que cada vez que termina un ciclo for, sobrescribe su valor anterior con c+c. Intenta esto en su lugar:

def myfunc(mystring):
  newstring = ""
  for i, c in enumerate(mystring):
      if i%2 == 0:
            c = c.lower()
      else:
            c = c.upper()
      newstring = newstring + c
  return newstring

print(myfunc('hello'))

Pruébalo aquí!

1
Nick Reed 10 oct. 2019 a las 03:50

Utilice el operador de comparación (==), no el operador de asignación (=):

if i%2 == 0:

Sin embargo, puede hacer esto más fácil simplemente usando la falsedad implícita de 0:

if not i%2:
3
Alec Alameddine 10 oct. 2019 a las 03:50

Podrías usar la comprensión y join como,

>>> x = 'foobar'
>>> ''.join(c.lower() if idx % 2 == 0 else c.upper() for idx, c in enumerate(x))
'fOoBaR'
>>> def myfunc(string):
...   return ''.join(c.lower() if idx % 2 == 0 else c.upper() for idx, c in enumerate(string))
... 
>>> myfunc('foobar')
'fOoBaR'
>>> 

Además, también hay una forma divertida de hacer las cosas :) [No hagas esto]

>>> x
'foobar'
>>> # we can make use of slice awesomeness of iterables :)
>>> x[::2] # get the even parts
'foa'
>>> x[1::2] # get the odd parts
'obr'
>>> ''.join(a+b for a,b in zip(x[::2].lower(), x[1::2].upper()))
'fOoBaR'
1
han solo 10 oct. 2019 a las 05:03

Una forma más pitónica de escribir esto sería:

def modify_s(s):
    new_s = ""
    for i,c in enumerate(s):
        new_c = c.upper() if i % 2 else c.lower()
        new_s += new_c
    return new_s
1
Kevin Eaverquepedo 10 oct. 2019 a las 03:58
58315186