Лекция Основы алгоритмизации. Алгоритмы и величины. Этапы решения задачи на ЭВМ



бет8/37
Дата16.01.2022
өлшемі0,96 Mb.
#129365
түріЛекция
1   ...   4   5   6   7   8   9   10   11   ...   37
Байланысты:
Все лекции
Практическая работа Информационный буклет, Сборник Паскаль1, 9 практикалық тапсырма, 3, 5 дәріс, 2-дәріс. Жалпы мағлұматтар, Өмірбаян, 1 лекция, Тәжірибелік жұмыстар (1), test1, 3 тәжірибелік жұмыс ОБП, Вирусные-диареи1, 3 Зертханалық жұмыс, Задание
Вопросы и задания


  • Для заданного х вычислите у по формуле у = х3+ 2,5х2 - х + 1. При этом:

а) операцию возведения в степень использовать запрещено;


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

Подсказка: преобразуйте выражение к следующему виду: у = ((х + 2,5)х - 1)х + 1.

  • По заданным координатам точек А и В, вычислите длину отрезка АВ.


Подсказка: Расстояние d между точками А (хa, уa) и В (хb, уb) выражается формулой























= √(

− )2

+ (

− )2



















Пример входных данных







Пример выходных данных













xа = 2







|АВ|= 10.0

yа = 1
















xb = 10
















yb = 7



















  • Известны длины сторон треугольника а, b, с. Напишите программу, вычисляющую площадь этого треугольника.



Пример входных данных

Пример выходных данных







a = 3

S=6.0

b = 4




c = 5













  • Известны координаты вершин А, В, С треугольника. Напишите программу, вычисляющую площадь этого треугольника.




Пример входных данных

Пример выходных данных







xа = 2

S = 16.0

yа = 1







xb = 6




yb = 5




xс = 10




yс = 1













  1. Если сумма налога исчисляется в рублях и копейках, то налоговая служба округляет её до ближайшего рубля (до 50 копеек — с недостатком, свыше 50 копеек (включая 50) — с из-бытком). Используйте компьютер, чтобы ввести точную сумму налога и вывести, сколько следует уплатить.




    1. Исследуйте работу функции random, запустив многократно на выполнение программу:

Программа 8


print ('Исследование функции random') from random import randint
a = int (input ('Введите a >>')) b = int (input ('Введитеb>>'))
print ('randint в интервале (', a, ', ', b, ')=', randint (a, b)) print (randint (a, b))
Как можно получить случайное число из интервала (a, b)? Как можно получить случайное число из интервала (a, b]?


    1. Одна компания выпустила лотерейные билеты трёх разрядов: для молодежи, для взрослых и для пенсионеров. Номера билетов каждого разряда лежат в пределах:

для молодёжи — от 1 до 100; для взрослых — от 101 до 200; для пенсионеров — от 201 до 250.


С помощью компьютера выберите случайным образом лотерейный билет в каждом разряде.

а) сумму и произведение его цифр;

б) число, образованное перестановкой цифр исходного числа.


  1. Запишите на языке Python программу, реализующую алгоритм работы кассира, выдающего покупателю сдачу (s) наименьшим возможным количеством банкнот по 500 (k500), 100 (k100), 50 (k50) и 10 (k10) рублей.




Пример входных данных

Пример выходных данных







845

Следует сдать:




банкнот по 500 руб. - 1 шт.




банкнот по 100 руб. - 3 шт.




банкнот по 50 руб. - 0 шт.




банкнот по 10 руб. - 4 шт.










  1. Идёт k-я секунда суток. Разработайте программу, которая по введённой k-й секунде суток определяет, сколько целых часов h и целых минут m прошло с начала суток. Например, если k = 13 257 = 3 • 3600 + 40 • 60 + 57, то h = 3 и m = 40. Выведите на экран фразу: It is...hours ...

minutes. Вместо многоточий программа должна выводить значения h и m, отделяя их от слов ровно одним пробелом.




Пример входных данных

Пример выходных данных







13257

It is 3 hours 40 minutes.










  1. Разработайте программу, которая запрашивает три строковые величины — взаимосвязанные прилагательное, существительное и глагол, а затем выводит все варианты фраз с использо-ванием введённых слов.




