Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2018 11:24:36

Nayomnik
Зарегистрирован: 2018-02-26
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите решить задачу

Большое спасибо, особенно за подсказку с функцией

passant
for i, name in enumerate(fokuses):
fokuses = “Great ”+name
заодно поподробнее ознакомлюсь с принципом ее работы

Офлайн

#2 Окт. 29, 2018 19:53:05

Boomix
Зарегистрирован: 2018-10-29
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите решить задачу

Я тоже прохожу этот учебник и вот мое решение на основе пройденного в учебнике

 def show_magician(names, great):
    """List of magicians"""
    while names:
        current_name = names.pop()
        great.append(current_name)
def make_great(great):
    """Great """
    for greatness in great:
        print('Great ' + greatness)
names = ['Hoodini', 'Harry Potter', "Newt Salamander"]
great = []
show_magician(names, great)
make_great(great)

Офлайн

#3 Окт. 29, 2018 20:11:00

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Помогите решить задачу

Boomix вы отошли от условия: ‘которая изменяет список фокусников, добавляя к имени каждого фокусника’ в вашем коде список не изменяется а только выводит новую строку

 def show_magician(names):
    '''выводит имя каждого фокусника в списке'''
    for name in names:
        print(name)
    
def make_great(names):
    '''изменяет список фокусников'''
    for index,name in enumerate(names):
        names[index] = 'Great ' + name
        
        
names = ['Hoodini', 'Harry Potter', "Newt Salamander"]
show_magician(names)
make_great(names)
print(names)

Офлайн

#4 Март 21, 2019 14:22:57

shelter
Зарегистрирован: 2019-03-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите решить задачу

И я застрял на этом упражнении. Я пытался решить так:

 
def show_magicians(magicians):
for name in magicians:
print(name.title())

def make_great(magicians):
great_magicians = []
for name in magicians:
g_name = magicians.pop() + " the Great"
great_magicians.append(g_name)

for name in great_magicians:
magicians.append(name)

magicians11111 = ['chip', 'dayl', 'ponka']

show_magicians(magicians11111)

make_great(magicians11111)

show_magicians(magicians11111)
Результат:
Сhip
Dayl
Ponka

Сhip
Ponka The Great
Dayl The Great
Если заменить цикл for на while, то задача решается:
def show_magicians(magicians):
for name in magicians:
print(name.title())

def make_great(magicians):
great_magicians = []
while magicians:
g_name = magicians.pop() + " the Great"
great_magicians.append(g_name)

for name in great_magicians:
magicians.append(name)

magicians11111 = ['chip', 'dayl', 'ponka']
show_magicians(magicians11111)
make_great(magicians11111)
print("\n")
show_magicians(magicians11111)
Результат:
Сhip
Dayl
Ponka

Ponka The Great
Dayl The Great
Сhip The Great
Не могу понять почему при использовании цикла for метод pop() при переборе не удаляет элемент chip из списка. Объясните пожалуйста.

Офлайн

#5 Март 22, 2019 00:18:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Помогите решить задачу

shelter
 magicians11111 = ['chip', 'dayl', 'ponka']
Какая Понка? Гайка. Понка - это из утиных историй.

shelter
Не могу понять почему при использовании цикла for метод pop() при переборе
Потому что цикл for идёт не по фиксированному списку. Нельзя в цикле for по списку менять этот же список. Это приводит к трудноуловимым ошибкам.

Пример потери элемента
  
>>> lst = [1, 2, 3]
>>> for i in lst:
...   print(i)
...   _ = lst.pop()
... 
1
2
>>>



Офлайн

#6 Март 22, 2019 10:28:59

shelter
Зарегистрирован: 2019-03-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите решить задачу

py.user.next
Какая Понка? Гайка. Понка - это из утиных историй.
))) точно
py.user.next
Потому что цикл for идёт не по фиксированному списку. Нельзя в цикле for по списку менять этот же список. Это приводит к трудноуловимым ошибкам.
Спасибо, теперь понятно частично, но понять бы как он именно идёт. Автор книги ни об этом не говорит, ни о том что вы прояснили, по крайней мере на том этапе до чего я дошел. Кажется, что хорошо бы автору объяснить досконально принцип работы циклов прежде чем давать такие упражнения. Но возможно это я что то упустил, буду разбираться дальше.
p.s. речь о книге Изучаем Python. Программирование игр, визуализация данных, веб-приложения. Мэтиз Эрик

