Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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 这个for循环的目的是什么?_Python - Fatal编程技术网

Python 这个for循环的目的是什么?

Python 这个for循环的目的是什么?,python,Python,我跟随《黑帽Python》一书,目前的活动是构建一个netcat替代品。要设置选项,请使用“getopt”。我不明白为什么在for循环中使用来检查选项 if not len(sys.argv[1:]): usage() # read the command line options try: opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:", \ ["he

我跟随《黑帽Python》一书,目前的活动是构建一个netcat替代品。要设置选项,请使用“getopt”。我不明白为什么在for循环中使用来检查选项

  if not len(sys.argv[1:]):
        usage()

    # read the command line options
    try:

           opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:", \
           ["help", "listen", "execute", "target", "port", "command", "upload"])
    except getopt.GetoptError as err:
           print(str(err))
           usage()

    for o,a in opts:
            if o in ("-h","--help"):
                    usage()
            elif o in ("-l", "--listen"):
                    listen = True
            elif o in ("-e", "--execute"):
                    execute = a
            elif o in ("-c", "--commandshell"):
                    command = True
            elif o in ("-u", "--upload"):
                    upload_destinaton = a
            elif o in ("-t", "--target"):
                    target = a
            elif o in ("-p", "--port"):
                    port = int(a)
            else:
                    assert False,"Unhandled Option"
如果您查看,则有一个示例演示了这一点:

>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]  # <--- HERE
>>> args
['a1', 'a2']
导入getopt >>>args='-a-b-cfoo-d bar a1 a2'.split() >>>args ['-a'、'-b'、'-cfoo'、'-d'、'bar'、'a1'、'a2'] >>>optlist,args=getopt.getopt(args'abc:d:') >>>光学列表 [('-a','')('-b','')('-c',foo'),('-d',bar')]#>>args ['a1','a2']
opts
(在您的问题中)对应于上例中的
optlist


getopt
返回一个元组列表作为第一个返回值(列表作为第二个返回值),因此通过在opts中为o使用
,代码会在每次循环迭代期间将这些元组拆分。

opts
是一个选项、值对的列表。见:

返回值由两个元素组成:第一个是(选项,值)对的列表;第二个是剥离选项列表后留下的程序参数列表(这是参数的后续部分)。返回的每个选项和值对都将选项作为其第一个元素,前缀为短选项的连字符(例如“-x”)或长选项的两个连字符(例如“---long option”),选项参数作为其第二个元素,如果选项没有参数,则为空字符串。这些选项在列表中的出现顺序与找到它们的顺序相同,因此允许多次出现。多头和空头期权可能是混合的

因此for循环一次处理每个命令行参数,即选项、值对。参数的数量可能在数量上有所不同


您对更具体的内容感兴趣吗?

是的,我想知道为什么要使用“o”和“a”选项。“o”是否表示getopt中的某些内容?啊,
o
a
是循环构造中的任意变量名;它们也可以是
x
y
。重要的是
for
循环将opts中每个2元组中的两个项分配给它们。(opts只是一个与option:value对相对应的2元组列表,正如上面@Kingsley所演示的)
getopt
并非真正用于新代码,而是作为移植使用
getopt
库的现有程序的一种帮助。您应该使用
argparse
来处理命令行选项。