Определение типа переменной! PYTHON - PullRequest
1 голос
/ 02 февраля 2020

Я делаю небольшую консольную программу. Вы вводите данные, а затем программа помещает их в файл .txt. Данные: Страна Год рождения Месяц рождения День рождения Настоящее имя Псевдоним

Я решил сделать определение для каждой переменной, поэтому, если пользователь вводит целое число в поле «Страна», он выдает ему предупреждение и порок наоборот. Вот код:

countryU = input('Страна проживания ')
yearU = input('Год рождения ')
monthU = input('Месяц рождения (его порядковый номер) ')
dayU = input('День рождения ')
nameU = input('Имя ')
nicknameU = input('Никнейм ')
aaaaa = 5
from random import *
u = randint(1,1000000000000)
uinfoname = str(u) + '.txt'

if type(countryU) == str:
    if type(yearU) == int:
        if type(monthU) == int:
            if type(dayU) == int:
                if type(nameU) == str:
                    if type(nicknameU) == str:
                        if countryU == '':
                            print('Вы ввели не все данные! Перезапустите программу и введите все.')
                            input('Press any key to exit...')
                        else:
                            if yearU == '':
                                print('Вы ввели не все данные! Перезапустите программу и введите все.')
                                input('Press any key to exit...')
                            else:
                                if monthU == '':
                                    print('Вы ввели не все данные! Перезапустите программу и введите все.')
                                    input('Press any key to exit...')
                                else:
                                    if dayU == '':
                                        print('Вы ввели не все данные! Перезапустите программу и введите все.')
                                        input('Press any key to exit...')
                                    else:
                                        if nameU == '':
                                            print('Вы ввели не все данные! Перезапустите программу и введите все.')
                                            input('Press any key to exit...')
                                        else:
                                            if nicknameU == '':
                                                print('Вы ввели не все данные! Перезапустите программу и введите все.')
                                                input('Press any key to exit...')
                                            else:
                                                if (len(str(nicknameU)) < aaaaa):
                                                    print('Твой никнейм недостаточно длинный! (минимум 5 символов) Перезагрузите программу и введите все правильно.')
                                                    input('Press any key to exit...')
                                                else:
                                                    print('Вы -', nameU, 'из страны', countryU, '')
                                                    print('Ваша дата рождения: месяц', monthU, 'число', dayU, 'год', yearU, '')
                                                    print('Ваш никнейм на сайте -', nicknameU, '.')
                                                    print('Приятного времяпрепровождения!')
                                                    output = open(uinfoname, 'x')
                                                    print(countryU, file=output)
                                                    print(yearU, file=output)
                                                    print(monthU, file=output)
                                                    print(dayU, file=output)
                                                    print(nameU, file=output)
                                                    print(nicknameU, file=output)
                                                    output.close()
                                                    input('Press any key to exit...')
                    else:
                        print('Никнейм не должен содержать специальные символы или цифры!')
                        input('Press any key to exit...')
                else:
                    print('Имя не должно содержать специальные символы или цифры!')
                    input('Press any key to exit...')
            else:
                print('День вашего рождения является числом!')
                input('Press any key to exit...')
        else:
            print('Месяц вашего рождения является числом!')
            input('Press any key to exit...')
    else:
        print('Год вашего рождения является числом!') #pay attention to this string, this is the problem
        input('Press any key to exit...')
else:
    print('Название вашей страны не может содержать специальные символы или цифры! (Если название вашей страны все-таки их содержит, напишите название без них.')
    input('Press any key to exit...')

Не против, я русский и использую русский язык. Ну, к проблеме: когда я запускаю программу и набираю все правильно (целое число в целое, строка в строку), он говорит: Год вашего рождения является числом! (проблемная строка) Это означает, что "Ваш год рождения должен быть числом!" И даже если я наберу страну неправильно (целое число), это говорит о том же. Поэтому, что бы я ни печатал, это дает мне эту строку. Я также использовал isinstance, но здесь все намного хуже. Пожалуйста, помогите мне!

Ответы [ 7 ]

1 голос
/ 02 февраля 2020

Метод input() всегда возвращает строку. Если вы хотите, чтобы соответствующая переменная была целым числом, вы должны преобразовать строку в целое число, используя метод int().

