Как найти позицию первого нуля в строке?

Дана некоторая строка. Найдите позицию первого нуля в строке

Подскажите, почему программа некорректно работает

Вот код:

s = input("Введите строку: ")
for i in s:
    if s.index("0"):
        i = s.index("0")
        print(i)
    else:
        print("Нулей нет")

Если вводить 0, выдаёт такое:

Введите строку: py0thon
2
2
2
2
2
2
2

А если не писать 0, то такое:

Введите строку: python
Traceback (most recent call last):
  File "C:\Users\Яриор\PycharmProjects\Первый ноль в строке\main.py", line 3, in <module>
    if s.index("0"):
ValueError: substring not found

Ответы (2 шт):

Автор решения: wchistow

Ошибка возникает, потому, что s.index возбуждает исключение, если символ не найден, так что с его помощью не получится понять, есть ли в строке такой символ (если не использовать try-except, конечно) - для этого существует конструкция символ in строка. Ну и, как писали в комментариях, цикл здесь вообще не нужен. Правильный код:

s = input("Введите строку: ")
if '0' in s:
    print(s.index('0'))
else:
    print("Нулей нет")

Примеры работы:

  1. Введите строку: pyth0n
    4
    
  2. Введите строку: python
    Нулей нет
    
→ Ссылка
Автор решения: Exord

Ещё немного вариантов как можно решить данную задачу.

Использование метода find()

Метод find() возвращает индекс первого вхождения подстроки (в данном случае '0') в строку или -1, если подстрока не найдена. Это простой и быстрый способ.

def find_zero(s):
    pos = s.find('0')
    if pos == -1:
        return "Нулей нет"
    else:
        return pos

# Пример использования
print(find_zero("1234056789"))
print(find_zero("123456789"))

Использование цикла и enumerate()

Вы можете вручную перебрать строку с помощью enumerate(), что позволит вам получить индекс каждого символа, и проверить, является ли символ нулём.

def find_zero(s):
    for index, char in enumerate(s):
        if char == '0':
            return index
    return "Нулей нет"

# Пример использования
print(find_zero("abc0def"))
print(find_zero("abcdef"))

Через регулярные выражения

Можно использовать метод search и start из модуля re.

import re

def find_zero(s):
    match = re.search('0', s)
    return match.start() if match else "Нулей нет"

# Пример использования
print(find_zero("example0123"))
print(find_zero("example123"))

https://docs.python.org/3/library/re.html#re.search

Дополнение про производительность:

Метод find() и регулярные выражения обычно выполняются быстро, особенно на больших строках, поскольку они оптимизированы на низком уровне. Цикл с enumerate() может быть чуть медленнее из-за Python-овской надстройки, но это редко является проблемой для типичных задач.

→ Ссылка