Пример входных данных

Пример выходных данных







ЗЕЛЁНЫЕ

ЗЕЛЁНЫЕ ЛИСТЬЯ РАСПУСКАЮТСЯ

ЛИСТЬЯ

ЗЕЛЁНЫЕ РАСПУСКАЮТСЯ ЛИСТЬЯ

РАСПУСКАЮТСЯ

ЛИСТЬЯ ЗЕЛЁНЫЕ РАСПУСКАЮТСЯ







ЛИСТЬЯ РАСПУСКАЮТСЯЗЕЛЁНЫЕ РАС-




ПУСКАЮТСЯ ЗЕЛЁНЫЕ ЛИСТЬЯ РАСПУС-




КАЮТСЯ ЛИСТЬЯ ЗЕЛЁНЫЕ










  1. Даны значения целочисленных переменных: а = 10, b = 20. Чему будет равно значение логи-ческой переменной rez после выполнения операции присваивания?

а) rez = (а == 10) or (b > 10)


б) rez = (а > 5) and (b > 5) and (a <2 0) and (b < 30) в) rez = (not (a < 15)) or (b > 20)


  1. Составьте программу, вводящую True, если высказывание является истинным, и False в про-тивном случае:

а) сумма цифр трёхзначного числа х является чётным числом; б) треугольник со сторонами а, b, с является разносторонним






Лекция №6. Разветвляющийся алгоритм. Условный оператор. Множественное ветвление. Условия равенства/неравенства. Ввод и вывод. Структурные операторы (if else, elif )

Условный оператор

При записи на языке Python разветвляющихся алгоритмов используют условный оператор.



  • условном операторе после условия if, и после else можно использовать много операторов: для этого отступ у всех операторов должен быть одинаковый, таким образом, они объединяются в один составной оператор. Его общий вид:


if <условие>:
<оператор_1>

<оператор_2>
…………………..

<оператор_n>

else:
<оператор_1>
<оператор_2>

…………………..



<оператор_k>
Если оператор только один, то иногда бывает удобно записать его в той же строке:
if <условие>: <оператор_1>

else:<оператор_1>
Для записи неполных ветвлений используется неполная форма условного оператора:
if <условие>:
<оператор>
В качестве условий используются логические выражения:

простые — записанные с помощью операций отношения: <, >, >=, <=, != (не равно), == (равно);

сложные — записанные с помощью логических операций: and, or, not.
В языке Python разрешены двойные неравенства, например А < В < С
Пример 1. Запишем на языке Python рассмотренный в п. 2.4.2 (пример 8) алгоритм опре-деления принадлежности точки х отрезку [а, b].

Программа 9


print ('Определение принадлежности точки отрезку')

a= int (input ('Введите а: '))

b= int (input ('Введите b: '))

if х >= а and x <= b:

print ('Точка принадлежит отрезку')
else:

print ('Точка не принадлежит отрезку')


Пример 2. Воспользуемся неполным условным оператором для записи на языке Python рассмотренного в п. 2.4.2 (пример 9) алгоритма присваивания переменной у значения наиболь-шей из трёх величин а, b и с.

Программа 10


print ('Нахождение наибольшей из трёх величин')

a = int (input ('Введите а: '))

b = int (input ('Введите b: '))

c = int (input ('Введите c: '))

y = a

if b > y:


y = b

if c > y:

y =c

print ('y=', y)


Более короткая запись:
a, b, c = map (int, input ('Введите а, b, c>>').split())
y = a

if b > y: y = b

if c > y: y = c

print ('y=', y)




    • языке Python имеются встроенные функции max и min для нахождения максимального




  • минимального из двух или нескольких значений. И тогда программа будет иметь вид:

a, b, c = map (int, input ('Введите а, b, c>>').split())

y = max (a, b, c)
print ('y=', y)
Измените эту программу так, чтобы её выполнение приводило к нахождению минималь-ного значения из четырёх величин а, b, с и d.
Каскадное ветвление


  • Python существует разновидность условного оператора, которая позволяет выбрать один из нескольких (а не только из двух) вариантов. Если после else сразу следует еще один оператор if, можно использовать каскадное ветвление со служебным словом elif (сокращение от else-if): если очередное условие ложно, выполняется проверка следующего условия и т. д.


Пример. Алгоритм решения квадратного уравнения вам хорошо известен. Запишем соот-ветствующую программу на языке Python.

Программа 11


from math import *

print ('Решение квадратного уравнения')

print ('Введите коэффициенты а, b, с>>')

a = float (input ('a='))


b = float (input ('b='))

c = float (input ('c='))

d = b * b – 4 * a * c

if d < 0:

print ('Корней нет')
elif d == 0:

x = – b/2/ a

print ('Корень уравнения x=',"{:6.4f}". format(x))

else:
x1 = (-b + sqrt (d)) / 2 / a

x2 = (-b – sqrt (d)) / 2 / a

print ('Корни уравнения:')

print ('x1=', "{:6.4f}". format(x1))
print ('x2=', "{:6.4f}". format(x2))
Пример. Запишем на языке Python рассмотренного в п. 2.4.2 (пример 10) алгоритма реше-ния линейного уравнения.

Программа 12
print ('Решение линейного уравнения')

a = float ( input ('Введите коэффициент а>>'))

b = float ( input ('Введите коэффициент b>>'))

if a != 0:


x =-b/ a

print ('Корень уравнения x=', x)

elif b != 0:

print ('Корней нет')

else:
print (' x–любое число')
Как правило, для решения одной и той же задачи можно предложить несколько алгорит-мов. Убедимся в этом, записав программу решения линейного уравнения, используя неполное ветвление:

Программа 13


print ('Решение линейного уравнения')

a = float (input ('Введите коэффициент а>>'))

b = float (input ('Введите коэффициент b>>'))
if a != 0:

x = - b / a

print ('Корень уравнения x =', x)

if a == 0 and b != 0:


print ('Корней нет')

if a == 0 and b == 0:

print (' x – любое число')
Возможно, второй вариант программы покажется вам более наглядным. Но и у первого варианта есть свои преимущества: в нём делается меньше проверок.
САМОЕ ГЛАВНОЕ
При записи на языке Python разветвляющихся алгоритмов используют условный оператор:
if <условие>:
<операторы>

else:
<операторы>
Если при некотором условии требуется выполнить определённую последовательных опе-раторов, то их объединяют в один составной оператор, имеющий одинаковый отступ. Оптималь-ным отступом считается 4 пробела.
Для записи неполных ветвлений используется неполный условный оператор:

if <условие>:
<операторы>
Для выбора из нескольких вариантов используют следующую конструкцию условного оператора:

if <условие>:
<операторы>

elif<условие>:
<операторы>

else:
<операторы>
Вопросы и задания


  1. Как на языке Python записывается полное и неполное ветвление?

  1. Является ли условным оператором следующая последовательность символов?

а) if х < у: х=0 else input (у)
б) if х >= у: х =0; у := 0 else: print (z)
в) if x < y < z: a = a + l


  1. Что такое составной оператор? Для чего он используется в условном операторе?




  1. Используя составной оператор, упростите следующий фрагмент программы:

if a > b: с = 1

if a > b: d = 2

if a <= b: c = 3
if a <= b: d = 4


  1. Дано трёхзначное число. Напишите программу, которая определяет:

а) есть ли среди цифр заданного целого трёхзначного числа одинаковые;




Пример входных данных

Пример выходных данных







123

Нет







121

Да







222

Да






б) является ли число «перевёртышем», т. е. числом, десятичная запись которого читается одинаково слева направо и справа налево.




Пример входных данных

Пример выходных данных







122

Нет







121

Перевёртыш







222

Перевёртыш










  1. Даны две точки в плоской прямоугольной системе координат. Напишите программу, опре-деляющую, которая из точек находится ближе к началу координат.




Пример входных данных

Пример выходных данных







Координаты 1-й точки>>1 2

1-я точка ближе

Координаты 2-й точки>>3 4













  1. Даны три натуральных числа. Напишите программу, определяющую, существует ли тре-угольник с такими длинами сторон. Если такой треугольник существует, то определите его тип (равносторонний, равнобедренный, разносторонний).




Пример входных данных

Пример выходных данных







а b с >>1 2 1

