Найти - Пользователи
Полная версия: Кто знает каk делать в Pyton функцию adder(i, j)
Начало » Python для экспертов » Кто знает каk делать в Pyton функцию adder(i, j)
1 2
FishHook
Isem
Не вижу разницы.
А она есть
>>> 0 is False
False
Isem
FishHook
>>> 0 is False
False
так и
>>> 0 is 0.0
False

Хотя, казалось бы?

Но, тем не менее
>>> 0==False
True
>>> 0 == 0.0
True

Чудеса.
FishHook
Isem
Хотя, казалось бы?
В смысле казалось бы? Целое число и число с плавающей точкой - это такие разные вещи, что мне даже как-то стыдно вам про это говорить.
Isem
FishHook
В смысле казалось бы? Целое число и число с плавающей точкой - это такие разные вещи, что мне даже как-то стыдно вам про это говорить.

Не стыдитесь, говорите как есть. )
Я уверен, что вы прекрасно знаете разницу. Давайте уточню свою мысль по поводу “не вижу разницу”: в арифметическом смысле, что и требовалось, а не в смысле ссылок, что есть float, int или bool, где value, а не id(value) важно. Предлагаю вообще здесь перейти на D. (шутка).


FishHook
Да блин же! Мы же не со школьной арифметикой имеем дело, а с объектно ориентированным языком программирования, реализующим концепцию “всё есть объект”. Вы пытаетесь спорить с очевидными утверждениями. Вам не нравится фраза “False и 0 - это разные вещи”, но это разные вещи, это объекты разных классов.
 >>> type(False)
<type 'bool'>
>>> type(0)
<type 'int'>
>>>
Isem
FishHook
Да блин же! Мы же не со школьной арифметикой имеем дело, а с объектно ориентированным языком программирования, реализующим концепцию “всё есть объект”. Вы пытаетесь спорить с очевидными утверждениями. Вам не нравится фраза “False и 0 - это разные вещи”, но это разные вещи, это объекты разных классов.

Верно, но оператором is мы сравниваем не классы, а объекты. То есть 1 is 2 тоже False.
False и 0 - да, разные классы и разные объекты, 0 и 0.0 - то же самое. Но мы имеем дело не только с объектно-ориентированным языком, но еще и с динамической типизацией. А в данном случае мы имеем дело как раз с арифметикой (не понимаю, что значит школьная). В питоне True и False - это обычные числа (и не только в питоне, кстати), с точки зрения арифметики, равные, соответственно, 1 и 0.
FishHook
Isem
То есть 1 is 2 тоже False.
Разумеется, покажите мне человека, который будет спорить с утверждение, что “1 и 2 - это разные вещи”.
Isem
0 и 0.0 - то же самое.
Нет, не то же самое. У них даже дир разный
 >>> dir(0)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
>>> dir(0.0)
['__abs__', '__add__', '__class__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__eq__', '__float__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getformat__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__int__', '__le__', '__long__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__nonzero__', '__pos__', '__pow__', '__radd__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rsub__', '__rtruediv__', '__setattr__', '__setformat__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', 'as_integer_ratio', 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real']
>>>

А в данном случае мы имеем дело как раз с арифметикой
В данном случае мы имеем дело со спором ради спора. Хотите я вам покажу объект который дает True при сравнении вообще хоть с чем?
Вуаля!
 class A:
    def __eq__(self, other):
        return True
a = A()
print(a == "dfssd")
>>True
Теперь можете начинать утверждать, что объект `a` и случайная строка - одно и тоже, по вашей логике это именно так.
Isem
FishHook
азумеется, покажите мне человека, который будет спорить с утверждение, что “1 и 2 - это разные вещи”.
Раз пошла такая пьянка, то я могу показать человека, что 1 и 2 - это одно и то же.
FishHook
Нет, не то же самое. У них даже дир разный
Разве я не говорил, что это разные классы? Чему же тут удивляться?

FishHook
В данном случае мы имеем дело со спором ради спора.

Собственно, вот и ответ. Но я могу продолжать бесконечно.

FishHook
Теперь можете начинать утверждать, что объект `a` и случайная строка - одно и тоже, по вашей логике это именно так.

Это не моя логика, а ваше, так сказать, утверждение.

Мы друг-друга понимаем, а остановиться не можем. Я предлагаю остановиться и потратить наши усилия на что-то более полезное. Например, на то, чтобы такие вещи, как lambda x: 10 сделать inline (при вызове этой функции) в прямом смысле этого слова. Хотя что мы решаем?)
py.user.next
Isem
Не вижу разницы.
False и True - это числа, так как bool - тип, производный от int. Но это сделано только для того, чтобы к этим значениям можно было применять числовые функции.

Да, они взаимозаменяемы, пока ты не напорешься на что-нибудь подобное
  
>>> def f(n):
...     if isinstance(n, bool):
...         if n:
...             print('bingo!')
...         else:
...             print('nope')
...     else:
...         print(n ** 2 + 1)
... 
>>> f(True)
bingo!
>>> f(1)
2
>>> f(100)
10001
>>> f(False)
nope
>>> f(0)
1
>>>
Когда ты подал якобы то значение в чью-то чужую функцию, содержимое которой ты не знаешь, она выдала совсем не тот результат.

А теперь мы берём и подаём в эту функцию с твоего adder'а (adder_b) и с моего adder'а (adder_i) и видим разницу
  
>>> def f(n):
...     if isinstance(n, bool):
...         if n:
...             print('bingo!')
...         else:
...             print('nope')
...     else:
...         print(n ** 2 + 1)
... 
>>> def adder_b(m, n):
...     return m <= n and (n + m) * (n - m + 1) // 2
... 
>>> def adder_i(m, n):
...     return (n * n - m * m + n + m) // 2 if m <= n else 0
... 
>>> f(adder_b(1, 100))
25502501
>>> f(adder_b(100, 1))
nope
>>> 
>>> f(adder_i(1, 100))
25502501
>>> f(adder_i(100, 1))
1
>>>
Твой adder нихрена не применим в этой ситуации, а мой применим. Вот и вся разница. Теперь сиди и пиши переходник (адаптер) к своему adder'у, либо ИСПРАВЛЯЙ его на то, что должно было быть изначально.

Это я ещё из функции f ничего не возвращал, а ведь мог бы и возвращать, и там бы этот nope нафиг не упёрся никому. Так что тут и второй адаптер понадобится ещё - для возвращаемого значения.

Дальше ставим твою программу на истребитель - и он падает нафиг, потому что на улице пошёл дождь.
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