Итак:

year = int(input("Please enter a year"))

То же самое относится и к другим типам переменные, но с методом float() для чисел с плавающей запятой и т. д.

1 голос
/ 08 февраля 2020

Помните, что input () всегда дает вам строку. Попробуйте это:

try:
    mathproblem = int(input('23516 * 84818^81'))
except ValueError:
    print('Dude you should type a number...')
0 голосов
/ 02 февраля 2020

input([prompt]) всегда возвращает строковый тип.

Если аргумент подсказки присутствует, он записывается в стандартный вывод без завершающей строки. Затем функция читает строку из ввода, преобразует ее в строку (убирает завершающий перевод строки) и возвращает ее.

Если вы хотите выполнить проверку типа, вы можете использовать isinstance(object, classinfo), которая возвращает Истинно, если аргумент объекта является экземпляром аргумента classinfo и вызывает исключение при обнаружении недопустимого значения.

Пример:

def checkType(s):
    if not isinstance(s, str):
        # This is (a simple form of) how you raise your own custom exception:
        raise Exception('It must be a string')
    else: 
        pass

print(checkType('abc'))
print(checkType(1))
print("This line will never run!")
0 голосов
/ 02 февраля 2020

Чтобы удалить количество операторов IF, которые вы имеете, вы можете просто спросить, что ввод является целым числом или строкой, когда вы запрашиваете переменную в первых нескольких строках, например:

countryU = str(input('Страна проживания '))
yearU = int(input('Год рождения '))

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

if countryU != int():
print('Год вашего рождения является числом!') # remember to indent/tab this line!!

означает, что '! =' НЕ равно, поэтому, если страна не является целочисленным выводом "Год вашего рождения является числом!".

Надеюсь, это поможет, это означает, что вам не нужно проверять, является ли это str / int, потому что python делает это за вас, вам нужно только проверить, не является ли он srt / int.

0 голосов
/ 02 февраля 2020

Большая часть вашего кода учитывает случай, который никогда не может произойти, а именно, что возвращаемое значение input равно , а не значение str. Кроме того, если вы просто выходите сразу, когда используете input('Press any key to exit...'), нет необходимости делать отступ для следующего кода. Имея это в виду, ваш код мгновенно сводится к чему-то вроде

from random import *

countryU = input('Страна проживания ')
yearU = input('Год рождения ')
monthU = input('Месяц рождения (его порядковый номер) ')
dayU = input('День рождения ')
nameU = input('Имя ')
nicknameU = input('Никнейм ')
aaaaa = 5
u = randint(1,1000000000000)

uinfoname = str(u) + '.txt'


if countryU == '':
    print('...')
    input('Press any key to exit...')
    sys.exit()

if yearU == '':
    print('...')
    input('Press any key to exit...')
    sys.exit()

if monthU == '':
    print('...')
    input('Press any key to exit...')
    sys.exit()

if dayU == '':
    print('...')
    input('Press any key to exit...')
    sys.exit()

if nameU == '':
    print('...')
    input('Press any key to exit...')
    sys.exit()

if nicknameU == '':
    print('...')
    input('Press any key to exit...')
    sys.exit()

if (len(str(nicknameU)) < aaaaa):
    print('...')
    input('Press any key to exit...')
    sys.exit()

print('Вы -', nameU, 'из страны', countryU, '')
print('Ваша дата рождения: месяц', monthU, 'число', dayU, 'год', yearU, '')
print('Ваш никнейм на сайте -', nicknameU, '.')
print('Приятного времяпрепровождения!')
output = open(uinfoname, 'x')
print(countryU, file=output)
print(yearU, file=output)
print(monthU, file=output)
print(dayU, file=output)
print(nameU, file=output)
print(nicknameU, file=output)
output.close()
input('Press any key to exit...')
0 голосов
/ 02 февраля 2020
userinput = input ("Enter your Age")
try:
   value = int(userinput)
   print("Input is an integer number. Number = ", valuee)
except ValueError:
  try:
    value = float(userinput)
    print("Input is a float  number. Number = ", value)
  except ValueError:
      print("No.. input is not a number. It's a string")
0 голосов
/ 02 февраля 2020

Все ваши входные данные являются строками, вы можете обрабатывать целые числа как int(str_var)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...