Не существует







a b с >>2 2 2

Равносторонний







a b с >>20 20 30

Равнобедренный







a b с >>3 4 5

Разносторонний









  1. Имеются данные о количестве полных лет четырёх призёров спартакиады. Напишите про-грамму, выбирающую и выводящую возраст самого младшего призёра.




  1. Напишите программу, определяющую, лежит ли точка А(ха, уа) на прямой у = kx + m, над ней или под ней.




Пример входных данных

Пример выходных данных



к, m>>-1 5

ха, уа >>1 2

Точка лежит под прямой.













к, m>>-1 5

ха, уа >>1

10

Точка лежит над прямой.













к, m>>-1 5

ха, уа >>1

4

Точка лежит на прямой.
















  1. Напишите программу, которая производит обмен значений переменных х и у, если х больше у.







Пример входных данных

Пример выходных данных













x>>5

х= 5




y>>6

у= 6













x>>6

х= 5




y>>5

у= 6










11. Дан условный оператор:




if а < 5:




с = 1




elif а > 5:




с = 2




else: с = 3



Какое значение имеет переменная а, если в результате выполнения условного оператора переменной с присваивается значение 3?




  1. Напишите программу, вычисляющую значение функции:

−1 при < 0,

={0при =0,




1при >1

Пример входных данных




Пример выходных данных










-5




у= -1










0




у= 0










5




у= 1












  1. Составьте программу для решения задачи № 21 к § 2.4 (определение дня недели).




  1. Поле шахматной доски определяется парой натуральных чисел, каждое из которых не пре-восходит 8. Напишите программу, которая по введённым координатам двух полей (k, l) и (m, n) определяет, имеют ли эти поля один цвет.




Пример входных данных

Пример выходных данных







Координаты 1-го поля>>2 2

Поля одного цвета

Координаты 2-го поля>>3 3










Координаты 1-го поля>>2 3

Поля разного цвета

Координаты 2-го поля>>3 3










Координаты 1-го поля>>2 7

Поля одного цвета

Координаты 2-го поля>>5 4












  1. Напишите программу, в которой пользователю предлагается дополнить до 100 некоторое целое число а (а — случайное число, меньшее 100). Ответ пользователя проверяется и ком-ментируется.



Лекция №7№.Циклический алгоритм. Оператор цикла for. Оператор цикла while.

Программирование циклов с заданным условием продолжения работы
Цикл с заданным условием продолжения работы (цикл-ПОКА) программируется в языке

Python с помощью оператора while. Общий вид оператора:



While <условие>:
<оператор>
Здесь:

<условие> — логическое выражение; пока оно истинно, выполняется тело цикла;

<оператор> — простой или составной оператор, с помощью которого записано тело
цикла.
Запишем на языке Python рассмотренный в п. 2.4.3 (пример 14) алгоритм получения част-ного q и остатка r от деления натурального числа х на натуральное число у без использования операции деления.

Программа 14


print ('Частное и остаток')

x = int (input (' Введите делимое х>>'))

y = int (input (' Введите делитель y>>'))

r = х
q = 0

while r >= y:

r = r – y

q += 1
print ('Частное q=', q)

print ('Остаток r=', r)


Каким будет результат выполнения программы при х = -10 и у = 3? Как вы можете объяс-нить этот результат?
Программирование циклов с заданным условием окончания работы


  • языке Python нет цикла с заданным условием окончания работы, но его можно органи-зовать с помощью цикла while:


while True: <операторы>

if <условие>: break
Такой цикл будет выполняться бесконечно, потому что условие True всегда истинно. Выйти из такого цикла можно только с помощью специального оператора break (в переводе с англ. – «прервать», досрочный выход из цикла).
Запишем на языке Python рассмотренный в п. 2.4.3 (пример 17) алгоритм решения задачи о графике тренировок спортсмена

Программа 15


print ('График тренировок')

i = 1; x = 10


while True:
i += 1

x = x + 0.1 * x

if x >= 25: break

print ('Начиная с ', i, '-го дня спортсмен будет пробегать 25 км').5.2 Программирование циклов с заданным числом повторений


Цикл с заданным числом повторений (цикл ДЛЯ) программируется в языке Python с по-мощью оператора for. Его общий вид:
for <параметр> in range(k, n, m):
<оператор>
<параметр> — переменная целого типа;

<оператор> — простой или составной оператор — тело цикла.
Здесь слово for означает «для», переменная (её называют переменной цикла) изменяется


  • диапазоне (in range) от k (начальное_значение) до n-1 (конечное_значение - n не включается




  • диапазон) с шагом m. Начальное значение можно не указывать – тогда оно равно 0, шаг тоже можно не указывать, по умолчанию равен 1.

При выполнении этого оператора после каждого выполнения тела цикла происходит уве-личение на шаг параметра цикла. Если k = n или k > n – цикл не выполнится ни разу.


Запишем на языке Python рассмотренный в п. 2.4.3 (пример 19) алгоритм вычисления сте-пени с натуральным показателем n для любого вещественного числа а.

Программа 16


print ('Возведение в степень')


  1. = float (input (' Введите основание а>>')) n = int (input (' Введите показатель n>>')) y = 1

for i in range(n): # цикл будет работать от 0 до n-1 ровно n раз y = y * a

print('y=', y)
3.5.3 Различные варианты программирования циклического алгоритма
Особенностью программирования является то, что для решения одной и той же задачи могут быть созданы разные программы. Вы могли убедиться в этом, программируя ветвления. Рассмотрим пример, показывающий, что и циклический алгоритм может быть запрограммирован разными способами.
Пример: Напишем программу, в которой осуществляется ввод целых чисел (ввод осу-ществляется до тех пор, пока не будет введён ноль) и подсчёт количества введённых положи-тельных и отрицательных чисел.
Так как здесь в явном виде задано условие окончания работы, то воспользуемся операто-ром while True:

Программа 17


k1 = k2 = 0

while True:

n = int (input (' Введите целое число>>'))

if n > 0:

k1 += 1
if n < 0:

k2 += 1


if n == 0: break

print ('Введено:')


print ('положительных чисел -', k1)

print ('отрицательных чисел -', k2)


Имеющееся условие окончания работы можно достаточно просто преобразовать в условие продолжения работы — работа продолжается, пока n не равно 0, мы можем воспользоваться опе-ратором while:

Программа 18
k1 = k2 = 0

n = int (input (' Введите целое число>>'))

while n != 0:

if n > 0:


k1 += 1

if n < 0:

k2 += 1

n = int (input (' Введите целое число>>'))

print ('Введено:')
print ('положительных - ', k1);

print ('отрицательных - ', k2)




  • рассмотренном примере число повторений тела цикла заранее не известно, и поэтому оператор for здесь применить нельзя. Если число повторений тела цикла известно, то лучше воспользоваться оператором for. Вместе с тем любая задача, в которой число повторений тела цикла определено заранее, может быть запрограммирована с помощью любого из двух рассмот-ренных выше циклов.



  • языке Python имеются два вида операторов цикла: while (цикл-ПОКА), for (цикл с параметром). Если число повторений тела цикла известно, то лучше воспользоваться оператором for; в остальных случаях используется оператор while.


Вопросы и задания


  1. Дана последовательность операторов: a = 1; b = 2

while a + b < 8: a += 1


b += 2

s = a + b


Сколько раз будет повторен цикл и какими будут значения переменных a, b, s после ис-полнения этой последовательности операторов?


  1. Требовалось написать программу вычисления факториала числа n (факториал числа n есть произведение всех целых чисел от 1 до n). Программист торопился и написал программу неправильно. Ниже приведён фрагмент его программы, в котором содержатся четыре ошибки:

k = 1 f = 0 while k < n:


f = f * k k += 1
Найдите ошибки. Допишите необходимые операторы и выполните программу на компью-

тере.



Пример входных данных

Пример выходных данных







Введите n>>5

5! = 120







Введите n>>6

6! = 720






3. Проанализируйте следующий цикл:

while a < b:

с = a == b

В чём его особенность?


  1. Запишите на языке Python программы решения № 26-30 из § 2.4. Используйте оператор while.




  1. Дана последовательность операторов: a = 1

b = 1


while True:


  • += 1 b *= 2

if b > 8: break

s = a + b
Сколько раз будет повторён цикл и какими будут значения переменных a, b, s после ис-полнения этой последовательности операторов?


  1. Напишите программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор, пока не будет введён ноль) и подсчёт суммы и среднего арифметического введённых положительных чисел.




  1. Напишите программу, в которой осуществляется ввод целых чисел (ввод осуществляется до тех пор, пока не будет введён ноль) и определение максимального (наибольшего) из введён-ных чисел.




  1. Напишите программу вычисления наибольшего общего делителя двух целых чисел




  1. Сколько раз будет выполнен цикл?

