本文详解如何将用户输入(如商品名、单价、数量)作为参数传递给 python 函数,并指出常见误区:直接传入未定义变量会导致 nameerror;正确做法是让函数自主获取输入并返回结果,再通过变量接收返回值。
在 Python 中,函数的参数确实可以接收用户输入的值,但关键在于“何时输入”和“谁负责赋值”。你遇到的 NameError: name 'item_bought_1' is not defined 错误,并非因为“输入值不能作参数”,而是因为你试图将尚未声明的变量名作为实参传入函数——此时 item_bought_1 等变量在调用前根本不存在,Python 自然无法识别。
你的原始代码中,item_bought_1, unit_price_1 等变量是在函数调用之前才被 input() 赋值的,但你在调用 question_asker(item_bought_1, ...) 时,这些变量尚未定义(尤其在脚本顶部直接调用时),因此报错。
更合理的设计是:让函数内部完成所有输入操作,并通过 return 返回计算结果。这样既避免了变量命名污染,又提升了复用性与可读性。
以下是优化后的实现:
def question_asker():
"""交互式获取单个商品信息,并返回(商品名, 单价, 数量, 小计)元组"""
item = input("What item has been bought? ").strip()
# 添加基础错误处理,防止空输入或非数字
try:
price = float(input(f"How much is each unit of '{item}'? "))
qty = int(input(f"How many units of '{item}' have been bought? "))
total = price * qty
return item, price, qty, total
except ValueError:
print("⚠️ Invalid input: please enter numbers for price and quantity.")
return question_asker() # 递归重试(生产环境建议用循环替代)
# 调用4次,分别获取4组数据
items = []
for i in range(1, 5):
print(f"\n--- Entry #{i} ---")
result = question_asker()
items.append(result)
# 打印结构化表格(示例)
print("\n" + "="*60)
print(f"{'Item':<15} {'Unit Price':<12} {'Qty':<8} {'Total':<12}")
print("-"*60)
for item, price, qty, total in items:
print(f"{item:<15} ${price:<11.2f} {qty:<8} ${total:<11.2f}")
print("="*60)
不要在调用函数前使用未定义的变量名作参数(如 question_asker(item_bought_1, ...)),这违反变量作用域规则;这种设计不仅解决了 NameError,还使代码更模块化、易测试、易维护——这才是 Python 函数式编程的最佳实践。