Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Почему не работает if x % 2: --x?

#python #python_3x


Если число нечётное, то уменьшить его на единицу - что неверно в следующем способе?

if x % 2: --x


Код полностью: https://ideone.com/SLZsrn

import random

def gen_smth():
  x = random.randint(0, 100)
  if x % 2: --x
  return x

for _ in range(100):
  print(gen_smth())


В выводе содержатся нечётные числа, хотя должны были получиться только чётные:

64
11
37
35
1

    


Ответы

Ответ 1



В Python нету --x, как и x--, вместо них стоит использовать x -= 1 Ну и как Qwertiy сказал в комментариях, запись if True: --x работает, потому что здесь - используется в качестве унарного минуса Может показаться странным, что --x является statement в Python, но если обратиться к формальному определению statement, то получаем следующую цепочку: simple_stmt → expression_stmt → starred_expression → expression → conditional_expression → or_test → and_test → not_test → comparison → or_expr → xor_expr → and_expr → shift_expr → a_expr → m_expr → u_expr, где u_expr включает в себя унарные выражения.

Ответ 2



Чтобы увидеть как фактически код интерпретируется на выбранной версии СPython, можно tokenize, dis модули использовать: $ python -mtokenize <<<'--x' 1,0-1,1: OP '-' 1,1-1,2: OP '-' 1,2-1,3: NAME 'x' 1,3-1,4: NEWLINE '\n' 2,0-2,0: ENDMARKER '' то есть каждый - это отдельный оператор: $ python -mdis <<<'--x' 1 0 LOAD_NAME 0 (x) 2 UNARY_NEGATIVE 4 UNARY_NEGATIVE 6 POP_TOP 8 LOAD_CONST 0 (None) 10 RETURN_VALUE а именно - является унарным минусом здесь: -(-x). x-- это SyntaxError в Питоне. Чтобы вычесть единицу по месту в Питоне: x -= 1 Чтобы выбрать случайное чётное число от 0 до 100 включительно: >>> import random >>> random.choice(range(0, 101, 2)) 42

Комментариев нет:

Отправить комментарий