Какой шаг изменения переменной в цикле для for
Перейти к содержимому

Какой шаг изменения переменной в цикле для for

  • автор:

Каков механизм изменения значения переменных в цикле for Python

Каким образом изменяется значение списков forenames и surnames , если мы явно не меняем их значения? Это связано с names , какую роль это играет во внешнем цикле и как добавляя в него элемент, мы меняем значения списков forenames и surnames ?

def get_forenames_and_surnames(): forenames = [] surnames = [] for names, filename in ((forenames, "forenames.txt"), (surnames, "surnames.txt")): for name in open(filename, encoding='utf8'): names.append(name.rstrip()) return forenames, surnames 

Отслеживать
16.9k 4 4 золотых знака 21 21 серебряный знак 31 31 бронзовый знак
задан 29 янв 2019 в 20:28
85 1 1 золотой знак 1 1 серебряный знак 9 9 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Для начала пример:

a = [1, 2, 3] b = a a.append(4) print(a) print(b) 

Output

[1, 2, 3, 4] [1, 2, 3, 4] 

Вопрос: почему поменялись оба списка, когда меняли только список a ?

Ответ:

В Python переменные являются ссылками (идентификаторами) на хранящиеся в памяти объекты, поэтому:

  • a = [1, 2, 3] означает — создай объект типа list, заполни его значениями 1, 2, 3 и присвой ссылку на этот объект переменной a .
  • b = a — присвой переменной b ссылку, которая хранится в переменной a (которая в свою очередь указывает на объект). Теперь две переменных указывают на один и тот же объект.
  • a.append(4) — найди объект по ссылке в переменной a и добавь в него элемент 4 . Помним, что объект у нас один, на него указывают a и b . Если сделаем b.append(4) , результат будет такой же.

введите сюда описание изображения

Упрощённая схема связи переменных и объектов:

Теперь разберём ваш код:

# Вспомогательная функция для печати идентификатора объекта def print_object_id(var_name, obj): # Функция id возвращает идентификатор объекта. obj_id = id(obj) print(' - "" id'.format(obj_id, var_name)) def get_forenames_and_surnames(): print("===Назначение переменных===") forenames = [] # Печатаем, какой идентификатор присвоился переменной forenames print_object_id("forenames", forenames) surnames = [] # Печатаем, какой идентификатор присвоился переменной surnames print_object_id("surnames", surnames) print("\n===Внешний цикл for===") for names, filename in ((forenames, "forenames.txt"), (surnames, "surnames.txt")): ### На каждой итерации переменной "names" присваивается новый идентификатор: # В первой итерации это идентификатор переменной forenames # Вo второй итерации это идентификатор переменной surnames print_object_id("names", names) for name in open(filename, encoding='utf8'): # По идентификатору хранящемся в "names", Python ищет у # себя объект (в нашем случае это объект типа List) # и вызывает у этого объекта метод "append". # В итоге, новой элемент добавляется к списку. names.append(name.rstrip()) return forenames, surnames get_forenames_and_surnames() 

Output

===Назначение переменных=== 7F552E85B388 - "forenames" id 7F552E85B3C8 - "surnames" id ===Внешний цикл for=== 7F552E85B388 - "names" id ### Тот же самый, что и у forenames 7F552E85B3C8 - "names" id ### Тот же самый, что и у surnames 

Операторы цикла

Очень часто возникает необходимость выполнить одну и ту же последовательность действий несколько раз: например, для вычисления выражения a n необходимо выполнить умножение на величину a n-1 раз. Для этого используются циклы. В данном листочке речь пойдет о цикле for .

Рассмотрим задачу вычисления суммы всех натуральных чисел от 1 до n. Для этого заведем переменную s , и к ней будем прибавлять значение переменной i , где i будет принимать все значения от 1 до n. На языке C++ это можно сделать при помощи цикла for следующим образом:

В этом примере последовательность инструкций в блоке, то есть инструкция s=s+i будет выполнена многократно для всех значений переменной i от 1 до n , то есть в результате переменная s будет равна сумме всех натуральных чисел от 1 до n .

При использовании цикла for необходимо задать три параметра (в круглых скобках через точку с запятой).

Первый параметр – начальное значение переменной, задается в виде присваивания переменной значения, в нашем случае – i=1 .

Второй параметр – конечное значение переменной, задается в виде условия на значение переменной. Цикл будет исполняться, пока условие истинно, в нашем случае условие i

Третий параметр – шаг изменения переменной. Запись ++i означает, что переменная i будет увеличиваться на 1 с каждым новым исполнением цикла, запись —i – уменьшаться.

В нашем примере мы могли бы сделать цикл, в котором переменная i принимала бы все значения от n до 1 , уменьшаясь при этом: for(i=n; i>0; —i) .

Если хочется, чтобы значение переменной в цикле менялось не на 1, а на большую величину, то это можно сделать, например, так: i=i+2 .

