Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
1 / 1 / 0
Регистрация: 04.09.2015
Сообщений: 36

Проблема с функцией

03.02.2023, 11:34. Показов 2367. Ответов 35

Студворк — интернет-сервис помощи студентам
Имеем рабочий код (игра в города).

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
cityes = [
    "Барнаул","Иваново","Белгород","Муром","Уфа",
    "Ржев","Томск","Архангельск","Сургут","Курск","Ижевск",
    "Армавир","Воркута","Брянск","Вологда"
]
  
print("Игра в города. Что бы закончить игру введите слово стоп")
game_over = False
  
# Первый ход - делает компьютер
city = 'Москва'
print(city)
step = 'human'
s_end = city[-1]
  
while game_over == False:    
  
    if step == 'human':
        correct = False
        while correct == False:            
            city = input("Введите ваш город: на букву: " + s_end+". Ваш город: ")
            if city == "стоп":
                game_over = True
                correct = True
            else:
                correct = True
                #Проверить что город на нужную букву
                if city[0].lower () != s_end:
                    correct = False
                    print("Не верно. Назовите город на букву",s_end)
        step = 'AI'
    else:        
        city = ''
        for city_next in cityes:            
            if city_next[0].lower() == s_end:
                city = city_next
        if city == '':
            print('Вы победили')
            print('Не найден город на букву', s_end)
            game_over = True
        else:
            print(city)           
        step = 'human'
 
    if game_over == False:
        s_end = city[-1]    
          
print('Игра окончена')

Задача: преобразовать программу для работы через функцию (def).
Ранее при написании программ функцию не использовал: только начал разбираться.
В простых примерах все понятно,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def print_check(honey_positions):
    sum = 0  # переменная для накопления общей суммы
    print("ООО Медовый Гексагон\n")
    # в цикле будем выводить название, количество и цену
    for honey in honey_positions:
        name = honey[0]
        amount = honey[1]
        price = honey[2]
        print(f"{name} ({amount} шт.) - {price} руб.")
        sum += amount * price  # здесь же будем считать ещё и общую сумму
    print(f"\nИтого: {sum} руб.")
    print("Спасибо за покупку!")
 
honey_positions = [
    ("Мёд липовый", 3, 1250),
    ("Мёд цветочный", 7, 1000),
    ("Мёд гречишный", 6, 1300),
    ("Донниковый мёд", 1, 1750),
    ("Малиновый мёд", 10, 2000),
]
print_check(honey_positions)
а тут затык.
Мыслил так:
1. Делим программу на блоки
2. Для каждого блока своя функция. Что не входит в блок идет отдельно.
Получилось так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# исходные данные
cityes = [
    "Барнаул","Иваново","Белгород","Муром","Уфа",
    "Ржев","Томск","Архангельск","Сургут","Курск","Ижевск",
    "Армавир","Воркута","Брянск","Вологда"
]
print("Игра в города. Что бы закончить игру введите слово стоп")
#game_over = False
  
# Первый ход (компьютер)
def go_komp():
    city = "Москва"
    print(city)
    step = "human"
    s_end = city[-1]
  
# основная игра
def main(cityes):
    go_komp(city)
    game_over = False
    while game_over == False:
        if step == "human":
            correct = False
            while correct == False:
                city = input("Введите ваш город: на букву: " + s_end+". Ваш город: ")
                if city == "стоп":
                    game_over = True
                    correct = True
                else:
                    correct = True
                    #Проверить что город на нужную букву
                    if city[0].lower () != s_end:
                        correct = False
                        print("Не верно. Назовите город на букву",s_end)
            step = "AI"
        else:
            city = ''
            for city_next in cityes:
                if city_next[0].lower() == s_end:
                    city = city_next
            if city == '':
                print("Вы победили")
                print("Не найден город на букву", s_end)
                game_over = True
            else:
                print(city)
            step = "human"
        if game_over == False:
            s_end = city[-1]    
print("Игра окончена")
go_komp()
main(cityes)
Понятно, что не работает.
Из теории я понимаю, что нужно после работы функции передавать параметры, но не могу понять что и куда.
Быть может есть какой-то учебный пример не в три строки «для чайников»?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2023, 11:34
Ответы с готовыми решениями:

Проблема с функцией
def(x, y): i = 0 while i != y: cls() n1 = random.randint(1, x) n2 = random.randint(1, x) ...

