如何在 python 应用程序中将条件指令块简化为一个 elif 语句?
How to simplify conditional instructions block to one elif statement in python app?
我编写了一个简单的应用程序,允许对我学校计算机实验室本地网络中的机器执行 ping 操作,然后 reboot/turn 将它们全部关闭,或者一台一台地关闭。应用程序运行良好,但它包含分配给实验室中指定机器(有 18 台计算机)的大块 elif 语句:
def shutdown_all():
with open(os.devnull, "wb"):
for computer in range(1, 19):
ip = "pracownia{0}".format(computer)
subprocess.call('shutdown -s -t 0 /m \\%s' % ip)
print("\nTask complete\n")
def shutdown_selected(ip):
with open(os.devnull, "wb"):
machine = "pracownia{0}".format(ip)
subprocess.call('shutdown -s -t 0 /m \\%s' % machine)
print("\nTask complete\n")
while True:
mode = input()
if mode == 'exit':
break
elif mode == "shutdown -all":
shutdown_all()
elif mode == "shutdown -ip 1":
shutdown_selected(1)
elif mode == "shutdown -ip 2":
shutdown_selected(2)
elif mode == "shutdown -ip 3":
shutdown_selected(3)
...
else:
print("Wrong mode. Type valid command.")
是否可以简化指令并将整个块减少为一个 elif 语句,允许用户输入他想要的计算机ping/reboot/shutdown?
你能不能不做这样的事:
mode = input()
if mode == 'exit'
break
elif mode == 'shutdown -all'
shutdown_all()
elif mode[:12] == 'shutdown -ip':
shutdown_selected(int(mode[-1:]))
您可以在最后一个 elif 语句中添加一些内容,以确保他们输入的内容适用于您的功能 - 这是您需要的吗?
降低大型 if-else 树复杂性的常用方法是使用字典。但是,您会将复杂性卸载到其他地方。例如:
options = dict(foo = foo, bar = bar, foobar = foobar)
options.get(input("Enter an option"), print('Input is not an option'))
此示例表明您对三个不同的选项关键字具有三个不同的函数。 get 方法将在字典中查找选项,否则将打印错误消息。
关于您的代码,我会将复杂性卸载到一个函数中:
def shutdown(command):
computers = set(str(i) for i in range(1,19))
with open(os.devnull, "wb"):
selecComputers = set(command.split(' ')[2:]) # or use regex
if len(selectComputers) > 0:
computers = computers.intersection(selectComputers)
for computer in computers:
ip = "pracownia{0}".format(computer)
subprocess.call('shutdown -s -t 0 /m \\%s' % ip)
print("\nTask complete\n")
while True:
mode = input()
if mode == 'exit':
break
elif 'shutdown' in mode:
shutdown(mode)
else:
print("Wrong mode. Type valid command.")
与之前的答案相同,但使用正则表达式进行解析,因为 IP 可以是 1-2 位数字。
import re
mode = input()
if mode == 'exit'
break
elif mode == 'shutdown -all'
shutdown_all()
elif mode[:12] == 'shutdown -ip':
match = re.search(r'\d+', mode)
if match:
ip = match.group()
shutdown_selected(ip)
我编写了一个简单的应用程序,允许对我学校计算机实验室本地网络中的机器执行 ping 操作,然后 reboot/turn 将它们全部关闭,或者一台一台地关闭。应用程序运行良好,但它包含分配给实验室中指定机器(有 18 台计算机)的大块 elif 语句:
def shutdown_all():
with open(os.devnull, "wb"):
for computer in range(1, 19):
ip = "pracownia{0}".format(computer)
subprocess.call('shutdown -s -t 0 /m \\%s' % ip)
print("\nTask complete\n")
def shutdown_selected(ip):
with open(os.devnull, "wb"):
machine = "pracownia{0}".format(ip)
subprocess.call('shutdown -s -t 0 /m \\%s' % machine)
print("\nTask complete\n")
while True:
mode = input()
if mode == 'exit':
break
elif mode == "shutdown -all":
shutdown_all()
elif mode == "shutdown -ip 1":
shutdown_selected(1)
elif mode == "shutdown -ip 2":
shutdown_selected(2)
elif mode == "shutdown -ip 3":
shutdown_selected(3)
...
else:
print("Wrong mode. Type valid command.")
是否可以简化指令并将整个块减少为一个 elif 语句,允许用户输入他想要的计算机ping/reboot/shutdown?
你能不能不做这样的事:
mode = input()
if mode == 'exit'
break
elif mode == 'shutdown -all'
shutdown_all()
elif mode[:12] == 'shutdown -ip':
shutdown_selected(int(mode[-1:]))
您可以在最后一个 elif 语句中添加一些内容,以确保他们输入的内容适用于您的功能 - 这是您需要的吗?
降低大型 if-else 树复杂性的常用方法是使用字典。但是,您会将复杂性卸载到其他地方。例如:
options = dict(foo = foo, bar = bar, foobar = foobar)
options.get(input("Enter an option"), print('Input is not an option'))
此示例表明您对三个不同的选项关键字具有三个不同的函数。 get 方法将在字典中查找选项,否则将打印错误消息。
关于您的代码,我会将复杂性卸载到一个函数中:
def shutdown(command):
computers = set(str(i) for i in range(1,19))
with open(os.devnull, "wb"):
selecComputers = set(command.split(' ')[2:]) # or use regex
if len(selectComputers) > 0:
computers = computers.intersection(selectComputers)
for computer in computers:
ip = "pracownia{0}".format(computer)
subprocess.call('shutdown -s -t 0 /m \\%s' % ip)
print("\nTask complete\n")
while True:
mode = input()
if mode == 'exit':
break
elif 'shutdown' in mode:
shutdown(mode)
else:
print("Wrong mode. Type valid command.")
与之前的答案相同,但使用正则表达式进行解析,因为 IP 可以是 1-2 位数字。
import re
mode = input()
if mode == 'exit'
break
elif mode == 'shutdown -all'
shutdown_all()
elif mode[:12] == 'shutdown -ip':
match = re.search(r'\d+', mode)
if match:
ip = match.group()
shutdown_selected(ip)