zoukankan      html  css  js  c++  java
  • CDays–3 通过函数进行功能化 Python基础教程

    image

    图片来自 《可爱的Python》 P16

    如果我们希望Python 的程序像CMD中的命令一样,可以添加运行参数,那么我们需要将程序做成函数, 就像C语言的函数。

    这种问题《可爱的Python》是不会告诉我们的,让我们去参考书上翻一下。《Python 学习手册》

    首先明白一个问题,函数是什么。

    可以这么理解,在程序中,函数是一个通用的功能块,在程序的任何一个位置调用一个函数,他的功能是一样的。我们可以把一段总在程序中重复的代码定义成函数。

    然后在之后的程序中调用。这样就可以省去了很多麻烦。

    那么如果你学过任何一门语言,那么函数是很容易理解的。

    那么根据参考书,我们看一下Python的函数是如何定义的。

    def 语句

    def语句将创建一个函数名,并且定义函数使用的变量。

    函数的主体往往都含有return语句。

    def <name> (arg1, arg2 ,..... argN ):
         ...
         return < value >

    有一点值得说明,python 的def语句并不像C语言定义函数一样,def 可以在程序的任何一个位置,甚至在if 中,根据条件不同,配置不同的子函数。

    我们给出一个def的使用例子。

    def test(x ,y):
        return x*y
    print test(5,66)

    image

    在这里个例子中,我们定义函数test 的功能就是将两个变量相乘。

    让我们尝试在命令行中调用它。

    image

    我想大家已经可以理解函数是怎么被调用的了。


    那么现在我们看下我们的需求。

    我们需要指定扫描目录 以及保存的文件名,让我们改一下昨天的代码。

    import os
    export = ""
    for root, dirs, files in os.walk('/media/cdrom0'):
      export+="\n %s;%s;%s" % (root,dirs,files)
    open('mycd2.cdc', 'w').write(export)

    下面我们加入def

    import os
    def cdWalker (cdrom , result_file ):
        export = ""
        for root, dirs, files in os.walk(cdrom):
            export+="\n %s;%s;%s" % (root,dirs,files)
        open(result_file, 'w').write(export)

    我们运行一下,然后在命令行中调用。

    image

    我们得到了两个文件。

    image

    如此看来,我们定义的函数是没错的。

    那又怎么从命令行获取输入的参数呢。

    根据书上的指引,我们使用 sys.argv 

    让我们查一下sys.argv是干嘛的。

    sys.argv 是用来获取命令行的参数的。

    sys.argv 的用法

    我们从《Python简明教程》上取得一个例子看一下他是怎么用的。

    import sys 
    def readfile(filename): 
        ''' Print a file to the standard output. '''
        f = file(filename) 
        while True: 
            line = f.readline() 
            if len(line) == 0: 
                break
            print line  
        f.close() 
      
    #Script starts from here 
    if len(sys.argv) < 2: 
        print ' NO action specified.'
        sys.exit() 
      
    if sys.argv[1].startswith('--'): 
        option = sys.argv[1][2:] 
        if option == 'version': 
            print ' version 1.2 '
        elif option == 'help': 
            print '''This program prints files to the standard output.  
                 Any number of files can be specified.  
                 Options include:  
                 --version : Prints the version number  
                 --help     : Display this help'''  
        else: 
            print 'Unknow option.'
    else: 
        for filename in sys.argv[1:]: 
            readfile(filename)

    这个程序要从cmd里面执行,让我们试一下。

    image

    功能好像挺简单的,那么我们现在分析一下这个程序。

    首先,我们看到了def, 它定义了一个函数,这个函数从名称上看来是读取文件的,参数是文件名。

    下面出现了两个IF , 第一个if是判断sys.argv的长度,那么我们有了一个新问题。sys.argv得到的是什么,让我们再上一个程序上面补写一句话

    print sys.argv

    image

    我们看到了 sys.argv 的输出内容是一个list , 如果没有 参数,应该只有一项。

    如果有参数,长度肯定超过1 .

    第一个if 就是解决是否提供了参数的问题,如果没有参数,程序则退出,使用函数 sys.exit( )

    第二个if 是用来判断参数是什么。可以看到这里使用了偏移来索引字符串。

    到这里,我们应该就很清楚了 sys.argv 的实质是什么了。


    现在我们用 sys.argv 来修改最初的程序。

    import os,sys
    CDROM = 'D:\\CDROM'
    def cdWalker (cdrom , result_file ):
        export = ""
        for root, dirs, files in os.walk(cdrom):
            export+="\n %s;%s;%s" % (root,dirs,files)
        open(result_file, 'w').write(export)
    if '-e'==sys.argv[1] :
        cdWalker (CDROM,sys.argv[2])
        print "CDROM detals is saved in  %s" % sys.argv[2]
    else:
        print 'ERROR INPUT !'

    保存它,现在我们在CMD中运行试试看。

    image

    一个可以与用户互动的小程序暂时完成了。

    大年初一啊。><

  • 相关阅读:
    SPOJ 694 (后缀数组) Distinct Substrings
    POJ 2774 (后缀数组 最长公共字串) Long Long Message
    POJ 3693 (后缀数组) Maximum repetition substring
    POJ 3261 (后缀数组 二分) Milk Patterns
    UVa 1149 (贪心) Bin Packing
    UVa 12206 (字符串哈希) Stammering Aliens
    UVa 11210 (DFS) Chinese Mahjong
    UVa (BFS) The Monocycle
    UVa 11624 (BFS) Fire!
    HDU 3032 (Nim博弈变形) Nim or not Nim?
  • 原文地址:https://www.cnblogs.com/Kaysin/p/2909777.html
Copyright © 2011-2022 走看看