Офлайн

#7 Март 22, 2019 12:17:39

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Помогите решить задачу

shelter
Спасибо, теперь понятно частично, но понять бы как он именно идёт.
Цикл делает только два шага, а не три. Чтобы просматривать, как работает любой цикл, можно вставить отладочные принты, также можно использовать дебаггер для пошагового прохода (более профессиональный способ, которому следует обучиться).

Вот пример вставки отладочных принтов, чтобы подробно увидеть, что происходит на каждом шаге цикла.
  
>>> def show_magicians(magicians):
...     for name in magicians:
...         print(name.title())
... 
>>> def make_great(magicians):
...     great_magicians = []
...     for name in magicians:
...         print('name', name)
...         print('before', magicians)
...         g_name = magicians.pop() + " the Great"
...         great_magicians.append(g_name)
...         print('after', magicians)
...     
...     for name in great_magicians:
...         magicians.append(name)
... 
>>> magicians11111 = ['chip', 'dayl', 'ponka']
>>> 
>>> show_magicians(magicians11111)
Chip
Dayl
Ponka
>>> 
>>> make_great(magicians11111)
name chip
before ['chip', 'dayl', 'ponka']
after ['chip', 'dayl']
name dayl
before ['chip', 'dayl']
after ['chip']
>>> 
>>> show_magicians(magicians11111)
Chip
Ponka The Great
Dayl The Great
>>> 

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

У тебя элемент удаляется с конца списка, но можно удалять и из начала списка, поэтому это ещё непредсказуемее будет себя вести, так как цикл будет проскакивать элементы, которые даже не были рассмотрены, считая их рассмотренными.



Отредактировано py.user.next (Март 22, 2019 12:23:11)

Офлайн

#8 Март 22, 2019 16:07:30

shelter
Зарегистрирован: 2019-03-21
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите решить задачу


py.user.next
Почему он делает только два шага, а не три, - потому что цикл при каждом витке переходит на следующий элемент, уходя с предыдущего элемента. Поэтому когда ты там что-то удаляешь, то складывается ситуация, что цикл ищет следующий элемент, чтобы на него перейти, а его там нет, потому что он удалён в теле цикла. Из-за этого он считает, что все элементы закончились.
Понял. Большое спасибо!

Офлайн

#9 Май 10, 2020 22:23:16

danielly2541
Зарегистрирован: 2020-05-10
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите решить задачу

shelter
И я застрял на этом упражнении. Я пытался решить так:

Я тоже застрял на этом упражнении и решил задачу так, чтобы это не противоречило пройденному материалу. В принципе оказалось все очень просто. Если убрать функцию make_great, то видно, что функция, действительно, выполняет данную ей задачу.

 def show_magicians(names):
	for name in names:
		print('Hello ' + name.title() + '!')
def make_gread(name_magicians):
	while name_magicians:
		gread_name = name_magicians.pop()
		name_1 = 'Great ' + gread_name.title()
		new_magicians.append(name_1)
	while new_magicians:
		name_gread = new_magicians.pop()
		magicians.append(name_gread)
magicians = ['petya', 'vasya', 'oleg']
new_magicians = []
make_gread(magicians)
show_magicians(magicians)

Отредактировано danielly2541 (Май 10, 2020 22:24:02)

Офлайн

#10 Май 10, 2020 22:30:59

danielly2541
Зарегистрирован: 2020-05-10
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите решить задачу

shelter
И я застрял на этом упражнении. Я пытался решить так:
А это решение следующего задания. Чутка меняешь, передаешь только копию списка и удаляешь часть функции make_gread.

 def show_magicians(names):
	for name in names:
		print('Hello ' + name.title() + '!')
def make_gread(name_magicians):
	while name_magicians:
		gread_name = name_magicians.pop()
		name_1 = 'Great ' + gread_name.title()
		new_magicians.append(name_1)
magicians = ['petya', 'vasya', 'oleg']
new_magicians = []
make_gread(magicians[:])
show_magicians(magicians)
show_magicians(new_magicians)

Отредактировано danielly2541 (Май 10, 2020 22:31:47)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version