Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 代码错误,我不确定问题是什么,但似乎是循环_Python_Loops - Fatal编程技术网

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