Найти - Пользователи
Полная версия: while внутри фунцкии
Начало » Python для новичков » while внутри фунцкии
1
Lunihorn
Здравствуйте. Начал самостоятельно изучать питон и остановился на следующем задании:

пройдите в цикле по списку пока не встретится имя “Валера”. Когда найдете напишите “ты нашел Валеру”. Подсказка: используйте метод 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

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

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

Цикл организован неверно. Если в списке нет искомого имени, то попробуй проанализировать что получится?
Lunihorn
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
rumactep
что должна сделать функция find_person('Маша')
я не знал что писать в скобках при вызове фунуции

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

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

Спасибо за помощь!
rumactep
 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 + ' не найдено')
Rafik
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 или не ноль, то условие будет истинным.
Lunihorn
Rafik
rumactep, вот чуточку подправленный вариант
Спасибо!
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