26. Списки в Python. Несколько вопросов

Продолжаем работать со списками в Python.
Прежде, чем двигаться дальше, подведем промежуточные итоги.

Напомню, что числовые списки и списки, содержащие объекты различаются по своему «поведению».
Когда вы используете перебор по значению, то не можете изменить элемент списка:

a = [rnd(10) for x in range(12)]
print(a)
for x in a:
	x += 1
print(a)

В первом и втором случае мы видим одни и те же значения, потому что x += 1 повлияет только на копию элемента, а не на значение элемента списка.

В то же время «изменение» объектов происходит.

class ball():
	def __init__(self):
		self.x = 10
		self.y = 20

a = [ball() for x in range(12)]
for b in a:
	print(b.x, end = ' ')
print()

for b in a:
	b.x += 10

for b in a:
	print(b.x, end = ' ')
print()

Причина проста и нет никакой «избирательности».
Операция «=» для простых типов создает еще одну переменную, а для всех остальных (списков, объектов, кортежей, множеств и т.д.) — новое имя. см. Справочник (http://progras.ru/ukazateli-v-python/)
Т.е. перебирать по значениям и изменять список — нельзя.
Но когда вы перебираете список объектов и меняете их координаты, то изменения элементов списка не просиходит! Да, вы изменили значение какого-то свойства объекта, но это для списка не важно и не играет никакой роли — у него какой объект был, такой и остался, потому что список «не знает» ничего о свойства объекта. Он «знает» только адрес, по которому нужно искать объект. А этот адрес не изменился.

Таким образом с числовыми списками работать немного сложнее, чем со списками, которые состоят из объектов, как это ни странно.

Теперь разберем несколько простых задач.

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

1. Нужно было найти сумму всех элементов списка. Похоже, там несколько ошибок.
from random import randrange as rnd
a = [rnd(10) for x in range(12)]
print (a)
for i in range(len(a)):
	s += i
print (s)
2. Нужно было найти найти сумму четных значений.
from random import randrange as rnd
a = [rnd(10) for x in range(12)]
print (a)
s = 0
for i in range(len(a)):
    if s % 2 == 0:
		s += i
print (s)
3. Удалить все элементы, которые равны нулю.
from random import randrange as rnd
a = [rnd(5) for x in range(15)]
print (a)
for i in range(len(a)):
    if a[i] == 0:
		a.remove(i)
print (a)
4. Удалить из списка те, что стоят после нулей.
from random import randrange as rnd
a = [rnd(5) for x in range(15)]
print (a)
for i in range(len(a)):
    if a[i-1] == 0:
		a.remove(i)
print (a)
5. Дан список «шариков». Подвинуть вправо на 10 только красные.
from random import choice
class ball():
    def __init__(self):
	    self.x = 10
	    self.y = 10
		self.color = choice(['red','green'])
		
from random import randrange as rnd
a = [ball() for x in range(15)]
print (a)
for x in a:
    if a.color == 'red':
		a.x += 10
print (a)
6. Чем отличаются методы pop и remove? Равнозначны ли они?

One thought on “26. Списки в Python. Несколько вопросов

  1. Уведомление: Аноним

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

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