#python #for-loop #while-loop
#python #for-loop #цикл while
Вопрос:
Я пытаюсь написать функцию с именем has_no_e, которая принимает строку в качестве аргумента и возвращает False, если строка содержит букву e, и True, если строка не содержит букву e.
Я написал функцию, используя цикл for, но мне не удается написать аналогичную функцию, которая выполняет то же самое, используя цикл while.
Вот моя функция с циклом for:
def has_no_e(word):
for letters in word:
if letters == "e":
return False
return True
И функция, которую я написал,:
def has_no_e2(word):
index = 0
while index < len(word):
if word[index] != "e":
index = 1
return False
return True
Можете ли вы сказать мне, что не так с моей функцией с циклом while? Он возвращает False каждый раз, независимо от того, есть «e» или нет.
Ответ №1:
Для этого есть два способа реализовать одно и то же исправление. Тот, который более тесно связан с вашим существующим кодом, это
def has_no_e2(word):
index = 0
while index < len(word):
if word[index] != "e":
index = 1
continue # skip the rest of the loop and go back to the top
return False
return True
Лучший вариант
def has_no_e2(word):
index = 0
while index < len(word):
if word[index] == "e":
return False
index = 1
return True
Обратите внимание, что следующие две части кода примерно эквивалентны:
for elem in iterable:
# code
_index = 0
while _index < len(iterable):
elem = iterable[_index]
# code
_index = 1
Это сложнее, потому что for
циклы часто используют итераторы вместо индексов, но вы поняли идею.
Ответ №2:
Попробуйте:
index = 0
while index < len(word):
if word[index] != "e":
index = 1
else:
return False
return True
В настоящее время ваш код возвращает false в конце первого цикла
Ответ №3:
def has_no_e1(_string):
return 'e' not in _string
def has_no_e2(_string):
return _string.find('e') == -1
def has_no_e3(_string):
while _string:
if _string[0] == 'e':
return False
_string = _string[1:]
return True
if __name__ == "__main__":
word = 'With the letter `e`'
print(
has_no_e1(word),
has_no_e2(word),
has_no_e3(word),
)
word = 'Without it'
print(
has_no_e1(word),
has_no_e2(word),
has_no_e3(word),
)
Ответ №4:
Вы можете использовать оператор in:
def has_no_e(word):
return 'e' not in word
На случай, если вам действительно нужен цикл while:
def while_has_no_e(word):
characters = list(word)
while characters:
if characters.pop() == 'e':
return False
return True
print(has_no_e('foo'))
print(has_no_e('element'))
print(while_has_no_e('foo'))
print(while_has_no_e('element'))
Out:
True
False
True
False
Ответ №5:
Некоторые изменения, и все готово, вам просто нужно записать любое условие, которое вы написали в цикле for, в while, вот и все:
def has_no_e2(word):
index = 0
while index < len(word):
if word[index] == "e":
return False
index =1
return True
Теперь позвольте мне дать вам один лайнер:
>>> string = 'hello'
>>> False if string.count('e') > 0 else True
False
#changing the contents
>>> string = 'hlo'
>>> False if string.count('e') > 0 else True
True
Ответ №6:
Вам не нужно создавать функцию, она уже существует и называется find()
has_e = word.find(«e»)
Функция либо возвращает точную позицию буквы, либо возвращает -1, если она не существует.