Вы не используете for i in word:
вне функции. Ваш l oop проверяет каждую букву , и в вашем значении mystring
есть повторяющиеся буквы (и пробелы). Вы не проверяете, является ли их индекс четным.
Иными словами, mystring[0::2]
используется как набор букв для включения в результат, это не сам результат, и Python не отслеживает, с каких индексов они пришли.
Возможно, вы ожидали, что if i in word[0::2]:
примет во внимание положение в word
буквы в i
. Если так, то здесь ваше понимание неверно; for i in word:
устанавливает i
в односимвольную строку (начиная с 'T'
, затем 'h'
, затем 'i'
, затем 's'
, et c.), Но между i = 's'
нет никакой связи это оригинальное местоположение в word
больше. То, что 's'
пришло из позиции 3
в word
, не имеет значения и не записано , только то, что word[0::2]
также содержит значение 's'
. Обратите внимание, что word[0::2]
также является просто строкой, символ ' '
в ней является просто символом пробела, Python не записал, что он пришел с позиции 4 в word
изначально.
Давайте рассмотрим, что происходит в функции, шаг за шагом. Учитывая ввод 'This is a string'
, результат word[0::2]
равен 'Ti sasrn'
, поэтому значения 'T'
, 'i'
, ' '
, 's'
, 'a'
, 'r'
и 'n'
- все содержится в нем (с 's'
содержится дважды ). Тогда результат теста if i in word[0::2]:
в l oop для каждой буквы будет следующим:
i = 'T'
, 'T' in word[0::2]
верно, 'T'
добавлено. i = 'h'
, 'h' in word[0::2]
ложно. i = 'i'
, 'i' in word[0::2]
верно, добавлено 'I'
. i = 's'
, 's' in word[0::2]
верно , 'S'
добавлено. i = ' '
, ' ' in word[0::2]
верно, ' '
добавлено. i = 'i'
, 'i' in word[0::2]
верно, 'I'
добавлено . i = 's'
, 's' in word[0::2]
верно, 'S'
добавлено. i = ' '
, ' ' in word[0::2]
верно, ' '
добавлено. i = 'a'
, 'a' in word[0::2]
верно, 'A'
добавлено. i = ' '
, ' ' in word[0::2]
верно, ' '
добавлено. i = 's'
, 's' in word[0::2]
верно, 'S'
добавлено. i = 't'
, 't' in word[0::2]
неверно, регистр имеет значение! i = 'r'
, 'r' in word[0::2]
верно, 'T'
равно добавлено. i = 'i'
, 'i' in word[0::2]
верно, 'I'
добавлено. i = 'n'
, 'n' in word[0::2]
верно, 'N'
добавлено. i = 'g'
, 'g' in word[0::2]
ложно.
Вместе, что out
содержит ['T','I','S', ' ', 'I','S', ' ','A', ' ','S','R','I','N']
.
Обратите внимание, что значение 't'
fro m слово string
- , а не на выходе, потому что 't'
не равно 'T'
, что равно в результате word[0::2]
. При проверке на равенство строк регистр имеет значение.
Если вы хотите проверить, находится ли буква на четной позиции, вам нужно добавить счетчик позиции к вашему l oop. enumerate()
функция может сделать это за вас:
for pos, letter in enumerate(word):
if pos % 2 == 0: # an even position
out.append(letter.upper())
enumerate()
дает вам кортеж (counter, value)
на каждом шаге, и теперь вы делаете знать положение каждой буквы и может проверить, является ли она четной.
или, вы можете просто использовать return word[::2].upper()
.