使用更少的代码行是否更具pythonic功能?

时间:2018-10-16 10:35:14

标签: python list dictionary

我想出了两种方法来做同一件事,并且想知道哪种更好,为什么呢。

输入=邮政包裹重量

输出=最便宜的运输方式和价格(字符串)

以下方法采用1个参数“ weight”,用于比较“ Ground”,“ Drone”和“ Premium”的定价,然后返回给出最便宜运输方式和价格的字符串。 (程序中较早的方法是为“ ground_rate(weight)”和“ drone_rate(weight)”定义的。prem_groud_rate是一个常量浮点值。)

第一种使用字典的方式:

def shipping_method_determiner(weight):
  prices = {"Ground": ground_rate(weight), "Drone": drone_rate(weight), "Premium" : prem_ground_rate}
  cheapest_method = (list(prices.keys())[list(prices.values()).index(sorted(prices.values())[0])])
  return (("%s is the cheapest method.\n\n" % cheapest_method) + ("The total cost will be %.2f.\n" % sorted(prices.values())[0]))

第二种方法最终使用元组列表:

def shipping_method_determiner(weight):
  method_list = ["Ground", "Drone", "Premium"]
  price_list = [ground_rate(weight), drone_rate(weight), prem_ground_rate]
  min_price = min(price_list)
  method_with_price = list(zip(method_list, price_list))
  best_method = (method_with_price[price_list.index(min_price)][0])
  return "%s is the cheapest method.\n\nThe total cost will be %.2f \n" % (best_method, min_price)

第一种方法仅使用4行,但似乎很难阅读。第二种方法更易于阅读,但几乎是行数的两倍。在更少的行上获得可读性总是不是更pythonic?还有其他方法可以定义此方法并获得相同的结果吗?以某种方式使用.format()代替字符串格式会更好吗?

谢谢你,所有聪明的人!

1 个答案:

答案 0 :(得分:2)

正如我在上面的评论中所写,较短的代码不一定能带来更多的pythonic代码。简单性,可读性和可维护性应该是决定保留哪个版本的代码的主要标准。关于您的特定问题,我想我会喜欢以下内容:

def shipping_method_determiner(weight):
  prices = {
    "Ground": ground_rate(weight),
    "Drone": drone_rate(weight),
    "Premium": prem_ground_rate,
  }
  best_method, min_price = min(prices.items(), key=lambda item: item[1])
  return "%s is the cheapest method.\n\nThe total cost will be %.2f \n" % (best_method, min_price)