Python笔记

声明:

本博客欢迎转发,但请保留原作者信息!

新浪微博:@孔令贤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]
使用:
>>> get_ip_address('lo')
'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异常

有时用dict[key]这个读取会报KeyError异常,因为实际上是调用了__getitem__方法。而dict.get方法主要是提供一个取不到对应key的value就返回默认值的功能。
说明:
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"



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值