sys模块
sys
模块包含系统对应的功能。我们已经学习了sys.argv
列表,它包含命令行参数。
在Python程序运行的时候,即不是在交互模式下,在sys.argv
列表中总是至少有一个项目。它就是当前运行的程序名称,作为sys.argv[0]
(由于Python从0
开始计数)。其他的命令行参数在这个项目之后。
为了使这个程序对用户更加友好,我们提供了一些用户可以指定的选项来了解更多程序的内容。我们使用第一个参数来检验我们的程序是否被指定了选项。如果使用了--version
选项,程序的版本号将被打印出来。类似地,如果指定了--help
选项,我们提供一些关于程序的解释。我们使用sys.exit
函数退出正在运行的程序。和以往一样,你可以看一下help(sys.exit)
来了解更多详情。
如果没有指定任何选项,而是为程序提供文件名的话,它就简单地打印出每个文件地每一行,按照命令行中的顺序一个文件接着一个文件地打印。
顺便说一下,名称cat是 concatenate 的缩写,它基本上表明了程序的功能——它可以在输出打印一个文件或者把两个或两个以上文件连接/级连在一起打印。
更多sys的内容
sys.version
字符串给你提供安装的Python的版本信息。sys.version_info
元组则提供一个更简单的方法来使你的程序具备Python版本要求功能。
[swaroop@localhost code]$ python
>>> import sys
>>> sys.version
'2.3.4 (#1, Oct 26 2004, 16:42:40) \n[GCC 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)]'
>>> sys.version_info
(2, 3, 4, 'final', 0)
对于有经验的程序员,sys
模块中其他令人感兴趣的项目有sys.stdin
、sys.stdout
和sys.stderr
它们分别对应你的程序的标准输入、标准输出和标准错误流。
os模块
这个模块包含普遍的操作系统功能。如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的。即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux和Windows下运行。一个例子就是使用os.sep
可以取代操作系统特定的路径分割符。
下面列出了一些在os
模块中比较有用的部分。它们中的大多数都简单明了。
-
os.name
字符串指示你正在使用的平台。比如对于Windows,它是'nt'
,而对于Linux/Unix用户,它是'posix'
。 -
os.getcwd()
函数得到当前工作目录,即当前Python脚本工作的目录路径。 -
os.getenv()
和os.putenv()
函数分别用来读取和设置环境变量。 -
os.listdir()
返回指定目录下的所有文件和目录名。 -
os.remove()
函数用来删除一个文件。 -
os.system()
函数用来运行shell命令。 -
os.linesep
字符串给出当前平台使用的行终止符。例如,Windows使用'\r\n'
,Linux使用'\n'
而Mac使用'\r'
。 -
os.path.split()
函数返回一个路径的目录名和文件名。>>> os.path.split('/home/swaroop/byte/code/poem.txt')
('/home/swaroop/byte/code', 'poem.txt') -
os.path.isfile()
和os.path.isdir()
函数分别检验给出的路径是一个文件还是目录。类似地,os.path.existe()
函数用来检验给出的路径是否真地存在。
你可以利用Python标准文档去探索更多有关这些函数和变量的详细知识。你也可以使用help(sys)
等等。
更多Python的内容
特殊的方法
在类中有一些特殊的方法具有特殊的意义,比如__init__
和__del__
方法,它们的重要性我们已经学习过了。
一般说来,特殊的方法都被用来模仿某个行为。例如,如果你想要为你的类使用x[key]
这样的索引操作(就像列表和元组一样),那么你只需要实现__getitem__()
方法就可以了。想一下,Python就是对list
类这样做的!
名称 | 说明 |
---|---|
__init__(self,...) | 这个方法在新建对象恰好要被返回使用之前被调用。 |
__del__(self) | 恰好在对象要被删除之前调用。 |
__str__(self) | 在我们对对象使用print 语句或是使用str() 的时候调用。 |
__lt__(self,other) | 当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。 |
__getitem__(self,key) | 使用x[key] 索引操作符的时候调用。 |
__len__(self) | 对序列对象使用内建的len() 函数的时候调用。 |
单语句块
现在,你已经很深刻地理解了每一个语句块是通过它的缩进层次与其它块区分开来的。然而这在大多数情况下是正确的,但是并非100%的准确。
Python解释器把提示符改变为...
以表示语句还没有结束。在这种情况下,我们按回车键用来确认语句已经完整了
列表综合
通过列表综合,可以从一个已有的列表导出一个新的列表。例如,你有一个数的列表,而你想要得到一个对应的列表,使其中所有大于2的数都是原来的2倍。对于这种应用,列表综合是最理想的方法。
listone = [2
,
3
,
4
]
listtwo = [
2
*i
for
i
in
listone
if
i >
2
]
print
listtwo
在函数中接收元组和列表
当要使函数接收元组或字典形式的参数的时候,有一种特殊的方法,它分别使用*
和**
前缀。这种方法在函数需要获取可变数量的参数的时候特别有用。
def powersum(power, *args):
... '''Return the sum of each argument raised to specified power.'''
... total = 0
... for i in args:
... total += pow(i, power)
... return total
...
>>> powersum(2, 3, 4)
25
>>> powersum(2, 10)
100
由于在args
变量前有*
前缀,所有多余的函数参数都会作为一个元组存储在args
中。如果使用的是**
前缀,多余的参数则会被认为是一个字典的键/值对。
lambda形式
lambda
语句被用来创建新的函数对象,并且在运行时返回它们。
def make_repeater
(n):
return lambda
s: s*n
twice = make_repeater(2
)
print
twice(
'word'
)
print
twice(
5
)
lambda语句用来创建函数对象。本质上,lambda
需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新建的函数返回。
exec和eval语句
exec语句用来执行储存在字符串或文件中的Python语句。
exec 'print "Hello World"'
Hello World
eval
语句用来计算存储在字符串中的有效Python表达式。下面是一个简单的例子。
eval('2*3')
assert语句
assert
语句用来声明某个条件是真的。例如,如果你非常确信某个你使用的列表中至少有一个元素,而你想要检验这一点,并且在它非真的时候引发一个错误,那么assert
语句是应用在这种情形下的理想语句。当assert语句失败的时候,会引发一个AssertionError
。
>>> mylist = ['item']
>>> assert len(mylist) >= 1
>>> mylist.pop()
'item'
>>> assert len(mylist) >= 1
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AssertionError
repr函数
repr
函数用来取得对象的规范字符串表示。反引号(也称转换符)可以完成相同的功能。注意,在大多数时候有eval(repr(object)) == object
i = []
i.append('item')
repr(i)
基本上,repr
函数和反引号用来获取对象的可打印的表示形式。你可以通过定义类的__repr__
方法来控制你的对象在被repr
函数调用的时候返回的内容