Проблема с функцией
Всем привет. Делая небольшой проект, натыкаюсь на некую проблему с присваиванием. Вот код для исследования моей проблемы: list_list =...

Проблема с функцией
Помогите пожалуйста , в чем заключается ошибка? И как сделать так чтобы при вводе "mining stop" Функция выключалась? :help: ...

35
12 / 11 / 2
Регистрация: 09.11.2022
Сообщений: 24
03.02.2023, 12:39
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
cityes = [
    "Барнаул","Иваново","Белгород","Муром","Уфа",
    "Ржев","Томск","Архангельск","Сургут","Курск","Ижевск",
    "Армавир","Воркута","Брянск","Вологда"
]
print("Игра в города. Что бы закончить игру введите слово стоп")
 
# Первый ход (компьютер)
def go_komp():
    city = "Москва"
    print(city)
    return city, "human", city[-1]
  
# основная игра
def main(cityes):
    city, step, s_end = go_komp()
    game_over = False
    while not game_over:
        if step == "human":
            correct = False
            while not correct:
                city = input("Введите ваш город: на букву: " + s_end+". Ваш город: ")
                if city == "стоп":
                    game_over = True
                    correct = True
                else:
                    #Проверить что город на нужную букву
                    if city[0].lower () == s_end:
                        correct = True
                    else:
                        print("Не верно. Назовите город на букву", s_end)
                game_over = True
            else:
                print(city)
            step = "human"
        if game_over == False:
            s_end = city[-1]    
print("Игра окончена")
go_komp()
main(cityes)
1
1 / 1 / 0
Регистрация: 04.09.2015
Сообщений: 36
03.02.2023, 13:32  [ТС]
CBR, спасибо за ответ!
Есть несколько вопросов:

1.
Цитата Сообщение от CBR Посмотреть сообщение
# Первый ход (компьютер)
def go_komp():
city = "Москва"
print(city)
return city, "human", city[-1]
Почему здесь мы возвращаем переменную "city" и значения переменных "step" и "s_end"?
Как я думаю, мы должны возвращать или переменные или значения, но не "смесь". Я не прав? Что будет аргументом функции - переменная или значение?

2. Замена
Цитата Сообщение от blackgeneral Посмотреть сообщение
while correct == False:
на
Цитата Сообщение от CBR Посмотреть сообщение
while not game_over:
и последующие замены обусловлены тем, что Вы хотели "убрать строку:
Цитата Сообщение от blackgeneral Посмотреть сообщение
game_over = False
?

3. Куда пропал данный кусок кода?
Цитата Сообщение от blackgeneral Посмотреть сообщение
step = "AI"
else:
city = ''
for city_next in cityes:
if city_next[0].lower() == s_end:
city = city_next
if city == '':
print("Вы победили")
print("Не найден город на букву", s_end)
Разве он лишний?

4. Вы написали неполный (а значит и неправильно работающий) код для того, чтобы показать развитие мысли по работе с функцией?
0
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
03.02.2023, 13:33
Цитата Сообщение от blackgeneral Посмотреть сообщение
Понятно, что не работает.
Из теории я понимаю, что нужно после работы функции передавать параметры, но не могу понять что и куда.
Быть может есть какой-то учебный пример не в три строки «для чайников»?
пример:
Python
1
2
3
4
def f(x):
    return x + 1
 
z = f(4)  #вызывается функция и результат функции записывается в переменную z
1
1 / 1 / 0
Регистрация: 04.09.2015
Сообщений: 36
03.02.2023, 13:42  [ТС]
Цитата Сообщение от TimutGin Посмотреть сообщение
#вызывается функция и результат функции записывается в переменную z
А если результатов несколько?
Тогда несколько переменных?
CBR, например, написал в return и переменную и значения переменных. Почему?

Простые примеры, как Вы привели, я понимаю (об этом я писал выше), а вот пример "более 3 строк" создал трудности.
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
03.02.2023, 13:43
Цитата Сообщение от blackgeneral Посмотреть сообщение
А если результатов несколько?
Тогда несколько переменных?
Список, кортеж
1
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
03.02.2023, 13:56
Python
1
2
3
4
5
6
7
8
def f(x,y,z):
    return x + 1, y+1, z+1 #возвращает 3 значения
 
