Многие из предыдущих решений повторяются в нескольких точках в своих предлагаемых решениях.А некоторые делают копии данных (строки).re.match (), strip (), enumerate (), isspace () дублируются за работой сцены.
next(idx for idx, chr in enumerate(string) if not chr.isspace())
next(idx for idx, chr in enumerate(string) if not chr.whitespace)
- хороший выбор для тестирования строк на различных лидирующих пробельных символах, таких как вертикальные табуляции и т. Д., Но это также увеличивает затраты.
Однако, если в вашей строке используются только пробельные символы илиСимволы табуляции, а затем следующее, более простое, понятное и быстрое решение также использует меньше памяти.
def get_indent(astr):
"""Return index of first non-space character of a sequence else False."""
try:
iter(astr)
except:
raise
# OR for not raising exceptions at all
# if hasattr(astr,'__getitem__): return False
idx = 0
while idx < len(astr) and astr[idx] == ' ':
idx += 1
if astr[0] <> ' ':
return False
return idx
Хотя это может быть не самым быстрым или простым визуально, некоторые преимущества этого решения заключаются в том, что вы можетелегко перенести это на другие языки и версии Python.И, вероятно, легче всего отлаживать, так как мало магического поведения.Если вы поместите ядро функции в строку с вашим кодом, а не в функцию, вы удалите часть вызова функции и сделаете это решение похожим в байт-коде на другие решения.
Дополнительно это решениепозволяет больше вариаций.Например, добавление теста для вкладок
or astr[idx] == '\t':
Или вы можете проверить все данные как итеративные один раз вместо проверки, является ли каждая строка итеративной.Помните, что такие вещи, как "" [0] вызывает исключение, тогда как "" [0:] нет.
Если вы хотите подтолкнуть решение к действию, вы можете пойти по непифоническому маршруту:
i = 0
while i < len(s) and s[i] == ' ': i += 1
print i
3
..