Відповіді:
Як зазначав Йоханнес,
for c in "string":
#do something with c
Ви можете повторити майже все, що в python, використовуючи for loop
конструкцію,
наприклад, open("file.txt")
повертає об’єкт файлу (і відкриває файл), ітерація над ним повторює рядки у цьому файлі
with open(filename) as f:
for line in f:
# do something with line
Якщо це здається магічним, добре, це все-таки є, але ідея за цим дійсно проста.
Існує простий протокол ітератора, який можна застосувати до будь-якого виду об’єктів, щоб змусити for
цикл працювати над ним.
Просто застосуйте ітератор, який визначає next()
метод, і __iter__
реалізуйте метод на класі, щоб зробити його ітерабельним. ( __iter__
звичайно, слід повернути об’єкт ітератора, тобто об'єкт, який визначає next()
)
Якщо вам потрібен доступ до індексу під час ітерації через рядок, використовуйте enumerate()
:
>>> for i, c in enumerate('test'):
... print i, c
...
0 t
1 e
2 s
3 t
1 t
, 2 e
, 3 s
, 4 t
використовуйте параметр «Пуск»:for i, c in enumerate('test', start=1)
Ще простіше:
for c in "test":
print c
for c in "test": print (c)
чому?
Для того, щоб зробити більш вичерпну відповідь, в Python можна застосувати спосіб ітерації через рядок, якщо ви дійсно хочете примусити квадратний кілочок до круглого отвору.
i = 0
while i < len(str):
print str[i]
i += 1
Але знову ж таки, навіщо це робити, коли рядки за своєю суттю ітерабельні?
for i in str:
print i
for i in range(len(...))
є зло. У python 2.x range()
створює список, тож за дуже великої довжини ви можете виділити дуже великий блок пам'яті. Як мінімум використання xrange()
в тих випадках. Крім того, повторне індексування одного і того ж рядка набагато повільніше, ніж повторення безпосередньо над рядком. Якщо вам потрібен індекс, використовуйте enumerate()
.
Ну ви також можете зробити щось цікаве, як це, і виконувати свою роботу, використовуючи для циклу
#suppose you have variable name
name = "Mr.Suryaa"
for index in range ( len ( name ) ):
print ( name[index] ) #just like c and c++
Відповідь є
Містер . S уря
Однак оскільки range () створює список значень, що є послідовністю, то ви можете безпосередньо використовувати ім'я
for e in name:
print(e)
Це також дає такий же результат, а також виглядає краще і працює з будь-якою послідовністю, як список, кортеж та словник.
Ми використовували вбудовані функції (BIF в Python Community)
1) діапазон () - діапазон () BIF використовується для створення індексів Приклад
for i in range ( 5 ) :
can produce 0 , 1 , 2 , 3 , 4
2) len () - len () BIF використовується для з'ясування довжини заданого рядка
Якщо ви хочете скористатися більш функціональним підходом до ітерації над рядком (можливо, щоб якось перетворити його), ви можете розділити рядок на символи, застосувати функцію до кожного, а потім приєднати отриманий список символів назад до рядка.
Рядок є по суті списком символів, отже, «карта» буде повторюватися над рядком - як другий аргумент - застосовуючи функцію - перший аргумент - до кожного.
Наприклад, тут я використовую простий лямбда-підхід, оскільки все, що я хочу зробити, - це тривіальна модифікація символу: тут збільшується значення кожного символу:
>>> ''.join(map(lambda x: chr(ord(x)+1), "HAL"))
'IBM'
або загальніше:
>>> ''.join(map(my_function, my_string))
де my_function приймає значення char та повертає char значення.
Тут використовується кілька відповідей range
. xrange
як правило, краще, оскільки він повертає генератор, а не повністю інстальований список. Там, де пам'ять та / або ітерабелі широко різної довжини можуть бути проблемою, xrange
є вищим.
Якщо ви коли-небудь стикаєтеся з ситуацією, коли вам потрібно get the next char of the word using __next__()
, не забудьте створити string_iterator
і повторити його, а не йогоoriginal string (it does not have the __next__() method)
У цьому прикладі, коли я знаходжу char = [
я продовжую шукати наступне слово, поки не знаходжу ]
, тому мені потрібно використовувати __next__
тут цикл для рядка не допоможе
myString = "'string' 4 '['RP0', 'LC0']' '[3, 4]' '[3, '4']'"
processedInput = ""
word_iterator = myString.__iter__()
for idx, char in enumerate(word_iterator):
if char == "'":
continue
processedInput+=char
if char == '[':
next_char=word_iterator.__next__()
while(next_char != "]"):
processedInput+=next_char
next_char=word_iterator.__next__()
else:
processedInput+=next_char