Найти - Пользователи
Полная версия: Не работает условие, либо не сохраняются значения!
Начало » Python для новичков » Не работает условие, либо не сохраняются значения!
1
ingushet
Здравствуйте!
Имеется класс:
class Tochki(object):
    d = 0;
    s = 0;
Создаю массив экземпляров этого класса:
m6=[Tochki() for each in range(2003001)]

Заполняю атрибуты для каждого объекта:
sh=52.2378+0.0001;k=0.0001;
dl=103.9847-0.0001;k1=0.0001;
n=0;
for i in range(1001):
    for j in range(2001):
        m6[j+n].s=sh-k;
        m6[j+n].d=dl+k1;
        k1=k1+0.0001;
    k=k+0.0001;
    n=n+2001;
    k1=0.0001;

Проверяю верно ли внес значения:
h=0;
for i in range(1001):
    print m6[h].s
    h=h+2001
Выводит все верно.
Пытаюсь найти значение 52.1791:
for i in range(2003001):
    if m6[i].s==52.1791:
       print i
Он ничего не находит, хотя когда вывожу на экран весь массив это значение есть. Может условие по другому поставить?
FishHook
Тебе же позавчера уже все объяснили, про атрибуты класса и атрибуты объекта.
Уже уже тупость какая-то.
ingushet
это работало с массивом, с обычными значениями не работает!
Вот код, здесь я создал массив вне класса:
m=range(1001);
sh=52.2378+0.0001;k=0.0001;
n=0;
for i in range(1001):
    for j in range(2001):
        k1=k1+0.0001;
    m[i]=sh-k;
    k=k+0.0001;
    n=n+2001;
  
Делаю вывод:
print m[587]

Он выводит 52.1791.
Тут же делаю условие:
if m[587]==52.1791:print "dfgsdfg"

Он ничего не выводит!
Edinonog
Потому что это всё очень похоже на троллинг.
Если нет, то используйте это:
if m[587] == 52.179+0.0001:
print "dfgsdfg"
ingushet
Спасибо заработало, а почему не работало:
if m[587]==52.1791:print "dfgsdfg"
Edinonog
Потому что арифметика чисел с плавающей точкой иногда бывает весьма коварной штукой. Например первоначальный код заработал бы при условии:

if m[587] == 52.17910000000000536601874046027660369873046875:
     print "dfgsdfg"

Для того чтобы узнать “истинное” значение можно воспользоваться:
import decimal
m = range(1001)
sh = 52.2378 + 0.0001
k = 0.0001
k1 = 0.0001
n = 0
for i in range(1001):
    for j in range(2001):
        k1 = k1 + 0.0001
    m[i] = sh - k
    k = k + 0.0001
    n = n + 2001
print m[587]
a = decimal.Decimal(m[587])
if m[587] == a:
    print "dfgsdfg"

Ссылка на документацию по этой теме: http://docs.python.org/2/tutorial/floatingpoint.html
ingushet
Сделал так:
if round(m1[587],4)==52.1791:
       print "dkfbvkdfvblsdfvblskfd"
Работает
bw
> Работает
Потому что повезло, а не потому что правильно сделал. Ну это же первый класс, ну нельзя так делать. Читай про вещественные числа в выч. технике.
Всегда исходи из того что, есть ещё один знак, которого ты не видишь, десятый или сотый после запятой и никогда не используй проверку на равенство вещественных числел. Исключением может быть ноль, но я бы не советовал.
if int(m1[587] * 10000) == 521791:
    print 'Учи матчасть'

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB