Python 代码错误,我不确定问题是什么,但似乎是循环
这是我的密码。当用户输入房间名称时,它会工作,但由于某种原因,它会循环并询问用户要预订哪个房间。我如何修复它,以使“输入您入住开始的一周”,而不是输入用户想要预订的房间? 图片参考Python 代码错误,我不确定问题是什么,但似乎是循环,python,loops,Python,Loops,这是我的密码。当用户输入房间名称时,它会工作,但由于某种原因,它会循环并询问用户要预订哪个房间。我如何修复它,以使“输入您入住开始的一周”,而不是输入用户想要预订的房间? 图片参考 第一个问题是您想要的是中断,而不是退出 break语句中断循环,这就是您要执行的操作 exit不是一条语句。它是一个函数的名称,您没有调用它,因此它除了编写排序的之外,什么都不做。此外,除了在交互模式下,它不打算被使用;如果需要在脚本中间退出脚本,则使用 sys .EXIT()/。另外,您也不想在这里退出整个脚本,只
第一个问题是您想要的是
中断
,而不是退出
break
语句中断循环,这就是您要执行的操作
exit
不是一条语句。它是一个函数的名称,您没有调用它,因此它除了编写排序的之外,什么都不做。此外,除了在交互模式下,它不打算被使用;如果需要在脚本中间退出脚本,则使用<代码> sys .EXIT()/<代码>。另外,您也不想在这里退出整个脚本,只想退出循环
但除此之外还有另一个问题:一个循环嵌套在另一个循环中。打破第一个不会打破第二个
您需要以某种方式重新组织您的逻辑,以便能够轻松地从代码中找到您想要的内容,而最干净的方法通常是编写一个函数,您可以从以下位置返回该函数:
name = ["Hetty", "Poppy", "Blue Skies", "Bay View", "Happy Days", "Summer Joy",
"Walkers Rest", "Bertie","Green Forest Lodge", "Coppice Lodge" ]
cap = [4, 4, 4, 6, 6, 6, 8, 8, 10, 10]
peak = [400, 400, 500, 650, 695, 800, 950, 1050, 1200, 1500]
offpeak = [250, 250, 350, 500, 550, 600, 750, 850, 950, 1150]
onoff = False
cost = 0
print("Here are our avaliable lodges")
for elem in name:
print("- " + elem)
desired_room = (str(input("Enter The Name Of The Room You Would Like To Book: "))).lower()
while True:
for i in range (0,10):
if desired_room == name [i].lower():
print("Name: ", name[i])
print("Capacity: ", cap[i])
print("Off Peak Rate: 0" + str(offpeak[i]))
print("Peak Rate: 0" + str(peak[i]))
exit
print("Invalid Room Name Entered Try Again")
desired_room = (str(input("Enter The Name Of The Room You Would Like To Book: "))).lower()
week = int(input("Enter The Week Your Stay Starts "))
现在,您可以调用该函数:
def book_room():
desired_room = (str(input("Enter The Name Of The Room You Would Like To Book: "))).lower()
while True:
for i in range (0,10):
if desired_room == name [i].lower():
return i
print("Invalid Room Name Entered Try Again")
desired_room = (str(input("Enter The Name Of The Room You Would Like To Book: "))).lower()
在我们进行这项工作时,您可以通过多种方式简化此代码。您只需在循环顶部请求输入
,而无需重复两次;你不需要对已经是字符串的东西调用str
;您可以使用字符串格式,而不是手动将内容转换为字符串并连接
room = book_room()
print("Name: ", name[room])
print("Capacity: ", cap[room])
print("Off Peak Rate: 0" + str(offpeak[room]))
print("Peak Rate: 0" + str(peak[room]))
虽然@abarnert的答案中提出的观点是有效的,但您可以使用类似以下的for else
构造,以避免使用单独的函数来打破嵌套循环:
def book_room():
while True:
desired_room = input("Enter The Name Of The Room You Would Like To Book: ")).lower()
for i in range(0,10):
if desired_room == name[i].lower():
return i
print("Invalid Room Name Entered Try Again")
room = book_room()
print(f"Name: {name[room]}")
print(f"Capacity: {cap[room]}")
print(f"Off Peak Rate: 0{offpeak[room]}")
print(f"Peak Rate: 0{peak[room]}")
解决方案
while True:
for i in range (0,10):
if desired_room == name[i].lower():
print("Name: ", name[i])
print("Capacity: ", cap[i])
print("Off Peak Rate: 0" + str(offpeak[i]))
print("Peak Rate: 0" + str(peak[i]))
break
else:
print("Invalid Room Name Entered Try Again")
desired_room = (str(input("Enter The Name Of The Room You Would Like To Book: "))).lower()
continue
break
如果你只是把你要做的事情稍微分开一点,你的代码会更容易使用。如果您在执行while
循环时先检查所需的\u房间
是否存在,则您可以进入下一个循环,知道所需的\u房间
是一个有效条目
另外,通过将输入转换为title
而不是lower
,您可以更快地检查名称,因为您知道所有条目都是标题大小写格式的
思想
按照您的方式,您正在匹配每个列表的所有索引,以获得适当的信息(name[0]、cap[0]、peak[0],…给我们提供
Hetty`的信息)。这很好,但是当你有100个房间,并且你的条目号67关闭时会发生什么呢?浏览每个列表并检查索引67会很困难。相反,您可以使用字典列表将每个房间的信息保存在一起。只是想提出一些想法,也加入了一些打印格式的想法
name = [
"Hetty", "Poppy", "Blue Skies", "Bay View", "Happy Days", "Summer Joy",
"Walkers Rest", "Bertie", "Green Forest Lodge", "Coppice Lodge"
]
cap = [4, 4, 4, 6, 6, 6, 8, 8, 10, 10]
peak = [400, 400, 500, 650, 695, 800, 950, 1050, 1200, 1500]
offpeak = [250, 250, 350, 500, 550, 600, 750, 850, 950, 1150]
onoff = False
cost = 0
print("Here are our avaliable lodges")
[print(f"-{elem}") for elem in name]
desired_room = input("Enter The Name Of The Room You Would Like To Book: " \
).title()
while desired_room.title() not in name:
print("Invalid Room Name Entered Try Again")
desired_room = input("Enter The Name Of The Room You Would Like To" +
" Book:").title()
for i in range(len(name)) :
if desired_room == name [i]:
print("Name: ", name[i])
print("Capacity: ", cap[i])
print("Off Peak Rate: 0" + str(offpeak[i]))
print("Peak Rate: 0" + str(peak[i]))
week = int(input("Enter The Week Your Stay Starts "))
输出
在if语句中,您应该需要删除一个空格。你有如果需要的话房间==name[i]。lower():
,如果需要的话房间==name[i]。lower():
@RedCricket虽然这绝对是更好的风格,但它不会以任何方式影响代码。如果和其他方面没有对齐?@vash\u踩踏不,请阅读关于else的构造的解释。我想你知道得更清楚,但必须检查一下,保持警惕,也许我会发现你滑倒一次:)
def print_info(something):
r_width = len(something['name'])
print("-"*15 + "-"*(r_width+1))
print("Name:".ljust(15), f"{something['name']}".rjust(r_width))
print("Capacity:".ljust(15), f"{something['cap']}".rjust(r_width))
print("Off Peak Rate:".ljust(15), f"{something['offpeak']}".rjust(r_width))
print("Peak Rate:".ljust(15), f"{something['peak']}".rjust(r_width))
print("-"*15 + "-"*(r_width+1))
rooms = [
{'name': 'Hetty', 'cap': 4, 'peak': 400, 'offpeak': 250},
{'name': 'Poppy', 'cap': 4, 'peak': 400, 'offpeak': 250},
{'name': 'Blue Skies', 'cap': 4, 'peak': 500, 'offpeak': 350},
{'name': 'Bay View', 'cap': 6, 'peak': 650, 'offpeak': 500},
{'name': 'Happy Days', 'cap': 6, 'peak': 695, 'offpeak': 550},
{'name': 'Summer Joy', 'cap': 6, 'peak': 800, 'offpeak': 600},
{'name': 'Walkers Rest', 'cap': 8, 'peak': 950, 'offpeak': 750},
{'name': 'Bertie', 'cap': 8, 'peak': 1050, 'offpeak': 850},
{'name': 'Green Forest Lodge', 'cap': 10, 'peak': 1200, 'offpeak': 950},
{'name': 'Coppice Lodge', 'cap': 10, 'peak': 1500, 'offpeak': 1050}
]
onoff = False
cost = 0
room_avail = []
for i in rooms:
room_avail.append(i['name'])
print("Here are our avaliable lodges")
for i in rooms:
print(f"-{i['name']}")
desired_room = input("Enter The Name Of The Room You Would Like To Book: " \
).title()
while desired_room not in room_avail:
print("Invalid Room Name Entered Try Again")
desired_room = input("Enter The Name Of The Room You Would Like To" +
" Book:").title()
for i in rooms:
if desired_room == i['name']:
print_info(i)
week = int(input("Enter The Week Your Stay Starts "))
(xenial)vash@localhost:~/python$ python3.7 hotel.py
Here are our avaliable lodges
-Hetty
-Poppy
-Blue Skies
-Bay View
-Happy Days
-Summer Joy
-Walkers Rest
-Bertie
-Green Forest Lodge
-Coppice Lodge
Enter The Name Of The Room You Would Like To Book: coppice lodge
-----------------------------
Name: Coppice Lodge
Capacity: 10
Off Peak Rate: 1050
Peak Rate: 1500
-----------------------------
Enter The Week Your Stay Starts