Методы range и len
Сразу сообщу, я только начал изучать Python. Пока изучил темы : Переменные, Условные операторы, Функции, Циклы (for, while, break,range),списки,кортежи.Но вернулся снова к спискам,не всё понял, так как темы взаимосвязаны и по сложнее.Понимаю, что пока мои познания по этим темам поверхностны.
Не могу понять.
x = [9, 8, 7, 6, 5, 4, 3]
for i in range (len(x)):
x[i] += 3
print(x)
Получится: [12, 11, 10, 9, 8, 7, 6]
Process finished with exit code 0
Я понимаю что записью for i in range (len(x)): - с помощью этого цикла мы итерируем весь список х. Но всё равно, не совсем понятно . Что при этом происходит, по буквам, операциям , что происходит в этой записи - range (len(x)): ? В переменную i что в итоге передается , сами индексы или значения под этими индексами . После запуска кода , понимаешь что переменной i присваиваются значения х . Но как то мало примеров с такими сочетаниями и не совсем понятно. В предыдущих уроках не нашел примеров сочетания range с Len . По сути эта запись range (len(x)), указывает (range) диапазон по всей длине (len) переменной х. Я понял так, не знаю правильно или нет ...
Но если написать так :
x = [9, 8, 7, 6, 5, 4, 3]
for i in range (len(x)):
i += 3
print(i)
Получится: 9
Process finished with exit code 0
Почему то не прибавилось 3 ко всем значениям в i ...... Короче, я запутался. :)
И соответственно не понятно объяснение следующего кода (пример как воспользоваться значениями из кортежа, с переносом этих значений в переменную ( y),для того чтобы потом изменить эти данные, делать какие нибудь операции с ними. Точнее сама запись y.append(x[ i ] + 3) , что именно в этой записи происходит, почему i в квадратных скобках [ ]...... ? Я понимаю , что мы в переменную (y) добавляем значения из кортежа .... Не понятно только добавляем из (х), или из (i) ......? То есть не понятно сочетание x[i] .
x = (9, 8, 7, 6, 5, 4, 3)
y = [ ]
for i in range (len(x)):
y.append (x [ i ] + 3)
print (x)
print (y)
Может я не понял из-за того что плохо усвоил про функцию len ....... Но вроде из предыдущих тем "Циклы" , с примерами вопросов не возникало. Примеры:
x = ""
while len (x) < 5:
y = input ("Ввод данных: ")
x += y
else:
print(x)
Получится :
Ввод данных: h Ввод данных: e Ввод данных: l Ввод данных: l Ввод данных: o
hello
Единственное, что в этом примере простое и понятное сочетание len (x) - ограничение длины в 5 символов . А вот с таким сочетанием как range (len(x)) со ссылкой на какую-нибудь переменную, примеров видимо не встречал пока, может это меня и столку сбило .......
Ткните носом, что я не правильно понял .... Фу, хотел вкратце спросить , но получилось как получилось. :)
Ответы (3 шт):
x[i] - i-ый элемент в x (нумерация начинается с 0)
Функция range генерирует последовательность чисел. У неё есть три параметра: начало - begin, конец - end и шаг - step. Если условно вызвать range(1, 7, 2), то мы получим последовательность [1, 3, 5] - последовательность, начинающийся с 1, каждый следующий на два больше, все значения < 7. Иногда некоторые значения можно пропускать. Например, range(10) = range(0, 10, 1) = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], или range(2, 7) = [2, 3, 4, 5, 6] = range(2, 7, 1).
Каждый раз, когда мы пишем
for i in range(len(a))
в переменную i передаются последовательно числа от 0 до len(a), не включая последний. i используется как индекс списка.
В первом фрагменте кода вы просто пробегаетесь с помощью i от 0 до len(x) и прибавляете к каждому элементу 3.
Во втором фрагменте происходит следующее. На каждой итерации цикла i присваивается новое значение из последовательности и к нему прибавляется 3, т.е. сначала i = 0, потом вы увеличиваете i на 3, она становится 3, но на следующей итерации 3 затирается единицой - следующим числом в последовательности. На последней итерации i присваивается 6, к i прибавляете 3, получается 9.
все очень просто. range генерирует диапазон чисел. len возвращает длину последовательности. далее узнаем новое слово "протокол итератора". цикл for..in в пайтон единственный (в JS их 3 вида, кажется) и всегда делает одно и то же, он итерирует итератор поэлементно.
Например, возьмем последовательность букв (чтобы отличать элементы от индексов)
arr = ["a", "b", "c", "d", "e", "f"]
# теперь мы хотим добавить к каждому элементу еще букву. Так как int и str
# неизменяемые типы данных то сделать вот так не получится
first_element = arr[0]
first_element = "ab"
print(a[0]) # 'a'
ах да, квадратные скобки на последовательность это обращение к по индексу. в данном случае я прошу нулевой индекс у последовательности arr.
Однако, так как мы используем тип дпнный list, наша последовательность является изменяемой последовательностью. Не все последовательности изменяемы tuple и не все последовательности поддерживают индексацию set.
arr[0] = "ab"
print(arr[0]) # 'ab'
Идем далее. Так как мы не можем менять строки, то для того чтобы изменить каждый элемент списка, нужно узнать его длину и сгенерировать другой список, который будет содержать номера индексов.
indexes_arr = list(range(len(arr)))
теперь у нас 2 списка. И мы можем сделать так.
arr[indexes_arr[0]] = "ac"
print(arr[0]) # 'ac'
Что я сделал? Я взял нулевой элемент списка indexes_arr и изменил элемент под этим номеров в списке arr. Теперь мы можем итерироваться по indexes_arr.
for arr_i in indexes_arr:
arr[arr_i] = arr[arr_i] + "c"
print(arr) # ['ac', 'bc', ...]
И закрепим
for i in arr:
print(i)
Тут главное понять, чтобы вы не делали с i в данном случае это никак не отразится на arr, и НЕ потому что это свойство for..in, а потому что тип str immutable. А вот если бы элементы списка arr были бы изменяемы, то отразилось.
arr = [[0], [1], [2]]
for i in arr:
i[0] += 1
print(arr) # [[1], [2], [3]]
И еще кое что я скажу явно.
x = [9, 8, 7, 6, 5, 4, 3]
range(len(x)) # тут вы создаете генератор, который выдаст вам числа
# в диапазоне от нуля до len(x) невключительно.
Спасибо. Повторюсь,я новичок.Только начал изучать. В теме отредактировал,добавил в начале описание. Прочитал все ответы, голова пока переваривает всю информацию :). Есть вопросы к каждому кто здесь ответил. Сейчас пока всё осмыслю, попробую правильно формулировать дальше вопросы .... . Но зато пока понял, что я не до конца понимал понятия индексы и элементы которые находятся под этими индексами. То есть процитирую "цикл for i in range(len(x)): он перебирает только индексы, а к самим элементам надо обращаться через x[i]. Хоть стало более менее понятней для чего именно используются к примеру : for i in range(len(x)): и x[i] . Так же стало не много понятнее, после прочения разбора на примере: arr = ["a", "b", "c", "d", "e", "f"] ..... Но все равно в каждом ответе, в комментарии кое что спрошу....