第14章 python 标准库

Python标准库是随Python附带安装的,它包含大量极其有用的模块。

sys 模块

sys 模块包含系统对应的功能。如 sys.argv 列表包含命令行参数。

# -*- coding: utf-8 -*-
# Filename: cat.py 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, # notice comma
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:]
# fetch sys.argv[1] but without the first two characters
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 'Unknown option.'
sys.exit()
else:
for filename in sys.argv[1:]:
readfile(filename)

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() 函数用来检验给出的路径是否真地存在。

第15章 更多python内容

特殊方法

在类中有一些特殊的方法具有特殊的意义,比如 __init__ 和 __del__ 方法。特殊的方法都被用来模仿某个行为。例如,如果你想要为你的类使用 x[key] 这样的索引操作(就像列表和元组一样),那么你只需要实现 __getitem__() 方法就可以了。

名称

说明

__init__(self,...)

这个方法在新建对象要被返回使用之前被调用。

__del__(self)

在对象要被删除之前调用。

__str__(self)

在我们对对象使用 print 语句或是使用 str()的时候调用。

__lt__(self,other)

当使用 小于 运算符(<)的时候调用。类似地,对于所有的运算符(+,>等等)都有特殊的方法。

__getitem__(self,key)

使用 x[key]索引操作符的时候调用。

__len__(self)

对序列对象使用内建的 len()函数的时候调用。

单语句块

每一个语句块是通过缩进层次与其它块区分开来。但如果语句块只包含一个语句,可以在条件语句或循环与语句的同一行指明它。

>>> flag = True
>>> if flag: print 'Yes'
...
Yes

单个语句被直接使用而不是作为一个独立的块使用。虽然这样做可以使你的程序变得 小一些 ,但是除了检验错误之外不建议使用这种缩略方法。

列表综合

通过列表综合,可以从一个已有的列表导出一个新的列表。

# -*- coding: utf-8 -*-
# Filename: list_comprehension.py listone = [2,3,4]
listtwo = [2*i for i in listone if i>2]
print listtwo

我们为满足条件(if i > 2)的数指定了一个操作(2*i),从而导出一个新的列表。

在函数中接收元组和列表

当要使函数接收元组或字典形式的参数的时候,有一种特殊的方法,它分别使用*和**前缀。这种方法在函数需要获取可变数量的参数的时候特别有用。

>>> def powersum(power, *args):
... '''Return the sum of each argument raised to specified power.'''
... total = 0
... for i in args:
... total += pow(i, power) # pow(i,power)=i**power
... return total
...
>>> powersum(2,3,4) # power=2,args=(3,4)
25 # 3**2 + 4**2
>>> powersum(2,10) # power=2,args=(10,)
100 # 10**2

由于在 args 变量前有*前缀,所有多余的函数参数都会作为一个元组存储在 args 中。如果使用的是 ** 前缀,多余的参数则会被认为是一个字典的键/值对。

lambda形式

lambda语句被用来创建新的函数对象,并且在运行时返回它们。

# -*- coding: utf-8 -*-
# Filename: lambda.py def make_repeater(n):
return lambda s: s*n twice = make_repeater(2) print twice('word')
print twice(5)

make_repeater 函数在运行时创建新的函数对象,并且返回它。lambda 语句用来创建函数对象。本质上,lambda 需要一个参数,后面仅跟单个表达式作为函数体,而表达式的值被这个新的函数返回。

注意,即便是 print 语句也不能用在 lambda 形式中,只能使用表达式。

exec 和 eval 语句

exec 语句用来执行储存在字符串或文件中的 python 语句。如,可以在运行时生成一个包含 python 代码的字符串,然后使用 exec 语句执行。

>>> exec 'print"Hello World"'
Hello World

eval 语句用来计算存储在字符串中的有效 python 表达式。

>>> eval('2*3')
6

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 <module>
AssertionError

repr 函数

repr 函数用来取得对象的规范字符串表示。反引号(转换符)可以完成相同的功能。

注意,大多数时候 eval(repr(object)) == object

>>> i = []
>>> i.append('item')
>>> `i`
"['item']"
>>> repr(i)
"['item']"

基本上,repr 函数和反引号用来获取对象的可打印的表示形式。可以通过定义的 __repr__ 方法来控制你的对象在被 repr 函数调用的时候返回的内容。

最新文章

  1. PHP_EOL
  2. 用Laravel+Grunt+Bower管理你的应用
  3. JAVA学习遇到的问题:接口实现
  4. java编程思想-java中的并发(三)
  5. TaobaoProtect.exe,Alipaybsm.exe进程删除----让流氓软件滚粗
  6. 阿里云-对象储存OSS
  7. js、html中的单引号、双引号及其转义使用
  8. ListView 介绍
  9. 大数据新手之路一:安装JDK
  10. JPA-style positional param was not an integral ordinal
  11. 汇编语言调用Linux系统调用read和write
  12. kubernetes master 高可用一键部署
  13. JZYZOJ 1360 [usaco2011feb]人品问题 DP 树状数组 离散化
  14. 【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA
  15. 杭电oj2047-2049、2051-2053、2056、2058
  16. POJ1741 Tree(树的点分治基础题)
  17. 模拟:HDU1034-Candy Sharing Game
  18. pat 甲级 1049. Counting Ones (30)
  19. Android UI开源框架
  20. kettle 增量同步

热门文章

  1. android开发利器--站在巨人肩膀上前行
  2. c/c++中与字符串处理相关的函数
  3. jquery prop()方法 解决全选 不全选 反选 问题 解决执行一次不不能再执行问题
  4. Android布局绘制常见小问题
  5. office2010安装出错,windows installer服务不能更新一个或多个受保护的windows文件
  6. WPF事件,路由事件
  7. BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )
  8. 如何让对象只在堆或者栈中分配空间ANDC++禁止一个类被继承
  9. mysql innodb init function error
  10. mysql数据库中列转行