#python #python-3.x
#python #python-3.x
Вопрос:
Я пытался решить случайную проблему, я использовал созданное мной отношение, когда я пришел к его реализации на python, это дало мне результаты, отличные от тех, которые я рассчитал, поэтому я попытался изменить.
дело в том, что я не понимаю, как python видит каждое из них !!?
- эти два выражения здесь иногда дают разные результаты:
((column 1)//2) * ((row 1)//2)
= (column 1)//2 * (row 1)//2
- Вот пример:
rows, columns = 4, 4
for row in range(2, rows 1):
for column in range(1, columns 1):
print('*'*15)
result = ((column 1)//2) * ((row 1)//2)
f_result = (column 1)//2 * (row 1)//2
print('>> normal expression:', (column 1)//2, (row 1)//2)
print('>> second expression:', ((column 1)//2), ((row 1)//2))
print('>> row:', row)
print('>> column:', column)
print('>> Results:', result, f_result)
print()
- Последние две записи в результатах:
***************
>> normal expression: 2 2
>> second expression: 2 2
>> row: 4
>> column: 3
>> Results: 4 5
***************
>> normal expression: 2 2
>> second expression: 2 2
>> row: 4
>> column: 4
>> Results: 4 5
Комментарии:
1. Да, и это нормально при использовании целочисленного деления. Если вы не хотите использовать целочисленное деление, используйте
/
, not//
.2. но я не могу понять, что происходит!!
3. теперь я понял, ответ, приведенный ниже, помог мне
4. Лучшее название помогло бы сделать ответ на вопрос полезным для других людей. Прямо сейчас, кто-то, видящий этот заголовок, не будет знать, что его ответ поможет им, даже если у них действительно есть такая же проблема.
5. … заголовок, который более эффективно связывает вопрос с вашей конкретной технической проблемой, может быть примерно таким: «Почему 2 * 5 // 2 оцените на 5 вместо 4?»
Ответ №1:
Сначала вам нужно понять приоритет оператора, чтобы проверить эту ссылку
Теперь для выражения
((col 1)//2) * ((row 1)//2) = (col 1)//2 * (row 1)//2
((col 1)//2) * ((row 1)//2) = ((4 1)//2) * ((4 1)//2)
= (5//2)*(5//2)
= 2 * 2
= 4
(col 1)//2 * (row 1)//2 = (4 1)//2 * (4 1)//2
= 5//2 * 5//2
= 2 * 5//2
= 10//2 (as * has higher precedence over //)
= 5