当我尝试将一个整数乘以一个字典值(也是一个整数)时,它给出了一个毫无意义的答案

When I try to multiply an integer by a dictionary value (also an integer), it gives an answer that makes no sense

当我 运行 程序并输入值 3、1、1 时,将一杯转换为汤匙,它使用底部的 TOtbsp 函数。出于故障排除的目的,我让它在最终结果之前打印出四个变量。这些变量都打印出了正确的结果,

def TOtbsp ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: tablespoons')
    dictEnt = dCallOne['tbsp']
    print (dCallOne['tbsp'])
    print (dCallOne)
    print (dictEnt)
    print (convFactor)
    calc = convFactor * dictEnt
    print(calc)

^就是这个TOtbsp函数,出来的是这样的:

将杯子转换为:汤匙

16
{'tbsp': 16, 'tsp': 48, 'quart': 0.25, 'floz': 8.32674, 'pint':0.5,'gal':0.0625, 'ml': 236.588, 'liter': 0.236588}
16
1
1111111111111111

这些都是正确的,除了最后一个 calc。我试过几种不同的设置方式:

calc = convFactor * dictEnt
calc = (convFactor * dictEnt)
calc = (convFactor * dCallOne['tbsp'])
calc = (convFactor * (dCallOne['tbsp'])
(convFactor * dictEnt) = calc
(convFactor * (dCallOne['tbsp']) = calc
convFactor * dictEnt = calc
(convFactor * dCallOne['tbsp']) = calc

据我所知,所有这些,也许除了最后四个,应该得到正确答案,因为 convFactordictEntdCallOne 都得到整数。

完整代码如下。

import os

tbsp = {'tbsp' : 1 ,
        'cup' : 0.0625 ,
        'tsp' : 3 ,
        'quart' : 0.015625 ,
        'floz' : 0.5 ,
        'pint' : 0.03125 ,
        'gal' : 0.00390625 ,
        'ml' : 14.7868 ,
        'liter' : 0.0147868}
tsp = {'cup' : 0.0208333 , 'tbsp' : 0.333333 , 'quart' : 0.0052083333 , 'floz' : 0.1666666667 , 'pint' :  0.0104166667, 'gal' : 0.00130208323 , 'ml' : 4.92892 , 'liter' : 0.00492892}
dictcups = cups = {'tbsp' : 16 ,
        'tsp' : 48 ,
        'quart' : 0.25 ,
        'floz' : 8.32674 ,
        'pint' : 0.5 ,
        'gal' : 0.0625 ,
        'ml' : 236.588 ,
        'liter' : 0.236588}
quart = {'cup' : 4 , 'tsp' : 192 , 'tbsp' : 64 , 'floz' : 32 , 'pint' : 2 , 'gal' : 0.25 , 'ml' : 946.353 , 'liter' : 0.946353}
floz = {'cup' : 0.125 , 'tsp' : 6 , 'quart' : 0.03125 , 'tbsp' : 2 , 'pint' : 0.0625 , 'gal' : 0.0078125 , 'ml' : 29.5735 , 'liter' : 0.0295735}
pint = {'cup' : 2 , 'tsp' : 96 , 'quart' : 0.5 , 'floz' : 16 , 'tbsp' : 32 , 'gal' : 0.125 , 'ml' : 473.176 , 'liter' : 0.473176}
gal = {'cup' : 16 , 'tsp' : 768 , 'quart' : 4 , 'floz' : 128 , 'pint' : 8 , 'tbsp' : 256 , 'ml' : 3785.41 , 'liter' : 3.78541}
ml = {'cup' : 0.0042267571 , 'tsp' : 0.202884 , 'quart' : 0.00105669 , 'floz' : 0.033814 , 'pint' : 0.00211338 , 'gal' : 0.000264172 , 'tbsp' : 0.067628 , 'liter' : 0.001}
liter = {'cup' : 4.226757063 , 'tsp' : 202.884 , 'quart' : 1.05669 , 'floz' : 33.814 , 'pint' : 2.11338 , 'gal' : 0.264172 , 'ml' : 1000 , 'tbsp' : 67.628}
acceptableInputs = ['1', '2', '3', '4', '5', '6', '7', '8', '9'] #This is used to check if what the user entered is one of the eight acceptable units

def takeUnit1 (): #Figure out what unit the user wants to convert
    global convFactor
    print ('Unit Converter')
    print ('')
    print ('')
    print ('Select the unit you want to convert FROM')
    print ('')
    print ('1 Tbsp - Tablespoon')
    print ('2 Tsp - Teaspoon')
    print ('3 C - Cups')
    print ('4 qt. - Quart')
    print ('5 fl. oz. - Fluid Ounce')
    print ('6 gal. - Gallon')
    print ('7 ml - Milliliter')
    print ('8 L - Liter')
    print ('9 P - Pints')
    convFROM = input('Unit: ')
    convFactor = input('How many?: ')

    if convFROM in acceptableInputs: #Check if input is acceptable
        global convFROMconv
        global dCallOne
        if convFROM == '1':
            convFROMconv = 'Tablespoons'
            dCallOne = tbsp
            takeUnit2()  # Run the function to figure out what unit to convert to

        elif convFROM == '2':
            convFROMconv = 'Teaspoons'
            dCallOne = tsp
            takeUnit2()  # Run the function to figure out what unit to convert to

        elif convFROM == '3':
            convFROMconv = 'Cups'
            dCallOne = dictcups
            takeUnit2()  # Run the function to figure out what unit to convert to

        elif convFROM == '4':
            convFROMconv = 'Quarts'
            dCallOne = quart
            takeUnit2()  # Run the function to figure out what unit to convert to

        elif convFROM == '5':
            convFROMconv = 'Fluid Ounces'
            dCallOne = floz
            takeUnit2()  # Run the function to figure out what unit to convert to

        elif convFROM == '6':
            convFROMconv = 'Gallons'
            dCallOne = gal
            takeUnit2()  # Run the function to figure out what unit to convert to

        elif convFROM == '7':
            convFROMconv = 'Milliliters'
            dCallOne = ml
            takeUnit2()  # Run the function to figure out what unit to convert to

        elif convFROM == '8':
            convFROMconv = 'Liters'
            dCallOne = liter
            takeUnit2()  # Run the function to figure out what unit to convert to

        elif convFROM == '9':
            convFROMconv = 'Pints'
            dCallOne = pint
            takeUnit2()  # Run the function to figure out what unit to convert to

        else:
            print ('')

    else:
        print('That is not an acceptable input, please try again')


def takeUnit2 (): #This function is to figure out what unit the user wants to convert TO
    os.system('cls')
    print ('Select the unit you want to convert TO')
    print ('1 Tbsp - Tablespoon')
    print ('2 Tsp - Teaspoon')
    print ('3 C - Cups')
    print ('4 qt. - Quart')
    print ('5 fl. oz. - Fluid Ounce')
    print ('6 gal. - Gallon')
    print ('7 ml - Milliliter')
    print ('8 L - Liter')
    print ('9 P - Pints')
    convTO = input('Unit: ')

    if convTO in acceptableInputs: #Checking if it is one of the 8 accepted units
        global convTOname #Making convTOconv global
        global TOfunc1
        if convTO == '1': #This whole statement converts the input number to its corresponding name
            convTOname = 'tbsp'
            TOfunc1 = 'TOtbsp'
            TOtbsp()

        elif convTO == '2':
            convTOname = 'tsp'
            TOfunc1 = 'TOtsp'
            TOtsp()

        elif convTO == '3':
            convTOname = 'cup'
            TOfunc1 = 'TOcups'
            TOcup()

        elif convTO == '4':
            convTOname = 'quart'
            TOfunc1 = 'TOquarts'
            TOquart()

        elif convTO == '5':
            convTOname = 'floz'
            TOfunc1 = 'TOfloz'
            TOfloz()

        elif convTO == '6':
            convTOname = 'gal'
            TOfunc1 = 'TOgal'
            TOgal()

        elif convTO == '7':
            convTOname = 'ml'
            TOfunc1 = 'TOml'
            TOml()

        elif convTO == '8':
            convTOname = 'liter'
            TOfunc1 = 'TOliters'
            TOliter()

        elif convTO == '9':
            convTOname = 'pint'
            TOfunc1 = 'TOpint'
            TOpint()


        else: #Statement requires an else, not intended to ever be used
            print ('')

    else:
        print('That is not an acceptable input, please try again')


def TOtbsp ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: tablespoons')
    dictEnt = dCallOne['tbsp']
    print (dCallOne['tbsp'])
    print (dCallOne)
    print (dictEnt)
    print (convFactor)
    calc = convFactor * dictEnt
    print(calc)

def TOtsp ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: teaspoons')
    print (dCallOne)
    calc = dCallOne['tsp']
    print(calc)

def TOcup ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: cups')
    print (dCallOne)
    calc = dCallOne['cup']
    print(calc)

def TOquart ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: quarts')
    print (dCallOne)
    calc = dCallOne['quart']
    print(calc)

def TOfloz ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: fluid ounces')
    print (dCallOne)
    calc = dCallOne['floz']
    print(calc)

def TOml ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: milliliters')
    print (dCallOne)
    calc = dCallOne['ml']
    print(calc)

def TOgal ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: gallons')
    print (dCallOne)
    calc = dCallOne['gal']
    print(calc)


def TOpint ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: pints')
    print (dCallOne)
    calc = dCallOne['pint']
    print(calc)

def TOliter ():
    os.system('cls')
    print ('Convert ' + convFROMconv + ' to: liters')
    print (dCallOne)
    calc = dCallOne['liter']
    print(calc)

takeUnit1()

在 Python 3 中,input() returns a string (even if the user enters a number), and so convFactor = input('How many?: ') will set the value of convFactor to a string. Multiplying a string by a number (as happens in calc = convFactor * dictEnt) simply repeats the string that many times, and so you end up with sixteen 1's. To fix this, use int()convFactor 转换为数字,最好是在调用 input():

之后
convFactor = int(input('How many?: '))

jwodder 已经回答了你的问题:如果你想用它们进行算术运算,你需要将输入的字符串转换为数字。您可以使用 int() 进行转换,但最好使用 float():让用户输入十进制数。

但是,您的程序有 很多 的重复。这不是好的设计。它使程序比需要的更长,并且更难阅读和维护。读者必须弄清楚哪些位应该相同,哪些位应该不同。而当你想要进行修改时,你必须将修改复制到多个地方,这既乏味又容易出错。请参阅维基百科文章 Don't repeat yourself

这是您的程序的更紧凑版本。我所做的主要更改是将所有单独的转换比率字典放入字典字典中。我使用循环来显示单元菜单,而不是单独打印每个单元。我还使用循环来确保我们获得有效的 FROM 单位、有效的转换金额和有效的 TO 单位。

此代码将 运行 在所有主要操作系统上。它是为 Python3 设计的,但很容易为 Python 修改 2.

#!/usr/bin/env python3

''' Volumes conversion calculator 
    See 

    Written by Ari Madian
    Modified by PM 2Ring 2017.03.12
'''

import os

# Clear the terminal. Works on Windows, Mac, and Linux
def clear(clear_cmd='cls' if os.name == 'nt' else 'clear'):
    os.system(clear_cmd)

# Various conversion ratios, in alphabetical order.
conversion_factors = {
    'cup': {'cup': 1, 'floz': 8.32674, 'gal': 0.0625, 'liter': 0.236588,
        'ml': 236.588, 'pint': 0.5, 'quart': 0.25, 'tbsp': 16, 'tsp': 48},
    'floz': {'cup': 0.125, 'floz': 1, 'gal': 0.0078125, 'liter': 0.0295735,
        'ml': 29.5735, 'pint': 0.0625, 'quart': 0.03125, 'tbsp': 2, 'tsp': 6},
    'gal': {'cup': 16, 'floz': 128, 'gal': 1, 'liter': 3.78541,
        'ml': 3785.41, 'pint': 8, 'quart': 4, 'tbsp': 256, 'tsp': 768},
    'liter': {'cup': 4.226757063, 'floz': 33.814, 'gal': 0.264172, 'liter': 1,
        'ml': 1000, 'pint': 2.11338, 'quart': 1.05669, 'tbsp': 67.628, 'tsp': 202.884},
    'ml': {'cup': 0.0042267571, 'floz': 0.033814, 'gal': 0.000264172, 'liter': 0.001,
        'ml': 1, 'pint': 0.00211338, 'quart': 0.00105669, 'tbsp': 0.067628, 'tsp': 0.202884},
    'pint': {'cup': 2, 'floz': 16, 'gal': 0.125, 'liter': 0.473176,
        'ml': 473.176, 'pint': 1, 'quart': 0.5, 'tbsp': 32, 'tsp': 96},
    'quart': {'cup': 4, 'floz': 32, 'gal': 0.25, 'liter': 0.946353,
        'ml': 946.353, 'pint': 2, 'quart': 1, 'tbsp': 64, 'tsp': 192},
    'tbsp': {'cup': 0.0625, 'floz': 0.5, 'gal': 0.00390625, 'liter': 0.0147868,
        'ml': 14.7868, 'pint': 0.03125, 'quart': 0.015625, 'tbsp': 1, 'tsp': 3},
    'tsp': {'cup': 0.0208333, 'floz': 0.1666666667, 'gal': 0.00130208323, 'liter': 0.00492892, 
        'ml': 4.92892, 'pint': 0.0104166667, 'quart': 0.0052083333, 'tbsp': 0.333333, 'tsp': 1},
}

# Valid menu selections are single digits
menu_numbers = '123456789'

#This is used to check if what the user entered is one of the nine acceptable units
acceptable_inputs = set(menu_numbers)

# Convert menu number to conversion ratio key
units = {
    '1': 'tbsp', '2': 'tsp', '3': 'cup', '4': 'quart', '5': 'floz',
    '6': 'gal', '7': 'ml', '8': 'liter', '9': 'pint',
}

# Short & long unit names, in menu order
unit_names = {
    'tbsp': ('Tbsp', 'Tablespoons'),
    'tsp': ('Tsp', 'Teaspoons'),
    'cup': ('C', 'Cups'),
    'quart': ('qt.', 'Quarts'),
    'floz': ('fl. oz.', 'Fluid Ounces'),
    'gal': ('gal.', 'Gallons'),
    'ml': ('ml', 'Milliliters'),
    'liter': ('L', 'Liters'),
    'pint': ('P', 'Pints'),
}

def get_unit():
    # Display the units menu
    for i in menu_numbers:
        key = units[i]
        short_name, long_name = unit_names[key]
        print('{0} {1} - {2}'.format(i, short_name, long_name))

    # Loop until we get an acceptable input
    while True:
        unit_num = input('Unit: ')
        if unit_num in acceptable_inputs:
            break
        print('Please select a unit by its number')
    return units[unit_num]

# Perform the conversion
def convert(from_key, amount, to_key):
    clear()
    from_name = unit_names[from_key][1]
    to_name = unit_names[to_key][1]
    print('Converting {0} to: {1}'.format(from_name, to_name))

    conv_factor = conversion_factors[from_key][to_key]
    calc = amount * conv_factor
    print(calc)

def main():
    print('Unit Converter\n\n')
    print('Select the unit you want to convert FROM\n')
    from_key = get_unit()

    # Get number to convert. Loop until we get a valid number.
    while True:
        try:
            amount = float(input('How many?: '))
            break
        except ValueError:
            print('Bad number. Please try again.')

    print('Select the unit you want to convert TO\n')
    to_key = get_unit()

    convert(from_key, amount, to_key)


if __name__ == '__main__':
    main()