Learning Python¶
Calling an external command in Python¶
在stackoverflow看到一个话题讨论在Python中如何调用外部程序的。学习了一下,原来新的改进方法在模块subprocess中,在PEP 324中有详细介绍。
调用外部程序的常用方法有: * 函数”os.popen” 被”subprocess.Popen“取代 * 函数”os.system” 被”subprocess.call“取代
另外Python文档中亦有详细介绍。
The Python yield keyword explained¶
参考stackoverflow上的The Python yield keyword explained。
三元运算¶
类似于C和其它语言中的三元运算(condition) ? a : b。Python中也提供了一个类似的三元运算:[1]
# 如果y > 0, x = a;反之x = b
x = a if y > 0 else b
首先会对中间条件求值,如果为True,再对if左边表达式求值,否则对else后面的表达式求值。
嵌套函数的调试¶
在写scrapy爬虫时用于嵌套函数,但怎么都不输出期望的结果,再结果,用pdb来进行调试,调试进程却怎么也进入不了嵌套函数内部。代码大概如下:
def parse(self, response):
def News(hxs, xpath, pri):
for tmp in hxs.xpath(xpath):
item[..] = ..
request = Request(url, callback=...)
request.meta['item'] = item
yield request
hxs = Selector()
xpath1 = '...'
News(hxs, xpath1, 1)
pdb调试进程进行到def News(hxs, xpath, pri)就退出了,提示:“Generator exit”之类的什么。
浮点保留有效数字¶
内置函数round可以完成此任务。
脚本中获取其所在路径¶
为了保证路径的正确,在脚本中需要获取其所在的路径,有多种不同的方法可以得到此值,不过它们确有不同的适用范围:
import sys
import os
# 使用py2exe,无法使用变量__file__,而且sys.argv[0]取得的值也可能不正确
# 只有sys.executable可以取得正确的期望值
print(os.path.dirname(os.path.realpath(__file__)))
print(sys.executable)
print(sys.argv[0])
函数参数部分求值¶
currying[2]
def foo(x, y, z):
return x + y + z
from functools import partial
f = partial(foo, 1, 2) # 为foo的参数x, y提供值
f(3) # 调用foo(1, 2, 3), 结果为6
enumerate函数和zip函数¶
请看下面的代码:[2]
# Part 1
i = 0
for x in s:
# ......
i += 1
# 替代方法
for i, x in enumerate(s):
# ......
# Part 2
i = 0
while i < len(s) and i < len(t)
x = s[i]
y = t[i]
# ......
i += 1
# 替代方法
for x, y in zip(s, t):
# ......
enumerate创建一个迭代器,返回一个元组序列(0, s[0]), (1, s[1]) ... zip包装的两个序列如果长度不等,较短的索引完将结束。在Python 2中,zip将一次性用两个序列生成一个元组列表,数据量较大时可能出现不可预测的结果,函数itertools.izip()的实现效果与zip一致,不过每次仅生成一个元组,Python 3中,zip生成值的方式与之一样。
str.ltrip()的BUG么?¶
如下代码:
a = 'Nmap scan report for prog-xxxx.devel.xxx.xxx (10.1.2.245)'
a.lstrip('Nmap scan report for ')
# 得到的结果:'g-xxxx.devel.xxx.xxx (10.1.2.245)'
这是BUG么?
时间测量¶
测量一段代码的运行时间的基本思想:在代码运行前取一下系统时间,运行结束时取一下系统时间,两者之差就是。Python中的实现:
import time
start = time.time()
cpu_start = time.clock
# blabla ......
# you code
end = time.time()
cpu_end = time.clock()
consumer = end - start
cpu = cpu_start - cpu_end
time.time()返回一个从时间元年到当前的秒数(浮点数)。注意不同系统提供的时间精度可能不尽相同。
time.clock()在Unix上返回当前CPU时间,单位为秒的浮点数,其精度依赖于同名C函数;Windows上返回与第一次调用此函数的时间差。
获得系统配置信息¶
sysconfig可以用来获取当前python的配置信息。
>>> sysconfig.get_config_var('LIBDIR')
'/usr/local/lib'
如果要获得系统变量信息呢?比如一个进程可以打开的最大文件数(_SC_OPEN_MAX),节拍数(_SC_CLK_TCK)。模块os中的函数sysconf可以完成 相应的任务:
>>> import os
>>> os.sysconf('SC_CLK_TCK')
100
# 需要注意的是:不需要变量前的下划线
# 另外还可以这样哦
>>> os.sysconf_names['SC_CLK_TCK']
2
>>> os.sysconf(2)
100
参考资料¶
[1] | http://blog.csdn.net/jiangnanandi/article/details/3322192 |
[2] | (1, 2) David M. Beazley Python Essential Reference (4th) |