а) for i in range (15): s += l

б) for i in range (10, 15): s += l

в) for i in range (-1, 1): s += l

г) for i in range (1, 1): s += l

д) k = 5

for i in range (k - l, k + 1): s += l




  1. Напишите программу, которая 10 раз выводит на экран ваши имя и фамилию.




  1. Напишите программу, выводящую на экран изображение шахматной доски, где чёрные клетки изображаются звёздочками, а белые — пробелами. Рекомендуемый вид экрана после выполнения программы:




      • * * *

    • * * *

      • * * *

    • * * *




  1. Напишите программу, которая вычисляет сумму:

а) первых n натуральных чисел;

б) квадратов первых n натуральных чисел;

в) всех чётных чисел в диапазоне от 1 до n;

г) всех двузначных чисел.




  1. Напишите программу, которая генерирует 10 случайных чисел в диапазоне от 1 до 20, выво-дит эти числа на экран и вычисляет их среднее арифметическое.




  1. Запишите на языке Python программы решения задач № 32, 33 из § 2.4. Используйте оператор for.




  1. Напишите программу, которая выводит на экран таблицу степеней двойки (от нулевой до десятой). Рекомендуемый вид экрана после выполнения программы:

Таблица степеней двойки:



0

1

1

2

2

4




3

8

