Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 11, 2021 01:01:12

Lunihorn
Зарегистрирован: 2021-02-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

while внутри фунцкии

Здравствуйте. Начал самостоятельно изучать питон и остановился на следующем задании:

пройдите в цикле по списку пока не встретится имя “Валера”. Когда найдете напишите “ты нашел Валеру”. Подсказка: используйте метод list.pop()

мое решение:

 name = ['Вася', 'Маша', 'Петя', 'Валера', 'Саша', 'Даша']
 
while True:
    i = 0
    searh_valera = name.pop(i)
    if searh_valera == 'Валера':
        print('Валера?')
        print('ты нашел Валеру!')
        break #pause
    else:
        print(searh_valera,'?')
        print('это не Валера')
        i += 1

вывод программы:
Вася ?
это не Валера
Маша ?
это не Валера
Петя ?
это не Валера
Валера?
ты нашел Валеру!

след задание:
Перепишите предыдущий пример в виде функции find_person(name), которая ищет имя в списке

вот что написал:
 person = ['Вася', 'Маша', 'Петя', 'Валера', 'Саша', 'Даша']
 
def find_person(name):
    name = str(input("Кого будем искать? "))
    while True:
        i = 0
        searh_name = person.pop(i)
        if searh_name == name:
            print(name,'?')
            print('ты нашел', name)
            break #pause
        else:
            print(searh_name,'?')
            print('это не', name )
            i += 1
 
p = find_person('Маша')
print(p)

вывод программы:
Кого будем искать? Валера
Вася ?
это не Валера
Маша ?
это не Валера
Петя ?
это не Валера
Валера ?
ты нашел Валера
None

#вопрос 1: что нужно писать в скобках после find_person, который в конце программы? пробовал все имена, работает одинакого, пробовал оставить кавычки - результат такой же, если пустые скобки, то будет ошибка.
#вопрос 2: почему когда программа находит заданное имя после сообщения об успешном поиске пишется None?

Пробовал дописать return name

выводит:
Кого будем искать? Саша
Вася ?
это не Саша
Саша

не видит дальше первого и сразу пишет ответ

Офлайн

#2 Фев. 11, 2021 10:39:23

rumactep
Зарегистрирован: 2021-02-11
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

while внутри фунцкии

p = find_person('Маша')
что должна сделать функция find_person('Маша')? и какое значение функция должна передать переменной p? внутри функции нет такой инструкции как return name

 person = ['Вася', 'Маша', 'Петя', 'Валера', 'Саша', 'Даша']
 
def find_person(name):
    name = str(input("Кого будем искать? "))
    while True:
        i = 0
        searh_name = person.pop(i)
        if searh_name == name:
            print(name,'?')
            print('ты нашел', name)
            return name
        else:
            print(searh_name,'?')
            print('это не', name )
            i += 1
 
p = find_person('Маша')
print(p)

Desktop>go.py
Кого будем искать? Валера
Вася ?
это не Валера
Маша ?
это не Валера
Петя ?
это не Валера
Валера ?
ты нашел Валера
Валера

Отредактировано rumactep (Фев. 11, 2021 10:42:18)

Офлайн

#3 Фев. 11, 2021 16:11:44

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

while внутри фунцкии

Lunihorn
вопрос 1: что нужно писать в скобках после find_person, который в конце программы?
Перво-наперво, после имени функции в скобках пишется имя аргумента функции. Имя может быть любым допустимым именем переменной. Внутри функции эта переменная будет содержать то, что ты передал функции. Рассмотрим первые две строки твоей функции:
 def find_person(name):
    name = str(input("Кого будем искать? "))
Итак, твоя функция приняла в переменную name значение, которое ты передал ей - это описывает первая строка. На второй же строке ты в эту же переменную запрашиваешь у пользователя значение. Спрашивается: зачем передавать в функцию что-то, если оно будет затерто вводом от пользователя? Может быть стоит в функцию передать твой список person и на певой строке имя переменной изменить на какое-либо другое? В этом случае надо будет шерстить внутри функции уже не person, а ту переменную, которую напишешь в строке def в скобках..
Lunihorn
#вопрос 2: почему когда программа находит заданное имя после сообщения об успешном поиске пишется None?
Твоя функция не содержит return значение и поэтому функция вернет None. Это напечатает print, который у тебя после вызова функции.

