我怎样才能让这个程序更高效、更短、更简单?
How can I make this program more efficient, short, and less complex?
我制作了一个 Python 程序,它从用户那里获取任何数字(无论是浮点数),然后 Python 打印 1 和该数字之间的所有数字。例如,如果我输入 12.5,那么 Python 将显示 1,2,3,4,5,6,7,8,9,10,11,12,12.1,12.2,12.3,12.4
相同的代码如下:
import math
from decimal import *
user_input = float(input("Enter a number(upto one decimal place): "))
frac, whole = math.modf(user_input) # frac doesn't give the exact decimal value. For ex. 0.3 = 0.299999999999999999998
frac_actual = Decimal(str(user_input)) % 1
# Decimal also doesn't give the exact value if we give the parameter as a float, but we can give string float as a parameter(because it gives exact value), with which we can perform the desired operations
if user_input > 0:
if user_input % 1 == 0:
print(f"All the numbers between 0 and {int(user_input)} are: ", end='')
print(*range(1, int(whole) + 1), sep=',', end='')
frac_str = str(frac_actual) # will convert Decimal('0.something') to ('0.something')
decimal = int(frac_str[2])
else:
print(f"All the numbers between 0 and {user_input} are: ", end='')
print(*range(1, int(whole) + 1), sep=',', end='')
frac_str = str(frac_actual) # will convert Decimal('0.something') to ('0.something')
decimal = int(frac_str[2])
generator_object = (whole + i / 10 for i in range(1, decimal))
unpacked_generator_object = [*generator_object]
string_generator_object = ','.join(map(str, unpacked_generator_object))
print("," + string_generator_object)
elif user_input == 0:
print("Sorry, numbers between 0 and 0 can't be displayed.")
else:
while user_input < 0:
print("Please enter a positive number or 0.")
user_input = float(input("Enter a number(upto one decimal place): "))
# frac doesn't give the exact decimal value. For ex. 0.3 = 0.299999999999999999998
frac, whole = math.modf(user_input)
frac_actual = Decimal(str(user_input)) % 1
# Decimal also doesn't give the exact value if we give the parameter as a float, but we can give string float as a parameter(because it gives exact value), with which we can perform the desired operations
if user_input % 1 == 0:
print(f"All the numbers between 0 and {int(user_input)} are: ", end='')
print(*range(1, int(whole) + 1), sep=',', end='')
# will convert Decimal('0.something') to ('0.something')
frac_str = str(frac_actual)
decimal = int(frac_str[2])
else:
print(f"All the numbers between 0 and {user_input} are: ", end='')
print(*range(1, int(whole) + 1), sep=',', end='')
# will convert Decimal('0.something') to ('0.something')
frac_str = str(frac_actual)
decimal = int(frac_str[2])
generator_object = (whole + i / 10 for i in range(1, decimal))
unpacked_generator_object = [*generator_object]
string_generator_object = ','.join(map(str, unpacked_generator_object))
print("," + string_generator_object)
其输出如下:
Enter a number(upto one decimal place): 15.7
All the numbers between 0 and 15.7 are: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15.1,15.2,15.3,15.4,15.5,15.6
它的第二个输出:
Enter a number(upto one decimal place): 15
All the numbers between 0 and 15 are: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
但是程序的代码太复杂了。那么,有没有更好的方法可以用更少的代码行更高效地完成同样的操作呢?
更新#1
@Abhishek 给出了一个近乎完美的答案。稍微修改后,它看起来像这样:
from decimal import *
def between_nums(n):
frac = float(str(Decimal(str(n)) % 1))
l = []
for x in range(1, int(n) + 1):
l.append(x)
for i in [l[-1] + x / 10 for x in range(1, int(frac * 10))]:
l.append(i)
str_list = ", ".join(map(str, l))
if user_input % 1 == 0:
print(f"All the numbers between 0 and {int(user_input)} are: ", str_list)
else:
print(f"All the numbers between 0 and {user_input} are: ", str_list)
return l
user_input = float(input("Enter a number: "))
between_nums(user_input)
你可以试试这个。如果您不介意列表中的数据,您
def between_nums(n):
exp = n % 1
l = []
for x in range(int(n)+1):
l.append(x)
for i in [l[-1]+x / 10 for x in range(0,int(exp*10))]:
l.append(i)
return l
print(between_nums(12.5))
我得到的输出是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12.0, 12.1, 12.2, 12.3, 12.4]
我制作了一个 Python 程序,它从用户那里获取任何数字(无论是浮点数),然后 Python 打印 1 和该数字之间的所有数字。例如,如果我输入 12.5,那么 Python 将显示 1,2,3,4,5,6,7,8,9,10,11,12,12.1,12.2,12.3,12.4 相同的代码如下:
import math
from decimal import *
user_input = float(input("Enter a number(upto one decimal place): "))
frac, whole = math.modf(user_input) # frac doesn't give the exact decimal value. For ex. 0.3 = 0.299999999999999999998
frac_actual = Decimal(str(user_input)) % 1
# Decimal also doesn't give the exact value if we give the parameter as a float, but we can give string float as a parameter(because it gives exact value), with which we can perform the desired operations
if user_input > 0:
if user_input % 1 == 0:
print(f"All the numbers between 0 and {int(user_input)} are: ", end='')
print(*range(1, int(whole) + 1), sep=',', end='')
frac_str = str(frac_actual) # will convert Decimal('0.something') to ('0.something')
decimal = int(frac_str[2])
else:
print(f"All the numbers between 0 and {user_input} are: ", end='')
print(*range(1, int(whole) + 1), sep=',', end='')
frac_str = str(frac_actual) # will convert Decimal('0.something') to ('0.something')
decimal = int(frac_str[2])
generator_object = (whole + i / 10 for i in range(1, decimal))
unpacked_generator_object = [*generator_object]
string_generator_object = ','.join(map(str, unpacked_generator_object))
print("," + string_generator_object)
elif user_input == 0:
print("Sorry, numbers between 0 and 0 can't be displayed.")
else:
while user_input < 0:
print("Please enter a positive number or 0.")
user_input = float(input("Enter a number(upto one decimal place): "))
# frac doesn't give the exact decimal value. For ex. 0.3 = 0.299999999999999999998
frac, whole = math.modf(user_input)
frac_actual = Decimal(str(user_input)) % 1
# Decimal also doesn't give the exact value if we give the parameter as a float, but we can give string float as a parameter(because it gives exact value), with which we can perform the desired operations
if user_input % 1 == 0:
print(f"All the numbers between 0 and {int(user_input)} are: ", end='')
print(*range(1, int(whole) + 1), sep=',', end='')
# will convert Decimal('0.something') to ('0.something')
frac_str = str(frac_actual)
decimal = int(frac_str[2])
else:
print(f"All the numbers between 0 and {user_input} are: ", end='')
print(*range(1, int(whole) + 1), sep=',', end='')
# will convert Decimal('0.something') to ('0.something')
frac_str = str(frac_actual)
decimal = int(frac_str[2])
generator_object = (whole + i / 10 for i in range(1, decimal))
unpacked_generator_object = [*generator_object]
string_generator_object = ','.join(map(str, unpacked_generator_object))
print("," + string_generator_object)
其输出如下:
Enter a number(upto one decimal place): 15.7
All the numbers between 0 and 15.7 are: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15.1,15.2,15.3,15.4,15.5,15.6
它的第二个输出:
Enter a number(upto one decimal place): 15
All the numbers between 0 and 15 are: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
但是程序的代码太复杂了。那么,有没有更好的方法可以用更少的代码行更高效地完成同样的操作呢?
更新#1 @Abhishek 给出了一个近乎完美的答案。稍微修改后,它看起来像这样:
from decimal import *
def between_nums(n):
frac = float(str(Decimal(str(n)) % 1))
l = []
for x in range(1, int(n) + 1):
l.append(x)
for i in [l[-1] + x / 10 for x in range(1, int(frac * 10))]:
l.append(i)
str_list = ", ".join(map(str, l))
if user_input % 1 == 0:
print(f"All the numbers between 0 and {int(user_input)} are: ", str_list)
else:
print(f"All the numbers between 0 and {user_input} are: ", str_list)
return l
user_input = float(input("Enter a number: "))
between_nums(user_input)
你可以试试这个。如果您不介意列表中的数据,您
def between_nums(n):
exp = n % 1
l = []
for x in range(int(n)+1):
l.append(x)
for i in [l[-1]+x / 10 for x in range(0,int(exp*10))]:
l.append(i)
return l
print(between_nums(12.5))
我得到的输出是:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12.0, 12.1, 12.2, 12.3, 12.4]