回顾一下Python基础知识,发现自己基础掌握得实在是差,甚至都不敢说自己会用Python了。想想两年也看了不少书,究其原因还是练习太少吧。不每天写写代码是学不会programming的。
进入正题,一个简单的Hanoi Tower递归:
def move(n,a='A',b='B',c='C'):
if n == 1:
print(a,"-->",c)
else :
move(n-1,a,c,b)
print(a,"-->",c)
move(n-1,b,a,c)
主要理解分治思想和递归思想的运用吧,这个倒没什么问题,接下来就暴露基础不扎实了:
用命令行执行脚本的程序入口在哪?
- 可以自己定义一个main函数:
def move(n,a='A',b='B',c='C'): ………… def main(): move(3) main()
- 但在很多脚本中常见的是这样:
def move(n,a='A',b='B',c='C'): ………… if __name__ == '__main__': move(3)
那么
if __name__ == '__main__':
的作用是什么呢?简单来讲就是直接运行脚本时,一个变量 __name__ 被赋值为 __main__ ;而当该脚本作为module被其他程序import时,__name__ 则被赋值为该脚本名称。
也就是说,在
if __name__ == '__main__':
后面的代码,直接运行脚本时会被执行,而当脚本作为module时不会执行。Stackoverflow上有一个回答很直观易懂,摘录部分如下:
# file one.py def func(): print("func() in one.py") print("top-level in one.py") if __name__ == "__main__": print("one.py is being run directly") else: print("one.py is being imported into another module") # file two.py import one print("top-level in two.py") one.func() if __name__ == "__main__": print("two.py is being run directly") else: print("two.py is being imported into another module")
如何读取命令行参数?
想在命令行中以参数形式输入汉诺塔层数,却发现忘了命令行参数怎么用了……真是羞耻,重新总结一下。
最简单的方法:sys.argv
sys.argv 就是命令行参数列表了,其中第一个参数argv[0]是脚本名,后面依次是输入的参数。
import sys print '参数个数:', len(sys.argv) print '参数列表:', str(sys.argv)
进阶方法:getopt模块
在使用很多程序时,都遇到过输入类似“-a”、“-h”、“–help”之类的选项来实现不同功能。设置这种命令行选项在Python中可以通过getopt模块来实现。
getopt模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式(-)和长选项模式(–)。
该模块提供了两个方法及一个异常处理来解析命令行参数。
常用的方法是getopt方法:
getopt.getopt(args, options[, long_options])
参数说明:
- args: 要解析的命令行参数列表。
- options: 以列表的格式定义,options后的冒号(:)表示该选项必须有附加的参数,不带冒号表示该选项不附加参数。
- long_options: 以字符串的格式定义,long_options 后的等号(=)表示如果设置该选项,必须有附加的参数,否则就不附加参数。
- 该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有’-‘或’–’的参数。
先把网上的一个实例贴过来吧,有机会再自己写应用该模块的程序。
#!/usr/bin/python # -*- coding: UTF-8 -*- import sys, getopt def main(argv): inputfile = '' outputfile = '' try: opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="]) except getopt.GetoptError: print 'test.py -i <inputfile> -o <outputfile>' sys.exit(2) for opt, arg in opts: if opt == '-h': print 'test.py -i <inputfile> -o <outputfile>' sys.exit() elif opt in ("-i", "--ifile"): inputfile = arg elif opt in ("-o", "--ofile"): outputfile = arg print '输入的文件为:', inputfile print '输出的文件为:', outputfile if __name__ == "__main__": main(sys.argv[1:])
运行该脚本:
$ python test.py -h usage: test.py -i <inputfile> -o <outputfile> $ python test.py -i inputfile -o outputfile 输入的文件为: inputfile 输出的文件为: outputfile
还是希望自己要多想多做,脚踏实地,慢慢来。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!