Цикл организован неверно. Если в списке нет искомого имени, то попробуй проанализировать что получится?

Офлайн

#4 Фев. 12, 2021 00:39:59

Lunihorn
Зарегистрирован: 2021-02-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

while внутри фунцкии

Rafik
Может быть стоит в функцию передать твой список person и на певой строке имя переменной изменить на какое-либо другое?
Привет, изначально я пылался сделать, чтобы в name передавалось значечние из спика:
name = person, потом бы шло сравнение name c именем которое вводится с клавиатуры. Но я не смог сделать, чтобы при неудачной попытке в name выбиралось следующее имя из списка.
 person[0 + 1]
не будет работать в цикле
 i = 0, person[i + 1]
выбавало ошибку

в итоге сделал так:

 person = ['Вася', 'Маша', 'Петя', 'Валера', 'Саша', 'Даша']
 
def find_person(name):
    name = str(input("Кого будем искать? "))
    while True:
        i = 0
        searh_name = person.pop(i)
        if searh_name == name:
            print(name,'?')
            return 'ты нашел '+ name[:-1] + 'у!'
        else:
            print(name,'?')
            print('это не', name )
            i += 1
    return 'ты не нашел '+ name
 
p = find_person('')
print(p)

Отредактировано Lunihorn (Фев. 12, 2021 00:40:24)

Офлайн

#5 Фев. 12, 2021 00:45:15

Lunihorn
Зарегистрирован: 2021-02-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

while внутри фунцкии

rumactep
что должна сделать функция find_person('Маша')
я не знал что писать в скобках при вызове фунуции

Lunihorn
#вопрос 1: что нужно писать в скобках после find_person, который в конце программы? пробовал все имена, работает одинакого, пробовал оставить кавычки - результат такой же, если пустые скобки, то будет ошибка.

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

Спасибо за помощь!

Офлайн

#6 Фев. 12, 2021 07:57:15

rumactep
Зарегистрирован: 2021-02-11
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

while внутри фунцкии

 persons = ['Вася', 'Маша', 'Петя', 'Валера', 'Саша', 'Даша']
 
def find_person(name):    
    while len(persons) > 0:
        iter_name = persons.pop(0)
        if iter_name == name:
            print(name,'?')
            print('ДА! Это ' + name)
            return iter_name 
        else:
            print(name,'?')
            print('это не', name )
    return None
 
who = str(input("Кого будем искать? "))
found = find_person(who)
if found != None:
    print('Имя ' + found + ' найдено')
else:
    print('Имя ' + who + ' не найдено')

Отредактировано rumactep (Фев. 12, 2021 08:07:16)

Офлайн

#7 Фев. 12, 2021 15:58:51

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

while внутри фунцкии

rumactep, вот чуточку подправленный вариант

 persons = ['Вася', 'Маша', 'Петя', 'Валера', 'Саша', 'Даша']
 
def find_person(name):    
    while len(persons) > 0:
        iter_name = persons.pop(0)
        if iter_name == name:
            print(iter_name,'?')
            print('ДА! Это ' + name)
            return iter_name 
        else:
            print(iter_name,'?')
            print('это не', name )
who = input("Кого будем искать? ")
found = find_person(who)
if found:
    print('Имя ' + found + ' найдено')
else:
    print('Имя ' + who + ' не найдено')
На будущее: в конце функции можно не ставить return None, т.к. если функция завершается как бы без возврата значения, она в эом случае вернёт None.
Далее, input всегда даёт str и преобразовывать его в str излишне.
Условие в if found != None можно сократить до if found. Здесь, если значение found не пусто, не None или не ноль, то условие будет истинным.

Офлайн

#8 Фев. 15, 2021 00:44:50

Lunihorn
Зарегистрирован: 2021-02-11
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

while внутри фунцкии

Rafik
rumactep, вот чуточку подправленный вариант
Спасибо!

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version