x,y,z = f(4,3,2) #значения записываются в 3 переменные
 
print(x)
print(y)
print(z)
1
1712 / 579 / 76
Регистрация: 10.04.2009
Сообщений: 9,330
03.02.2023, 13:57
blackgeneral, может стоить посмотреть как сделано у других:
https://python-course.readthed... ities.html
или гуглить..........
0
1 / 1 / 0
Регистрация: 04.09.2015
Сообщений: 36
03.02.2023, 14:24  [ТС]
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
может стоить посмотреть как сделано у других:
https://python-course.readthed... ities.html
Ципихович Эндрю, в Вашем примере не вижу объяснения по работе функции. Кроме этого, там только задание да еще с графическим интерфейсом.
Мне не нужно писать программу с нуля. Мне нужно вышеприведенную переделать под работу с функциями, и помимо этого, я хочу разобраться как это все работает.

Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
или гуглить..........
Если бы мне нужно было тупо найти любой код "города" в гугле я бы его нашел. Мне нужно разобраться.
Нормальное объяснение в инете я не нашел. Именно поэтому написал:
Цитата Сообщение от blackgeneral Посмотреть сообщение
Быть может есть какой-то учебный пример не в три строки «для чайников»?
0
 Аватар для Semen-Semenich
5237 / 3481 / 1176
Регистрация: 21.03.2016
Сообщений: 8,310
03.02.2023, 14:28
blackgeneral, как видите примеров под ваш код нет а вот что такое функции, вызов функции с параметрами, возвращаемые значения и т.д примеров полно
0
1712 / 579 / 76
Регистрация: 10.04.2009
Сообщений: 9,330
03.02.2023, 14:35
Цитата Сообщение от blackgeneral Посмотреть сообщение
я хочу разобраться как это все работает
для этого нужно постить "портянки" поменьше
0
 Аватар для IPredator
236 / 198 / 44
Регистрация: 21.01.2019
Сообщений: 975
03.02.2023, 15:19
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
cityes = [
    "Барнаул", "Иваново", "Белгород", "Муром", "Уфа",
    "Ржев", "Томск", "Архангельск", "Сургут", "Курск", "Ижевск",
    "Армавир", "Воркута", "Брянск", "Вологда"
]
print("Игра в города. Что бы закончить игру введите слово стоп")
 
 
# Первый ход (компьютер)
def go_komp():
    city = "Москва"
    print(city)
    return city, "human", city[-1]
 
 
# основная игра
def main(cityes):
    city, step, s_end = go_komp()
    game_over = False
    while not game_over:
        if step == "human":
            correct = False
            while not correct:
                city = input("Введите ваш город: на букву: " + s_end + ". Ваш город: ")
                if city == "стоп":
                    game_over = True
                    correct = True
                else:
                    # Проверить что город на нужную букву
                    if city[0].lower() == s_end:
                        correct = True
                    else:
                        print("Не верно. Назовите город на букву: " + s_end + ". Ваш город: ")
                if city == "стоп":
                    game_over = True
                    correct = True
                else:
                    correct = True
                    # Проверить что город на нужную букву
                    if city[0].lower() != s_end:
                        correct = False
                        print("Не верно. Назовите город на букву", s_end)
            step = "AI"
        else:
            city = ''
            for city_next in cityes:
                if city_next[0].lower() == s_end:
                    city = city_next
            if city == '':
                print("Вы победили")
                print("Не найден город на букву", s_end)
                game_over = True
            else:
                print(city)
            step = "human"
        if game_over == False:
            s_end = city[-1]
 
 
print("Игра окончена")
go_komp()
main(cityes)
незачто
Миниатюры
Проблема с функцией  
1
1 / 1 / 0
Регистрация: 04.09.2015
Сообщений: 36
03.02.2023, 17:53  [ТС]
IPredator, Спасибо, но пока остались вопросы:
Почему в начале пишет, что игра окончена и два раза "Москва"?
Разве
Цитата Сообщение от IPredator Посмотреть сообщение
print("Игра окончена")
не должен быть в этом цикле?

Цитата Сообщение от IPredator Посмотреть сообщение
while not game_over:
И также остается открытым вопрос про код который есть у Вас и который я задал CBR,
Цитата Сообщение от blackgeneral Посмотреть сообщение
Почему здесь мы возвращаем переменную "city" и значения переменных "step" и "s_end"?
Цитата Сообщение от Semen-Semenich Посмотреть сообщение
как видите примеров под ваш код нет
Да, нет. Поэтому и задан вопрос здесь. При другие примеры я уже писал выше.

Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
для этого нужно постить "портянки" поменьше
Странно, что код в 50 строчек Вы считаете "портянками"...
0
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
03.02.2023, 18:11
Цитата Сообщение от blackgeneral Посмотреть сообщение
Почему в начале пишет, что игра окончена и два раза "Москва"?
Потому что go_komp() вызывается 2 раза,
61 строку можно удалить а 60 где выводится "Игра окончена" перенести в нужное место

Добавлено через 8 минут
Цитата Сообщение от blackgeneral Посмотреть сообщение
Почему здесь мы возвращаем переменную "city" и значения переменных "step" и "s_end"?
Как я понимаю эти значения в дальнейшем используются в циклах
1
 Аватар для IPredator
236 / 198 / 44
Регистрация: 21.01.2019
Сообщений: 975
03.02.2023, 18:28
blackgeneral,
1)Во-первых у тебя переменная "step" нигде не определена, соответственно вызовет ошибку.
2)Функция "go_komp()" не возвращает никакого значения, но "step" и "s_end" используются в основной функции
3)Аргумент "city", переданный функции "go_komp()", не определен, но код пытается присвоить ему значение
4)Код пытается получить доступ к списку "cityes" в основной функции, но определен только во внешней области.

Это в кратце, что он возвращает "игра окончена" в начале сам постарайся разобраться. Я сделал его рабочим кое-как, допиливай дальше сам
1
1 / 1 / 0
Регистрация: 04.09.2015
Сообщений: 36
03.02.2023, 18:32  [ТС]
Цитата Сообщение от TimutGin Посмотреть сообщение
Потому что go_komp() вызывается 2 раза,
Спасибо, не заметил сразу.

Цитата Сообщение от TimutGin Посмотреть сообщение
Как я понимаю эти значения в дальнейшем используются в циклах
Я понимаю, что используются.
Я просто в теории не встречал, чтобы можно было возвращать и переменную и значение. Поэтому хотел узнать почему написано именно так.

Цитата Сообщение от IPredator Посмотреть сообщение
1)Во-первых у тебя переменная "step" нигде не определена, соответственно вызовет ошибку.
Почему не определена, а строка 13?

Цитата Сообщение от IPredator Посмотреть сообщение
Это в кратце, что он возвращает "игра окончена" в начале сам постарайся разобраться. Я сделал его рабочим кое-как, допиливай дальше сам
Спасибо, буду разбираться.
0
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
03.02.2023, 18:58
"Если интерпретатор Питона, выполняя тело функции, встречает return, то он "забирает" значение, указанное после этой команды, и "уходит" из функции." - цитата из интернета
0
 Аватар для IPredator
236 / 198 / 44
Регистрация: 21.01.2019
Сообщений: 975
03.02.2023, 19:06
Цитата Сообщение от IPredator Посмотреть сообщение
if step == "human":
вот так значит определена в данном случае
1
 Аватар для TimutGin
515 / 339 / 146
Регистрация: 16.02.2021
Сообщений: 626
03.02.2023, 19:15
А в 18 строке step не определен?
0
 Аватар для IPredator
236 / 198 / 44
Регистрация: 21.01.2019
Сообщений: 975
03.02.2023, 19:22
Цитата Сообщение от TimutGin Посмотреть сообщение
А в 18 строке step не определен?
Если ты про самый первый код ТС-а, то да , определен верно, потом также нужно было делать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.02.2023, 19:22
Помогаю со студенческими работами здесь

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

Проблема с функцией
#include <iostream> #include <cmath> #include <windows.h> #include <stdlib.h> #include <iomanip> using namespace std; ...

Проблема с функцией
Скажите как ее решить код ненадо хотябы строчку этой функции как будет выглядить

Проблема с функцией Если
Здравствуйте! Застрял на задании 2, понимаю, что здесь принцип вложенной формулы, но никак не получается решить. Зеленые дополнительные...

Проблема с функцией pow()
last = c % pow(10, count); подчеркивает pow, пишет, что найдены перегрузки. last, c, count - integer. В чем ошибка?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru