Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.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_Switch Statement - Fatal编程技术网

Python开关函数

Python开关函数,python,switch-statement,Python,Switch Statement,我一直在尝试编写一个简单的端口扫描器,它使用了一个用if构建的简单开关函数。我已经在这里找到了一个正确的解决方案,让如何使开关函数像C++或类似语言一样可用。我发现这个问题已经在这里讨论过了,我尝试过其中的一些方法,但到目前为止还没有任何运气使它正常运行。无论我从链接中选择了什么方法,我总是在第二个开关案例中遇到语法错误,如下所示: File "/home/h4v0kkx0008c/Desktop/Sources/setup/PortScannerV1.py", line 44 if cas

我一直在尝试编写一个简单的端口扫描器,它使用了一个用if构建的简单开关函数。我已经在这里找到了一个正确的解决方案,让如何使开关函数像C++或类似语言一样可用。我发现这个问题已经在这里讨论过了,我尝试过其中的一些方法,但到目前为止还没有任何运气使它正常运行。无论我从链接中选择了什么方法,我总是在第二个开关案例中遇到语法错误,如下所示:

  File "/home/h4v0kkx0008c/Desktop/Sources/setup/PortScannerV1.py", line 44
if case(2):
          ^
SyntaxError: invalid syntax
这里可能有什么问题

这是我到目前为止编写的完整代码:

从套接字导入*
导入时间、套接字、操作系统、系统、字符串、argparse、日志、数学
n=原始输入(“选择端口范围:\n(1)标准端口:0-1025\n(2)中间端口:1025-5000\n(3)更高范围:5000-49151\n(4)最高范围:49151-65535\n(5)所有端口:0-65535\n(6)自定义”)
类开关(对象):
值=无
定义新定义(类别,值):
类值=值
返回真值
def案例(*参数):
返回任意((arg==args中arg的switch.value))
while开关(n):
如属第(1)种情况:
打印“您的选择是:标准端口”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围(0,1025)内的i:
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
如属第(2)种情况:
打印“您的选择是:中等范围”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围内的i(10255000):
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破
如属第(3)种情况:
打印“您的选择是:更高范围”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围内的i(50049151):
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破
如属第(4)种情况:
打印“您的选择是:最高范围”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围内的i(49151、65535):
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破
如属第(5)种情况:
打印“您的选择是:所有端口”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
对于范围(065535)内的i:
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破
如属第(6)种情况:
打印“您的选择是:自定义”
目标=原始输入(“请指定要扫描的主机或Ip:”)
targetIP=gethostbyname(目标)
打印“在主机上开始扫描”,targetIP
startPort=原始输入(“指定起始端口:”)
endPort=原始输入(“指定结束端口:”)
对于范围内的i(起始端口、结束端口):
s=套接字(AF_INET,SOCK_STREAM)
结果=s.connect_ex((targetIP,i)
打破

您试图解决此问题的方式似乎不符合python。由于python中不存在switch语句,您可以使用字典模拟类似于switch的行为,因为函数和类是python中的第一类对象

def func1():
    # do some operation

def func2():
    # some other operation

def default_func():
    # some default action

options = {
    '1': func1,
    '2': func2,
    'default': default_func
}

value = raw_input('enter a number')

result = options.get(int(value), options.get('default'))()

如果您的函数足够简单,那么您肯定可以使用lambdas作为值,这肯定会更简洁。

您试图解决此问题的方式似乎并不符合python。由于python中不存在switch语句,您可以使用字典模拟类似于switch的行为,因为函数和类是第一类python中的ss对象

def func1():
    # do some operation

def func2():
    # some other operation

def default_func():
    # some default action

options = {
    '1': func1,
    '2': func2,
    'default': default_func
}

value = raw_input('enter a number')

result = options.get(int(value), options.get('default'))()

如果你的函数足够简单,你肯定可以使用lambdas作为值,这肯定会更简洁。

如果你需要在case-equired语句中的代码块之间共享一组局部变量,那么函数的dict可能不是正确的答案。至少你必须将上下文实体传递给或者使用
\uuu init\uuu()
将它们转换为类方法,以初始化它们并将上下文存储在self.where中

更简单的方法就是使用

if switchvar == value1: 
   ... 
elif switchvar==value2:
   ... 
elif # as many more as you need

else: #default
   ... 
这与case语句的不同之处在于,不能从一个块的末尾流到下一个块(而对于函数,则可以从其他块中调用)。注意,在使用case语句的语言中,如果没有大量注释,则不允许从case语句中的一个块的末尾流到下一个块。这通常是一个bug,尽管偶尔有用


注意[value1,value2,value3,…]中的Pythonic
if变量:
相当于同一块顶部的value1、value2等的多个case标签。

如果需要在case-equivalent语句中的代码块之间共享一组局部变量,那么函数dict可能不是正确答案。至少您必须将上下文实体传递给所有f或者使用
\uuu init\uuuu()
将它们转换为类方法,以初始化它们并将上下文存储在self.where中

更简单的方法就是使用

if switchvar == value1: 
   ... 
elif switchvar==value2:
   ... 
elif # as many more as you need

else: #default
   ... 
这与case语句的不同之处在于,不能从一个块的末尾流到下一个块(而对于函数,则可以从其他块中调用)。注意,在使用case语句的语言中,如果没有大量注释,则不允许从case语句中的一个块的末尾流到下一个块。这通常是一个bug,尽管偶尔有用

请注意,[value1,value2,value3,…]中的Pythonic
if变量:
相当于位于