Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 10, 2012 16:36:09

Avond
От: Киев
Зарегистрирован: 2012-11-03
Сообщения: 16
Репутация: +  -1  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

Я новичок в питоне, да и в программировании вообще. С дуру написал программку которая выводит все числа от 0 до заданого пользователем числа. Если тип int то следуещее значение в цикле увеличивается на 1, если же float - на 0.1, с str, пока еще не разобрался но вот какая проблема появилась. Интерпретатор почему-то “допустим 10” воспринимает как float, а “3.14” как int. Почему так? Очень не хотелось бы быдлокодить и менять увеличиваемое значение в ветках местами. Подскажите пожалуйста где я накосячил?

def number(n):
    n = input ("Please, enter value!\n")
    p = int(n)
    if p == int(n):  #Если int 
        print ("OK! Your value is variable!")
        s = 0
        print "0"
        while s < n: #Выполняем пока результат не будет равен введенному числу
            i = 1
            s = s + i
            print s
    if p == float(n):  #Если float
        print ("OK! Your value is variable! But it's a float data!")
        s = 0
        print "0"
        while s < n:
            i = 0.1
            s = s + i
            print s
    if p == str(n): # Если str
        print ("Your value don't variable! Please enter the number!")
        return number(0)
print number(0)



Старый баг - лучше новых двух!:D (с) Народная программерская поговорка

Офлайн

#2 Ноя. 10, 2012 16:52:07

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

input() -> int(raw_input())

И тип проверяется так: isinstance(n, int).

Офлайн

#3 Ноя. 10, 2012 16:54:03

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

Для сравнения типов нужно использовать модуль types. В этом у Вас ошибка…
Например:

import types

if type(a) == types.IntType:



Отредактировано 4kpt (Ноя. 10, 2012 16:54:39)

Офлайн

#4 Ноя. 10, 2012 16:56:41

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

Starting in Python 2.2, built-in factory functions such as int() and str() are also names for the corresponding types. This is now the preferred way to access the type instead of using the types module. Accordingly, the example above should be written as follows:

Офлайн

#5 Ноя. 10, 2012 17:01:14

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

Starting in Python 2.2, built-in factory functions such as int() and str() are also names for the corresponding types. This is now the preferred way to access the type instead of using the types module. Accordingly, the example above should be written as follows:

Буду знать. Осталась старая привычка…



Офлайн

#6 Ноя. 10, 2012 17:05:57

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

По вопросу:

У Вас выполняются все ветви исключения. Цифра 14 может считаться как целым так и дробным числом, а цифра 14.0 считается только дробным.
Чтобы этого избежать, можно вместо второго if поставить elif. Тогда, если число подходит под целый тип, то elif выполнятся не будет…



Отредактировано 4kpt (Ноя. 10, 2012 17:10:19)

Офлайн

#7 Ноя. 10, 2012 17:15:34

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

4kpt
Буду знать. Осталась старая привычка…
Ого! Олдфаг в треде.

Код вообще более чем странный. Если надо определить тип числа, я бы конвертировал в int и float и ловил исключения. input() == eval(raw_input()), а eval - это обычно плохо.

Офлайн

#8 Ноя. 10, 2012 17:21:16

Avond
От: Киев
Зарегистрирован: 2012-11-03
Сообщения: 16
Репутация: +  -1  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

4kpt
По вопросу:У Вас выполняются все ветви исключения. Цифра 14 может считаться как целым так и дробным числом, а цифра 14.0 считается только дробным.Чтобы этого избежать, можно вместо второго if поставить elif. Тогда, если число подходит под целый тип, то elif выполнятся не будет…
Блин… точняк)



Старый баг - лучше новых двух!:D (с) Народная программерская поговорка

Офлайн

#9 Ноя. 10, 2012 17:23:22

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

odnochlen.

Не поддрачивай. Просто я училася по книгам, где указывалась необходимость использования модуля types…

Вот и осталась привычка…

Но это не решает проблему со строкой. Тут вы уже думайте сами… Можно использовать инструкции try - except…



Отредактировано 4kpt (Ноя. 10, 2012 17:24:31)

Офлайн

#10 Ноя. 10, 2012 17:42:50

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Почему интерпретатор путает типы данных?

Вообще odnochlen прав. Прога корявенькая. Строка p = int(n) уже превращает любое данное, введенное в поле ввода в целое число (если только это не строка - тогда генерируется исключение). Я бы здесь перебрал все возможные варианты методами string.atof, string.atoi.



Отредактировано 4kpt (Ноя. 10, 2012 17:46:11)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version