4

16

5

32

6

64

      1. 128

      2. 256

      3. 512

      4. 1024




  1. Напишите программу, которая выводит на экран таблицу умножения на n (n — целое число

    • диапазоне от 2 до 10, вводимое с клавиатуры).




Пример входных данных




Пример выходных данных

Введите n>> 5

5*2=10




5

*3=15




5

*4=20




5

*5=25




5

*6=30




5

*7=35




5

*8=40




5

*9=45




5

*10=50




  1. Какой из двух рассмотренных операторов цикла является, по вашему мнению, основным, т.е. таким, что им можно заменить другой оператор? Обоснуйте свою точку зрения.


Лекция №8. Работа с кортежами и списками. Объявление кортежей. Классические способы обработки кортежей.

Кортежи


Кортежи (tuple) в Python – это те же списки за одним исключением. Кортежи неизменяемые структуры данных. Так же как списки они могут состоять из элементов разных типов, перечисленных через запятую. Кортежи заключаются в круглые, а не квадратные скобки.

>>> a = (10, 2.13, "square", 89, 'C')

>>> a

(10, 2.13, 'square', 89, 'C')



Из кортежа можно извлекать элементы и брать срезы:

>>> a[3]


89

>>> a[1:3]

(2.13, 'square')

Однако изменять его элементы нельзя:

>>> a[0] = 11

Traceback (most recent call last):

File "", line 1, in

TypeError: 'tuple' object does not support item assignment

Также у типа tuple нет методов для добавления и удаления элементов.

Возникает резонный вопрос. Зачем в язык программирования был введен этот тип данных, по-сути представляющий собой неизменяемый список? Дело в том, что иногда надо защитить список от изменений. Преобразовать же кортеж в список, если это потребуется, как и выполнить обратную операцию легко с помощью встроенных в Python функций list() и tuple():

>>> a = (10, 2.13, "square", 89, 'C')

>>> b = [1, 2, 3]

>>> c = list(a)

>>> d = tuple(b)

>>> c

[10, 2.13, 'square', 89, 'C']



>>> d

(1, 2, 3)

Рассмотрим случай, когда уместно использовать кортежи. В Python изменяемые объекты передаются в функцию по ссылке. Это значит, что не создается копия объекта, а переменной-параметру присваивается ссылка на уже существующий объект. В итоге, если в теле функции объект изменяется, то эти изменения касаются глобального объекта.

