簡體   English   中英

如何在Python中壓縮一堆函數?

[英]How to condense a bunch of functions in Python?

因此,我試圖編寫一個程序來轉換單位,以便避免在物理課中使用因子標簽方法。 我已經找到了它的通用代碼,但是到最后,我將定義35個函數。 下面是我到目前為止擁有的代碼,每個單元我都希望能夠在上面進行轉換。 在這些值的正下方是使用這些單位進行的每種可能的轉化。 問題是我不希望為每個可能的轉換都創建函數。 到目前為止,我已經完成的代碼僅適用於其中一些單元,但是可以在此鏈接的小飾品中找到它:

             # km  &  m  &  cm  &  mm  &  M  &  ft  &  In 
#km to m   |  m to km  |  cm to km  |  mm to km  |  M to km  |  ft to km  |  In to km
#km to cm  |  m to cm  |  cm to m   |  mm to m   |  M to m   |  ft to m   |  In to m
#km to mm  |  m to mm  |  cm to mm  |  mm to cm  |  M to cm  |  ft to cm  |  In to cm
#km to M   |  m to M   |  cm to M   |  mm to M   |  M to mm  |  ft to mm  |  In to mm
#km to ft  |  m to ft  |  cm to ft  |  mm to ft  |  M to ft  |  ft to M   |  In to M
#km to In  |  m to In  |  cm to In  |  mm to In  |  M to In  |  ft to In  |  In to ft



def km_to_M_conv():
  km=float(input("How many km?"))
  result = km * .621371192
  sentence = '{} km is equal to {} M.'.format(km, result)
  print sentence

def M_to_km_conv():
  M=float(input("How many m?"))
  result = M * 1.60934
  sentence = '{} M is equal to {} km.'.format(M, result)
  print sentence

def km_to_m_conv():
  km=float(input("How many km?"))
  result = km * 1000
  sentence = '{} km is equal to {} m.'.format(km, result)
  print sentence

def mm_to_cm_conv():
  mm=float(input("How many mm?"))
  result = mm * .1
  sentence = '{} mm is equal to {} cm.'.format(mm, result)
  print sentence

def cm_to_mm_conv():
  cm=float(input("How many cm?"))
  result = cm * 10
  sentence = '{} cm  is equal to {} mm.'.format(cm, result)
  print sentence

welcome=input("What would you like to convert?")
if welcome == ("mm to cm"):
  mm_to_cm_conv()
if welcome == ("cm to mm"):
  cm_to_mm_conv()
if welcome == ("km to M"):
  km_to_M_conv()
if welcome == ("M to km"):
  M_to_km_conv()

我對Python還是很陌生,所以請多多包涵。 謝謝!

分解出通用代碼:

def converter(source, target, factor):
  qty = float(input("How many %s?"))
  result = qty * factor
  print '{} {} is equal to {} {}.'.format(qty, source, result, target)

def km_to_miles(km):
   converter('km', 'miles', 0.621371)

更新:

如果您想變得真正聰明,可以動態生成如下函數:

CONVERSIONS = (
    ('km', 'miles', 0.621371),
    ('metres', 'feet', 3.28084),
    ('litres', 'gallons', 0.264172),
)

for from, to, factor in CONVERSIONS:
    func_name = '%s_to_%s' % (from, to)
    func = lambda x: x * factor
    globals()[func_name] = func

    reverse_func_name = '%s_to_%s' % (to, from)
    reverse_func = lambda x: x * (1 / factor)
    globals()[reverse_func_name] = reverse_func

我會選擇一個標准長度(可能是米)並保留一本字典(如果您不知道字典是什么,那么請查一下它們,因為它們非常有用,請稍作練習)存儲每個單元的時間標准單位。 例如:

conversion_factors_dict = {'m': 1,
                           'cm': 0.01,
                           'ft':0.305}

然后,您的函數必須采用數字,“來源”單元和“目的地”單元。 您首先將源單位轉換為標准(米),然后將其轉換為目標單位。 例如:

def convert(number, source, destination, conversion_factors_dict):
    input_in_metres = number * conversion_factors_dict[source]
    input_in_destination_units = input_in_metres / conversion_factors_dict[destination]
    return "{}{} = {}{}".format(number, source, input_in_destination_units, destination)

解決此問題的更好方法可能是通過在字典下創建針對選擇的所有因素分組,然后根據用戶輸入調用鍵的相應值。 它可以可視化為:

factors = {'mm to cm' : 0.1, 'cm to mm' : 10, 'km to M' : .621371192} # You may like to define more conversion factors here

welcome = input("What would you like to convert?")
frm, _, to = welcome.split()
distance = input("How many "+frm+" ?")

print (str(distance)+frm+' is equal to ' +str(float(distance)*factors[welcome])+ to

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM