Проблема Помогите понять ошибку.

S

sasha20l

Код:
def random():
    while True:
        try:
            random_input = abs(int(input("Введите максимальное значение для угадывания: ")))
            print ("Вы уверены ?")
            if yes_no () == True:
                random = int(random.uniform(1, random_input))
                break
        except ValueError:
            print ("Введите числовое значение")

Пишет - UnboundLocalError: local variable 'random' referenced before assignment
 

fuzscore

Well-known member
21.09.2016
77
183
BIT
0
переменная вызывается перед объявлением.
я так понял это только часть кода , кинули бы весь скрипт сразу
 
  • Нравится
Реакции: explorer и sasha20l

Tayler

Green Team
08.07.2017
40
46
BIT
2
Имя функции поменяй, у тебя уже есть импортнутая библиотека random, а ты свою функцию в код с таким же названием ещё тычишь.
Либо с библиотекой эту операцию проверни.
Python:
import random as rn
rn.uniform(1, abs(7))
 
  • Нравится
Реакции: explorer и sasha20l
S

sasha20l

переменная вызывается перед объявлением.
я так понял это только часть кода , кинули бы весь скрипт сразу

Всем привет! Вот весь код.

Код:
'''
import random


import sys
list = {}
list_raznost = {}
def players ():
    players_number = 1
    while True:
        print ("Введите игрока № ",players_number," или end для начала игры")
        players_input = str(input("Введите игрока = "))
        if players_input == "end":
            break
        else:
            print ("Игрок № ",players_number," - ",players_input," ?")
            if yes_no () == True:
                list[players_input] = 0
                players_number = players_number+1

def yes_no ():
    while True:
        yes_no_input = str(input("Введите 1 - Да или 2 - Нет :"))
        if yes_no_input == "1":
            return True
            break
        elif yes_no_input == "2":
            return False
            break
        else:
            print ("Значение ",yes_no_input," не корректно")
def random_n():
    while True:
        ran_nums = 1
        try:
            random_input = int(input("Введите максимальное значение для угадывания: "))
            print ("Вы уверены ?")
            if yes_no () == True:
                ran_nums == abs(int(random.random()*int(random_input)))
                print (ran_nums)
                break
        except ValueError:
            print ("Введите числовое значение")
def game():
    for player in list:
        print ("Игрок ",player," введите Ваше значение: ")
        while True:
            try:
                player_input = int(input("Я считаю что это: "))
                print ("Вы уверены ?")
                if yes_no () == True:
                   break
            except ValueError:
                print ("Введите числовое значение")
        raznost = player_input - ran_nums
        list_raznost[player] = abs(raznost)
    winner = min(list_raznost)
    print("Победил ",winner,", его значение было ближе всего")
    print("Всего в ",raznost,"цифрах от загаданного значения ",ran_nums)
    print("Хотите еще поиграть ?")
print(random_n())
players()
game()
while True:
    if yes_no () == True:
        random_n()
        game()
    else:
        break

Если смотреть отдельно выражение, вне функции :
Код:
random_input = int(input("Введите максимальное значение для угадывания: "))
ran_nums = abs(int(random.random()*int(random_input)))
То оно работает нормально.
А вот в функции, оно почему-то возвращает None
Код:
def random_n():
    while True:
        ran_nums = 1
        try:
            random_input = int(input("Введите максимальное значение для угадывания: "))
            print ("Вы уверены ?")
            if yes_no () == True:
                ran_nums == abs(int(random.random()*int(random_input)))
                print (ran_nums)
                break
        except ValueError:
            print ("Введите числовое значение")

Помогите) 2й день, уже мучаюсь.
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
То оно работает нормально.
А вот в функции, оно почему-то возвращает None

В Python каждая функция возвращает что-то, а здесь ничего не возвращает. Поэтому если нет оператора return то в конец функции добавляется return - None

Нужно добавить return, и уже второй раз я отправляю к исходному коду своей программы - там это реализовано, всё очень наглядно, попробуй сам написать правильно.
 
  • Нравится
Реакции: sasha20l
S

sasha20l

В Python каждая функция возвращает что-то, а здесь ничего не возвращает. Поэтому если нет оператора return то в конец функции добавляется return - None

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

Изменил код:
Код:
def random_n():
    try:
        random_input = int(input("Введите максимальное значение для угадывания: "))
        ran_nums == abs(int(random.random()*int(random_input)))
        return ran_nums
    except ValueError:
        print ("Введите числовое значение")

Но все равно выскакивает ошибка

Traceback (most recent call last):
File "/home/main.py", line 64, in <module>
print(random_n())
File "/home/main.py", line 43, in random_n
ran_nums == abs(int(random.random()*int(random_input)))
NameError: name 'ran_nums' is not defined
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Вот и чудненько! Протестил. Одно маленькое замечание при попытке ввода числа с плавающей точкой:

Код:
Введите максимальное значение для угадывания: 5.5
Введите числовое значение
5.5 тоже является числовым значением, поэтому при выводе ошибки нужно уточнять - Введите целое числовое значение
 
  • Нравится
Реакции: sasha20l
S

sasha20l

Вот и чудненько! Протестил. Одно маленькое замечание при попытке ввода числа с плавающей точкой:

Код:
Введите максимальное значение для угадывания: 5.5
Введите числовое значение
5.5 тоже является числовым значением, поэтому при выводе ошибки нужно уточнять - Введите целое числовое значение

И правда, я даже не подумал.
 

Азиз

Green Team
30.05.2018
224
74
BIT
0
Изменил код:
Код:
def random_n():
    try:
        random_input = int(input("Введите максимальное значение для угадывания: "))
        ran_nums == abs(int(random.random()*int(random_input)))
        return ran_nums
    except ValueError:
        print ("Введите числовое значение")

Но все равно выскакивает ошибка

Traceback (most recent call last):
File "/home/main.py", line 64, in <module>
print(random_n())
File "/home/main.py", line 43, in random_n
ran_nums == abs(int(random.random()*int(random_input)))
NameError: name 'ran_nums' is not defined
Если какая-то ошибка возникает, то первым делом проверяй логи...
 
S

sasha20l

Всем привет Уважаемые программисты, на этот раз попытался написать нового кривого динозавра - крестики, нолики.
Писал сам с самого начала. Программа работает да вот только функция def win (pl): работает не корректно. Эта функция отвечает за
проверку словаря pole_nums {}: на наличие выигрышных комбинация после каждого хода людей. Но что-то пошло не так и теперь каждый ход кто-то выигрывает ... Т.е проблема именно в логике. Если у Вас появиться желание и время посмотрите код пожалуйста. Мне решение проблемы а Вам очередная разминка. Спасибо!

Код:
nolik = '\033[92mO\033[0m'
krestik = '\033[91mX\033[0m'
play_1 = '\033[92mИгрок № 1\033[0m'
play_2 = '\033[91mИгрок № 2\033[0m'

Player_1 = [nolik,0,play_1]
Player_2 = [krestik,0,play_2]
Players = [Player_1,Player_2]

pole_nums = {'num_1':1,'num_2':2,'num_3':3,'num_4':4,
    'num_5':5,'num_6':6,'num_7':7,'num_8':8,'num_9':9}

list = []

def pole ():
    print ("","","-------------------","\n"," | ",pole_nums['num_1']," | ",pole_nums['num_2']," | ",pole_nums['num_3'],
    " | ","\n"," -------------------","\n"," | ",pole_nums['num_4']," | ",pole_nums['num_5'],
" | ",pole_nums['num_6']," | ","\n"," -------------------","\n"," | ",pole_nums['num_7']," | ",
pole_nums['num_8']," | ",pole_nums['num_9']," | ","\n"," -------------------")

def Player_input():
    while True:
        try:
            Pl_input = int(input("Укажите клетку c цифрой: "))
            if Pl_input > 9:
                pole ()
                print ("Введите значение от 1 до 9")
            elif Pl_input < 1:
                pole ()
                print ("Введите значение от 1 до 9")
            else:
                return Pl_input
        except ValueError:
            pole ()
            print ("Введите целое числовое значение")
def proverka():
    while True:
        num = Player_input()
        if num not in list:
            return num
        else:
            pole ()
            print('Эта клетка уже занята!')
def game():
    for pl in Players:
        print(pl[2],"Вам необходимо указать клетку c цифрой от 1 до 9","\n",
        "где будет стоять Ваш",pl[0])
        pole ()
        num = proverka()
        list.append(num)
        for n in pole_nums:
            if pole_nums[n] == num:
                pole_nums[n] = pl[0]
                pole ()
                win(pl)

def win (pl):
    if pl[0] == ((pole_nums['num_1']) and (pole_nums['num_2']) and (pole_nums['num_3']))or((pole_nums['num_4'])
    and (pole_nums['num_5']) and (pole_nums['num_6']))or ((pole_nums['num_7'])
    and (pole_nums['num_8']) and (pole_nums['num_9']))or ((pole_nums['num_1'])
    and (pole_nums['num_4']) and (pole_nums['num_7']))or ((pole_nums['num_2'])
    and (pole_nums['num_5']) and (pole_nums['num_8']))or ((pole_nums['num_3'])
    and (pole_nums['num_6']) and (pole_nums['num_9']))or ((pole_nums['num_1'])
    and (pole_nums['num_5']) and (pole_nums['num_9']))or ((pole_nums['num_3'])
    and (pole_nums['num_5']) and (pole_nums['num_7'])):
        print ('Поздравляем победил ',pl[2])
        winner (pl)
    
def winner (pl):
    pl[1] = pl[1]+1
    print(pl[2]," победил в ",pl[1]," раз!")
    print("~"*20,"ТАБЛИЦА РЕКОРДОВ","~"*20,"\n","\n",play_1,"   победил   ",
    Player_1[1]," раз","\n","\n",play_2,"   победил   ",
    Player_2[1]," раз","\n","\n")

while True:
    game()
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!