def addNum(seq, num):

for i in range(len(seq)):

seq[i] += num



return seq

 

origin = [3, 6, 2, 6]



changed = addNum(origin, 3)

 

print(origin)



print(changed)

Данная программа неправильная. Хотя никаких выбросов исключений не произойдет, она содержит логическую ошибку. На выводе получаем:



[6, 9, 5, 9]

[6, 9, 5, 9]

То есть исходный список был также изменен. Параметр seq содержал ссылку не на свой локальный список, а на список-оригинал. Таким образом, в операторе return здесь нет смыла. Если функция замысливалась как изменяющая глобальный список, то программа должна выглядеть так:



def addNum(seq, num):

for i in range(len(seq)):

seq[i] += num

 

origin = [3, 6, 2, 6]



addNum(origin, 3)

print(origin)

Что делать, если все же требуется не изменять исходный список, а сформировать по нему новый. Задачу можно решить несколькими способами. Во первых, в функции можно создать локальный список, после чего возвращать его:



def addNum(seq, num):

new_seq = []



for i in seq:

new_seq.append(i + num)



return new_seq

 

origin = [3, 6, 2, 6]



changed = addNum(origin, 3)

 

print(origin)



print(changed)

Результат:



[3, 6, 2, 6]

[6, 9, 5, 9]

Исходный список в функции не меняется. Его элементы лишь перебираются.

Второй способ защитить список-оригинал – использовать кортеж. Этот способ более надежный, так как в больших программах трудно отследить, что ни одна функция не содержит команд изменения глобальных данных.

Хотя преобразовывать к кортежу можно как при передаче в функцию, так и в самой функции, лучше сразу делать глобальный список кортежем. Поскольку неизменяемые объекты передаются по значению, а не по ссылке, то в функцию будет поступать копия структуры, а не оригинал. Даже если туда передается оригинал, изменить его невозможно. Можно лишь, как вариант, скопировать его и/или изменить тип, создав тем самым локальную структуру, и делать с ней все, что заблагорассудится.



def addNum(seq, num):

seq = list(seq)



for i in range(len(seq)):

seq[i] += num



return seq

 

origin = (3, 6, 2, 6)



changed = addNum(origin, 3)

 

print(origin)



print(changed)

Списки в кортежах

Кортежи могут содержать списки, также как списки быть вложенными в другие списки.

>>> nested = (1, "do", ["param", 10, 20])

Как вы думаете, можем ли мы изменить список ["param", 10, 20] вложенный в кортеж nested? Список изменяем, кортеж – нет. Если вам кажется, что нельзя, то вам кажется неправильно. На самом деле можно:

>>> nested[2][1] = 15

>>> nested

(1, 'do', ['param', 15, 20])

Примечание. Выражения типа nested[2][1] используются для обращения к вложенным объектам. Первый индекс указывает на позицию вложенного объекта, второй – индекс элемента внутри вложенного объекта. Так в данном случае сам список внутри кортежа имеет индекс 2, а элемент списка 10 – индекс 1 в списке.

Странная ситуация. Кортеж неизменяем, но мы все-таки можем изменить его. На самом деле кортеж остается неизменяемым. Просто в нем содержится не сам список, а ссылка на него. Ее изменить нельзя. Но менять сам список можно.

Чтобы было проще понять, перепишем кортеж так:

>>> l = ["param", 10, 20]

>>> t = (1, "do", l)

>>> t


(1, 'do', ['param', 10, 20])

Кортеж содержит переменную-ссылку. Поменять ее на другую ссылку нельзя. Но кортеж не содержит самого списка. Поэтому его можно менять как угодно:

>>> l.pop(0)

'param'


>>> t

(1, 'do', [10, 20])

Однако помните, такой номер не прокатывает с неизменяемыми типами:

>>> a = "Kat"

>>> t = (a, l)

>>> t


('Kat', [10, 20])

>>> a = "Bat"

>>> t

('Kat', [10, 20])



Они передаются в кортеж как и в функцию – по значению. Т. е. их значение копируется в момент передачи.



Достарыңызбен бөлісу:
1   ...   4   5   6   7   8   9   10   11   ...   37




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет