# Sal's Shipping Project - None

def ground_cost(weight):
if weight <= 2:
cost = weight * 1.5 + 20
elif weight <= 6:
cost = weight * 3 + 20
elif weight <= 10:
cost = weight * 4 + 20
else:
cost = weight * 4.75 + 20
return cost

print(ground_cost(8.4))

prem_cost = 125

def drone_cost(weight):
if weight <= 2:
cost = weight * 4.5
elif weight <= 6:
cost = weight * 9
elif weight <= 10:
cost = weight * 12
else:
cost = weight * 14.25
return cost

print(drone_cost(1.5))

def cheap(weight):
if ground_cost(weight) < prem_cost and ground_cost(weight) < drone_cost(weight):
print("Ground Shipping is the cheapest method with the cost of " + str(ground_cost(weight))) elif ground_cost(weight) < prem_cost and not ground_cost(weight) < drone_cost(weight): print("Drone Shipping is the cheapest method with the cost of " + str(drone_cost(weight)))
else:
print(â€śPremium Ground Shipping is the cheapest method with the cost of \$125.00â€ť)

print(cheap(4.8))
print(cheap(41.5))

Why does it output None?
On a side note, how to quote code here?

`None` is the default object returned from a function which doesnâ€™t have itâ€™s own `return` statement. So if you print function calls which donâ€™t `return` anything youâ€™ll invariably end up with None printed to the screen one or more times.

As for code check this FAQ for details-

1 Like

I see I have print in my cheap function, then I print cheap function, so it ended up with 2 print. If I just call the function instead of print, would it fix the problem?

``````def cheap(weight):
if ground_cost(weight) < prem_cost and ground_cost(weight) < drone_cost(weight):
print("Ground Shipping is the cheapest method with the cost of \$" + str(ground_cost(weight)))
elif ground_cost(weight) < prem_cost and not ground_cost(weight) < drone_cost(weight):
print("Drone Shipping is the cheapest method with the cost of \$" + str(drone_cost(weight)))
else:
print(â€śPremium Ground Shipping is the cheapest method with the cost of \$125.00â€ť)

cheap(4.8)
cheap(41.5)
``````

Or just change all the print in the cheap function to return instead

``````def cheap(weight):
if ground_cost(weight) < prem_cost and ground_cost(weight) < drone_cost(weight):
return "Ground Shipping is the cheapest method with the cost of \$" + str(ground_cost(weight))
elif ground_cost(weight) < prem_cost and not ground_cost(weight) < drone_cost(weight):
return "Drone Shipping is the cheapest method with the cost of \$" + str(drone_cost(weight))
else:
return â€śPremium Ground Shipping is the cheapest method with the cost of \$125.00â€ť

print(cheap(4.8))
print(cheap(41.5))
``````
2 Likes

Those are both valid solutions. Iâ€™d generally suggest using `return` over `print` for almost any function that didnâ€™t have the sole purpose of outputting to the console, so almost all of them. Actually being able to use the value post function call gives you many more options.

1 Like