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

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

03.02.2023, 11:34. Показов 2262. Ответов 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
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,301
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
5220 / 3468 / 1172
Регистрация: 21.03.2016
Сообщений: 8,295
03.02.2023, 14:28
blackgeneral, как видите примеров под ваш код нет а вот что такое функции, вызов функции с параметрами, возвращаемые значения и т.д примеров полно
0
1711 / 578 / 76
Регистрация: 10.04.2009
Сообщений: 9,301
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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru