Найти - Пользователи
Полная версия: Калькулятор
Начало » Python для новичков » Калькулятор
1
Umka
Задача не тривиальная, но сломал всю голову. При получении данных из команды input мы получаем тип str. Как сделать так чтобы введеной переменной а или b присвоился тип введенного числа int или float или если буквы то тип str. Далее проходила проверка этих переменных на число. и далее работает цикл. При данном написании он циклится на первом проходе потому что input дает тип данных str.

 s = int(input('stop cherez ')) #число проходов
chet = 1
while chet <= s:
	a = input('a = ')
	b = input('b = ')
	z = input('deystvie: ')
	if type(a) != int or type(a) != float or type(b) != int or type(b) != float : #проверка на число
		print ('nado chislo')
		chet += 1
	elif b == 0 and z == '/' : #Проверка деления на ноль
		print('delenie na 0')
		chet += 1
	elif z not in ('+', '-', '/', '*') : #Проверка на знак
		print('neverniy znak')
		chet += 1
	elif z == '+' :
		c = a + b
		print(c)
		chet += 1
	elif z == '-' :
		c = a - b
		print(c)
		chet += 1
	elif z == '/' :
		c = a / b
		print(c)
		chet += 1
	elif z == '*' :
		c = a * b
		print (c)
		chet += 1
else:
	print('vse hvatit')
doza_and
Umka
Как сделать так чтобы введеной переменной а или b присвоился тип введенного числа int или float
У вводимых данных нет типа. Это всегда строка.
 >>> 2 -- это целое или плавающее?
>>> 2 2 -- А это что? это не буквы но и не числа.
>>> 2м -- А это что? Может это 2 метра?
Вы можете по разному пробовать преобразовывать данные. Например так:
 a=input()
try:
  a=int(a)
except:
  try:
     a=float(a)
  except:
    pass

Если это калькулятор, то я бы целые вообще не рассматривал. Идентификаторы это обычно сохраненные переменные. поэтому вполне работоспособен код

 try:
    val = float(a)
except:
    val = saved_var[a]  # если переменная не запомнена то это ошибка и о ней надо сообщить уловив исключение
# а тут на выходе val всегда плавающее число. И проверять тут дальше нечего
xam1816
 from decimal import Decimal
#
actions = {
    '+': lambda x, y: x + y,
    '-': lambda x, y: x - y
}
#
def num_input(text_before=''):
    while True:
        print(text_before, end='')
        try:
            num = Decimal(input())
            return num
        except:
            print('неверный ввод')
            continue
#
def sign_input(text_before=''):
    print(text_before, end='')
    while (action := input()) and action not in ('+', '-'):
        print('неверный ввод')
    return action
#
if __name__ == '__main__':
    while True:
        a = num_input('a = ')
        b = num_input('b = ')
        sign = sign_input('знак: ')
        result = actions[sign](a, b)
        print(a, sign, b, '=', result)
py.user.next
Umka
При получении данных из команды input мы получаем тип str. Как сделать так чтобы введеной переменной а или b присвоился тип введенного числа int или float или если буквы то тип str.
  
>>> import re
>>> 
>>> def input_value():
...     inumpat = r'^\d+$'
...     fnumpat = r'^\d+\.\d+$'
...     varpat = r'^[a-z]+$'
...     out = None
...     s = input('Enter value: ')
...     if re.search(inumpat, s) is not None:
...         out = ('int', int(s))
...     elif re.search(fnumpat, s) is not None:
...         out = ('float', float(s))
...     elif re.search(varpat, s) is not None:
...         out = ('name', s)
...     else:
...         raise ValueError('Wrong value: ' + s)
...     return out
... 
>>> def f():
...     typ, val = input_value()
...     print(typ, val)
...     typ, val = input_value()
...     print(typ, val)
...     typ, val = input_value()
...     print(typ, val)
...     typ, val = input_value()
...     print(typ, val)
... 
>>> f()
Enter value: 1
int 1
Enter value: 123
int 123
Enter value: 123.456
float 123.456
Enter value: abc
name abc
>>> 
>>> f()
Enter value: +
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in f
  File "<stdin>", line 14, in input_value
ValueError: Wrong value: +
>>>
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