Как я могу сконденсировать оператор ‘for x in range’ в операторе ‘if’ ‘elif’ в операторе ‘while’

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть код, который создает математическую таблицу, и я чувствую, что его можно сократить, поскольку у меня повторяются три одинаковых кода, но с лишь немного разными решениями для каждого из операторов if / elif.

 num=10
x=str(input("Enter Math Operation ( , -, *): "))
while (x != " " and x != "-" and x != "*"):
    x=str(input("tEnter Math Operation: "))
    if x==" ":
        for table in range(1,11):
            print(str(num),str(x),table,"=",num table) 
    elif x=="-":
       for table in range(1,11):
            print(str(num),str(x),table,"=",num-table) 
    elif x=="*":
       for table in range(1,11):
            print(str(num),str(x),table,"=",num*table)
  

Пожалуйста, скажите мне, как можно сжать этот код.

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

1. Вы могли бы создать один цикл for, содержащий if, но это было бы медленнее с большими таблицами. Вы могли бы использовать exec с правильным оператором в виде строки, но это было бы медленно и уязвимо. Вы могли бы передать add, subtract и т.д. функция для цикла, повторяющего список, но это было бы излишне и медленнее. Короче говоря, я думаю, что количество дублирования кода здесь приемлемо. СУХОЙ, но не слишком СУХОЙ…

Ответ №1:

Обычно вы делаете что-то вроде этого:

  • Сохраните оператор как функцию в переменной

  • Используйте словарь для поиска операторов

  • Используйте .format() вместо того, чтобы объединять множество фрагментов строк

  • Не используйте str() , если аргумент уже является строкой

Вот как это выглядит:

 import operator
x = 10
operators = {
    ' ': operator.add,
    '-': operator.sub,
    '*': operator.mul,
}
while True:
    op_name = input('Enter Math Operation ({}): '.format(', '.join(operators)))
    op_func = operators.get(op_name)
    if op_func is not None:
        break
for y in range(1, 11):
    print('{} {} {} = {}'.format(x, op_name, y, op_func(x, y)))
  

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

1. Черт возьми, это намного лучшее качество, чем некоторые из предыдущих ответов (и я являюсь автором одного)! Это разница между тем, кто знает python, и тем, кто является настоящим экспертом.

Ответ №2:

Вы можете использовать таблицу поиска для хранения различных функций

 num=10
x=str(input("Enter Math Operation ( , -, *): "))
while (x != " " and x != "-" and x != "*"):
    x=str(input("tEnter Math Operation: "))
ops = {
    ' ': lambda x, y: x y,
    '-': lambda x, y: x-y,
    '*': lambda x, y: x*y}

fn = ops[x]
for table in range(1,11):
    print(str(num),str(x),table,"=",fn(num,table))
  

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

1. Он мог бы, но вы бы сделали это в этом простом случае?

2. @JacquesdeHooge Я мог бы и не делать этого, но я надеюсь, что рецензент кода обратит мое внимание на тот факт, что я повторил две строки кода три раза — этого достаточно, чтобы вызвать DRY на мой взгляд. Я бы, конечно, исправил это, если бы они это сделали.

3. Это лучший ответ, чем мой — таблица, а не цепочка elif, намного элегантнее.

4. @JacquesdeHooge 1. Дорогостоящий бит — это «печать». 2. Производительность не является проблемой, пока измерение не скажет вам, что это так (ясность важнее преждевременной оптимизации. 3. Если производительность действительно является проблемой, python, вероятно, является неправильным языком для этого бита.

5. Я отошел от предположения, что эти списки могут также содержать миллион элементов… И я согласен, что ясность важнее преждевременной оптимизации. Только я думаю, что использование таблицы в этом тривиальном случае не способствует ясности. Кстати, если количество операторов увеличится, я бы выбрал табличное решение. 😉

Ответ №3:

Функции — это объекты первого класса в python. Назначьте нужную функцию переменной, а затем используйте ее.

 num=10
x=str(input("Enter Math Operation ( , -, *): "))
# Read operation
while (x != " " and x != "-" and x != "*"):
    x=str(input("tEnter Math Operation: "))
# Select appropriate function
if x==" ":
    op = lambda x, y : x   y
elif x=="-":
    op = lambda x, y : x - y
elif x=="*":
    op = lambda x, y : x * y

# Use function
for table in range(1,11):
    val = op(num, table)
    print(str(num), str(x),table,"=", val)
  

Ответ №4:

 # building a math table-machine

Y = int(input('ENTER A VALUE TO GET A TABLE: '))   # Type a multiplier


B = int()      # Taking B and x as an integer, B is our multiplicand 
x = int()      # x is our product (Y multiplies with B to give x)

while Y <= 10 and B <= 10 and x <= 100:       # choose length and width of the table you want.

    print(f'{Y} times {B} is {x}')    # formatting 
    x  = Y     # Adding Y(multiplier) with x(product) resulting in forming a table. 
    B  = 1      # loop completed! ready to work.

print('made your homework easy chump!')
  

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

1. Я уверен, что сообществу помогло бы, если бы вы объяснили нам, почему ваш код решит проблему OP