Упражнения

  1. (A) По данному натуральному n вычислите сумму 1 2 +2 2 +. +n 2 .
  2. (B) По данному натуральном n вычислите сумму 1 3 +2 3 +. +n 3 .
  3. (C) По данному натуральном n вычислите сумму 1×2+2×3+. +(n-1)×n.
  4. (D) По данным числам a и b выведите на экран все четные числа от a до b включительно. Например, при вводе 1 и 10 программа должна вывести 2 4 6 8 10 .
  5. (E) По данному числу n вычислите значение n!.
  6. (F) По данным натуральным n и k вычислите значение Cn k =n!/(k!(n-k)!) (число сочетаний из n элементов по k).
  7. (G) По данному действительному числу a и натуральному n вычислите величину a n . Программа считывает значение a и n и выводит a n .
  8. (H) По данному натуральному n вычислите сумму 1+(1+2)+(1+2+3)+. +(1+2+. +n).
  9. (I) По данному числу n вычислите сумму 1+1/2 2 +1/3 2 +. +1/n 2 . Как вы думаете, к чему приближается эта сумма с увеличением n?
  10. (J) По данному числу n вычислите сумму 4(1-1/3+1/5-1/7+. +(-1) n /(2n+1)). Как вы думаете, к чему будет приближаться эта сумма с увеличением n?
  11. (K) По данному действительному числу a и натуральному n вычислите сумму 1+a+a 2 +. +a n не используя формулу суммы геометрической прогрессии. Время работы программы должно быть пропорционально n. Затем решите эту задачу по формуле суммы геометрической прогрессии и сдайте ее в тестирующую систему.
  12. (L) Дано 10 целых чисел. Вычислите их сумму. Например, при вводе чисел 1 2 3 4 5 6 7 8 9 10 программа должна вывести 55 .
  13. (M) Дано несколько чисел. Вычислите их сумму. Сначала вводится количество чисел N. Затем вводится N целых чисел, программа должна вывести их сумму. Например, при вводе 3 1 20 300 программа должна вывести 321 .
  14. (без тестирующей системы) Найдите все двузначные числа, которые равны удвоенному произведению своих цифр. Указание: организуйте цикл, в котором переменная i принимает значения от 10 до 99, проверьте, равна ли i удвоенному произведению своих цифр.
  15. (без тестирующей системы) Квадрат трехзначного числа оканчивается тремя цифрами, равными этому числу. Найдите все такие числа.

Цикл for

Очень часто возникает необходимость выполнить одну и ту же последовательность действий несколько раз: например, для вычисления выражения a n необходимо выполнить n-1 раз умножение на величину a. Для этого используются циклы. В данном листочке речь пойдет о цикле for , который, как правило, используется для повторения определенной последовательности действий заданное количество раз.

Рассмотрим задачу вычисления суммы всех натуральных чисел от 1 до n. Для этого заведем переменную Sum и к ней будем прибавлять значение переменной i , где i будет принимать все значения от 1 до n. На языке C++ это можно сделать при помощи цикла for следующим образом:

int n, Sum, i; cin >> n; Sum = 0; for (i = 1; i cout 

В этом примере последовательность инструкций в блоке, то есть инструкция s = s + i будет выполнена многократно для всех значений переменной i от 1 до n , то есть в результате переменная s будет равна сумме всех натуральных чисел от 1 до n .

При использовании цикла for необходимо задать три выражения-параметра (в круглых скобках через точку с запятой).

Первый параметр – начальное значение переменной, задается в виде присваивания переменной значения, в нашем случае – i = 1 . Более формально — первый параметр содержит произвольное выражение, которое вычисляется один до выполнения тела цикла, и как правило первый параметр используется для инициализации переменной цикла. Первый параметр может отсутствовать, тогда вместо него ничего не пишется, а просто ставится точка с запятой.

Третий параметр – шаг изменения переменной. Запись ++i равнозначна записи i = i + 1 и означает, что переменная i будет увеличиваться на 1 с каждым новым исполнением цикла, запись --i равнозначна записи i = i - 1 и означает, что переменная i будет уменьшатся на 1 . Более формально, третий параметр — это произвольное выражение, которые вычисляется после выполнения тела цикла, но до проверки условия его окончания. Как правило, в третьем параметре изменяется значение переменной, записанной в первых двух параметрах. Если хочется, чтобы значение переменной в цикле менялось не на 1, а на большую величину, то это можно сделать, например, так: i = i + 2 или i = i - 3 .

В нашем примере мы могли бы сделать цикл, в котором переменная i принимала бы все значения от n до 1 , уменьшаясь при этом:

for (i = n; i > 0; --i)

Какой шаг изменения переменной в цикле для for

Скачай курс
в приложении

Перейти в приложение
Открыть мобильную версию сайта

© 2013 — 2024. Stepik

Наши условия использования и конфиденциальности

Get it on Google Play

Public user contributions licensed under cc-wiki license with attribution required

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *