РЕДАКТИРОВАТЬ: На самом деле, range
- это функция, которая обычно используется в итарации для генерации чисел. Итак, когда вы пишете if n in range(min_value, max_value)
, эта функция генерирует все целые числа, пока не найдет совпадение или не достигнет значения max_value .
Тип range
представляет собой неизменяемую последовательность чисел и обычно используется для зацикливания определенное количество раз в for
петлях.
Вместо записи:
if n in range(int(1e-10),int(9e-8)):
return n/0.000000001 , 'nm'
вы должны написать:
if 1e-10 <= n < 9e-8:
return n/0.000000001 , 'nm'
Также имейте в виду, что range
работает только с целыми числами, а не с плавающей точкой.
Больше EDIT:
Для вашего конкретного случая использованияВы можете определить словарь пар * (значение, символ), как показано ниже:
import collections
symbols = collections.OrderedDict(
[(1e-12, u'p'),
(1e-9, u'n'),
(1e-6, u'μ'),
(1e-3, u'm'),
(1e-2, u'c'),
(1e-1, u'd'),
(1e0, u''),
(1e1, u'da'),
(1e2, u'h'),
(1e3, u'k'),
(1e6, u'M'),
(1e9, u'G'),
(1e12, u'T')])
Используйте функцию bisect.bisect
, чтобы найти точку вставки вашего значения вчто заказал коллекцию.Эту точку вставки можно использовать для получения упрощенного значения и используемого символа SI.
Например:
import bisect
def convert_to_si(value):
if value < 0:
value, symbol = convert_to_si(-value)
return -value, symbol
elif value > 0:
orders = list(symbols.keys())
order_index = bisect.bisect(orders, value / 10.0)
order = orders[min(order_index, len(orders) - 1)]
return value / order, symbols[order]
else:
return value, u""
Демонстрация:
for value in [1e-12, 3.14e-11, 0, 2, 20, 3e+9]:
print(*convert_to_si(value), sep="")
Вы получаете:
1.0p
0.0314n
0
2.0
2.0da
3.0G
Вы можете адаптировать эту функцию к вашим потребностям ...