Найти - Пользователи
Полная версия: Помогите решить задачу
Начало » Python для новичков » Помогите решить задачу
1 2 3
Nayomnik
Большое спасибо, особенно за подсказку с функцией
passant
for i, name in enumerate(fokuses):
fokuses = “Great ”+name
заодно поподробнее ознакомлюсь с принципом ее работы
Boomix
Я тоже прохожу этот учебник и вот мое решение на основе пройденного в учебнике
 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)
marvellik
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)
shelter
И я застрял на этом упражнении. Я пытался решить так:

 
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 из списка. Объясните пожалуйста.
py.user.next
shelter
 magicians11111 = ['chip', 'dayl', 'ponka']
Какая Понка? Гайка. Понка - это из утиных историй.

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

Пример потери элемента
  
>>> lst = [1, 2, 3]
>>> for i in lst:
...   print(i)
...   _ = lst.pop()
... 
1
2
>>>
shelter
py.user.next
Какая Понка? Гайка. Понка - это из утиных историй.
))) точно
py.user.next
Потому что цикл for идёт не по фиксированному списку. Нельзя в цикле for по списку менять этот же список. Это приводит к трудноуловимым ошибкам.
Спасибо, теперь понятно частично, но понять бы как он именно идёт. Автор книги ни об этом не говорит, ни о том что вы прояснили, по крайней мере на том этапе до чего я дошел. Кажется, что хорошо бы автору объяснить досконально принцип работы циклов прежде чем давать такие упражнения. Но возможно это я что то упустил, буду разбираться дальше.
p.s. речь о книге Изучаем Python. Программирование игр, визуализация данных, веб-приложения. Мэтиз Эрик
py.user.next
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
>>> 

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

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

py.user.next
Почему он делает только два шага, а не три, - потому что цикл при каждом витке переходит на следующий элемент, уходя с предыдущего элемента. Поэтому когда ты там что-то удаляешь, то складывается ситуация, что цикл ищет следующий элемент, чтобы на него перейти, а его там нет, потому что он удалён в теле цикла. Из-за этого он считает, что все элементы закончились.
Понял. Большое спасибо!
danielly2541
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
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)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB