声明:
本博客欢迎转发,但请保留原作者信息!
新浪微博:@孔令贤HW;
博客地址:http://blog.csdn.net/lynn_kong
内容系本人及本人团队学习、研究和总结,如有雷同,实属荣幸!
1. partition/rpartition
示例:
>>> 'http://blog.csdn.net/lynn_kong'.partition('://')
('http', '://', 'blog.csdn.net/lynn_kong')
>>> 'blog.csdn.net/lynn_kong'.partition('://')
('blog.csdn.net/lynn_kong', '', '')
返回一个3元的tuple,第一个为分隔符左边的子串,第二个为分隔符本身,第三个为分隔符右边的子串。如果找不到指定的分隔符,则返回仍然是一个3元的tuple,第一个为整个字符串,第二和第三个为空串。
与split(sep, 1)的区别在于:split返回的可能不是固定长度的返回值,它返回的是一个list,如果找到,则返回一个2元list,如果没找到,则返回一个1元的list,并不返回分隔符。partition其实是为了替换find,index而产生的,并不是为了替换split。
rpartition就从右到左匹配。
2. filter/map/reduce/lambda
本节转自网络,源地址不详
filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回:
>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def f(x): return x != 'a'
>>> filter(f, "abcdef")
'bcdef'
map(function, sequence) :对sequence中的item依次执行function(item),见执行结果组成一个List返回:
>>> def cube(x): return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def cube(x) : return x + x
...
>>> map(cube , "abcde")
['aa', 'bb', 'cc', 'dd', 'ee']
另外map也支持多个sequence,这就要求function也支持相应数量的参数输入:
>>> def add(x, y): return x+y
>>> map(add, range(8), range(8))
[0, 2, 4, 6, 8, 10, 12, 14]
reduce(function, sequence, starting_value):对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对List求和:
>>> def add(x,y): return x + y
>>> reduce(add, range(1, 11))
55 (注:1+2+3+4+5+6+7+8+9+10)
>>> reduce(add, range(1, 11), 20)
75 (注:1+2+3+4+5+6+7+8+9+10+20)
lambda:这是Python支持一种有趣的语法,它允许你快速定义单行的最小函数,类似与C语言中的宏,这些叫做lambda的函数,是从LISP借用来的,可以用在任何需要函数的地方:
>>> g = lambda x: x * 2
>>> g(3)
6
>>> (lambda x: x * 2)(3)
6
我们也可以把filter map reduce 和lambda结合起来用,函数就可以简单的写成一行。
例如
kmpathes = filter(lambda kmpath: kmpath,
map(lambda kmpath: string.strip(kmpath),
string.split(l, ':')))
看起来麻烦,其实就像用语言来描述问题一样,非常优雅。
对 l 中的所有元素以':'做分割,得出一个列表。对这个列表的每一个元素做字符串strip,形成一个列表。对这个列表的每一个元素做直接返回操作(这个地方可以加上过滤条件限制),最终获得一个字符串被':'分割的列表,列表中的每一个字符串都做了strip,并可以对特殊字符串过滤。
关于lambda函数再举一个例子:
processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
lambda函数在布尔环境中总是返回为真。
如果collapse变量为真,则分割s字符串,否则返回原字符串。
而不必像其他高级语言一样,写一个函数,两个入参,在函数内判断collapse变量。
3. 单例装饰器
def singleton(cls):
instances = {}
def getinstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance
@singleton
class MyClass:
pass
使用:
>>> a = MyClass()
>>> b = MyClass()
>>> a == b
True
另一种方法:
class VRMClient(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(VRMClient, cls).__new__(cls, *args, **kwargs)
return cls._instance
4. 获取系统IP和MAC
import socket
socket.gethostbyname(socket.gethostname())
socket.gethostbyname_ex(socket.gethostname())
方法二:
import socket
import fcntl
import struct
def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])
def getHwAddr(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', ifname[:15]))
return ''.join(['%02x:' % ord(char) for char in info[18:24]])[:-1]
使用:
'127.0.0.1'
>>> get_ip_address('eth0')
'38.113.228.130'
5. 打印对象
def __str__(self):
if len(self.__dict__) > 0:
plist = []
for field in self.__dict__:
plist.append(str(field) + ": " + str(self.__dict__[field]))
return reduce(lambda x,y: x + "\n" + y, plist)
else:
return ""
6. KeyError异常
说明:
D.get(key[, d]) ->D[k] if k in D, else d. d defaults to None.
7. extension机制
import pkg_resources
plugins = []
for ep in pkg_resources.iter_entry_points(group='my_ep_group_id'):
plugins.append(ep.load())
print plugins[0]()
8. setdefault
该函数是从字典中获取key的值,如果获取不到的时候就按照参数中设置该key。
>>> a={}
>>> a['key']='123'
>>> print (a)
{'key': '123'}
>>> print (a.setdefault('key','456')) #显示a这个字典的'key'值的内容,因为字典有,所以不会去设置它
123
>>> print (a.setdefault('key1','456')) #显示a这个字典的'key1'值的内容,因为字典没有,所以设置为456了
456
>>> a
{'key1': '456', 'key': '123'}
9.property
property( [fget[, fset[, fdel[, doc]]]])
如果要使用property函数,首先定义class的时候必须是object的子类。通过property的定义,当获取成员x的值时,就会调用getx函数,当给成员x赋值时,就会调用setx函数,当删除x时,就会调用delx函数。使用属性的好处就是因为在调用函数,可以做一些检查。如果没有严格的要求,直接使用实例属性可能更方便。
而@property将提供一个ready-only property(除非提供@var.setter)
10、关于序列或字典的一些操作
10.1、遍历 list 的同时获取索引
for i, element in enumerate(mylist):
# Do something with i and element
pass
10.2、defaultdict
defaultdict 将会利用接受的参数为每个不存在的 key 创建对应的值,这里我们传递的是 list,所以它将为每个 key 创建一个 list 类型的值。
from collections import defaultdict
persons_by_age = defaultdict(list)
for person in persons:
persons_by_age[person.age].append(person)
10.3、列表排序
函数原型:
L.sort(cmp=None, key=None, reverse=False)
cmp是比较函数,key是一个接受一个参数的函数,sort将按照返回值大小进行排序,举例:
port1={'network_id':'11111111', 'name':'port1'}
port2={'network_id':'11111111', 'name':'port2'}
port3={'network_id':'22222222', 'name':'port3'}
port4={'network_id':'33333333', 'name':'port4'}
ports = [port2, port1, port3, port4]
network_ids = ['22222222', '11111111', '33333333']
if __name__ == '__main__':
accessor = lambda x: x['network_id']
ports.sort(key=lambda i: network_ids.index(accessor(i)))
print ports;
11. 捕获Ctrl+C/Ctrl+D
try:
do_some_func()
except KeyboardInterrupt:
print "User Press Ctrl+C,Exit"
except EOFError:
print "User Press Ctrl+D,Exit"