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
4 respuestas
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'))
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:
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'
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