zoukankan      html  css  js  c++  java
  • 好记性不如烂笔头

     带关键字的格式化

    >>> 
    >>> print "Hello %(name)s !" % {'name':'James'}
    Hello James !
    >>> 
    >>> print "Hello {name} !".format(name="James")
    Hello James !
    >>> 
    

      

    使用dict.__missing__() 避免出现KeyError

    If a subclass of dict defines a method __missing__() and key is not present, 
    the d[key] operation calls that method with the key(key as argument). 
    
    The d[key] operation then returns or raises whatever is returned or raised by the __missing__(key) call. 
    
    >>> 
    >>> class Counter(dict):
    ...     def __missing__(self, key):
    ...         return 0
    ... 
    >>> c = Counter()
    >>> print c['num']
    0
    >>> c['num'] += 1
    >>> print c['num']
    1
    >>> 
    >>> c
    {'num': 1}
    >>>
    

      

    __getattr__ 调用默认方法

    >>> 
    >>> class A(object):
    ...     def __init__(self,num):
    ...         self.num = num
    ...         print 'init...'
    ...     def mydefault(self, *args, **kwargs):
    ...         print 'default func...'
    ...         print args
    ...         print kwargs
    ...     def __getattr__(self,name):
    ...             print 'No %(name)s found, goto default...' % {'name':name}
    ...         return self.mydefault
    ... 
    >>> a1 = A(9)
    init...
    >>> a1.fn1()
    No fn1 found, goto default...
    default func...
    ()
    {}
    >>> a1.fn2(1,2)
    No fn2 found, goto default...
    default func...
    (1, 2)
    {}
    >>> a1.fn3(name='standby',age=18)
    No fn3 found, goto default...
    default func...
    ()
    {'age': 18, 'name': 'standby'}
    >>> 
    >>> 
    

      

    obj.xxx = aaa 		触发类的 __setattr__ 
    obj.xxx       		触发类的 __getattr__ 
    obj['xxx'] = 'vvv'	触发类的 __setitem__
    obj['xxx']			触发类的 __getitem__
    
    
    with app1.app_context():    触发	__enter__  __exit__
    

      

    __new__ 和 __init__ 的执行顺序

    >>> 
    >>> class B(object):
    ...     def fn(self):
    ...         print 'B fn'
    ...     def __init__(self):
    ...         print "B INIT"
    ... 
    >>> class A(object):
    ...     def fn(self):
    ...         print 'A fn'
    ...     def __new__(cls,a):
    ...             print "NEW", a
    ...             if a>10:
    ...                 return super(A, cls).__new__(cls)
    ...             return B()
    ...     def __init__(self,a):
    ...         print "INIT", a
    ... 
    >>> 
    >>> a1 = A(5)
    NEW 5
    B INIT
    >>> a1.fn()
    B fn
    >>> a2=A(20)
    NEW 20
    INIT 20
    >>> a2.fn()
    A fn
    >>> 
    

      

     类继承之 __class__

    >>> 
    >>> class A(object):
    ...     def show(self):
    ...         print 'base show'
    ... 
    >>> class B(A):
    ...     def show(self):
    ...         print 'derived show'
    ... 
    >>> obj = B()
    >>> obj.show()
    derived show
    >>> 
    >>> obj.__class__
    <class '__main__.B'>
    >>> 
    >>> obj.__class__ = A
    >>> obj.__class__
    <class '__main__.A'>
    >>> obj.show()
    base show
    >>> 
    

      

    对象方法 __call__

    >>> 
    >>> class A(object):
    ...     def obj_func(self, *args, **kwargs):
    ...             print args
    ...             print kwargs
    ...     def __call__(self, *args, **kwargs):
    ...             print 'Object method ...'
    ...             return self.obj_func(*args, **kwargs)
    ... 
    >>> a1=A()
    >>> a1(9,name='standby',city='beijing')
    Object method ...
    (9,)
    {'city': 'beijing', 'name': 'standby'}
    >>> 
    

    补充:

    >>> 
    >>> class test(object):
    ...     def __init__(self, value):
    ...         self.x = value
    ...     def __call__(self, value):
    ...         return self.x * value
    ... 
    >>> a = test(4)
    >>> print a(5)
    20
    >>> 

     补充

    - 什么后面可以加括号?(只有4种表现形式)
    		- 函数 		执行函数 
    		- 类 		执行类的__init__方法
    		- 方法           obj.func 
    		- 对象 		前提:类里有 __call__ 方法
    					obj()  直接执行类的 __call__方法

    关于类的继承

    >>> 
    >>> class Parent(object):
    ...     x = 1
    ... 
    >>> class Child1(Parent):
    ...     pass
    ... 
    >>> class Child2(Parent):
    ...     pass
    ... 
    >>> Child1.x = 2
    >>> Parent.x = 3
    >>> print Parent.x, Child1.x, Child2.x
    3 2 3
    >>> 

     类属性和对象属性

    类属性
    
    >>> 
    >>> class Student:
    ...     score = []
    ... 
    >>> stu1 = Student()
    >>> stu2 = Student()
    >>> stu1.score.append(99)
    >>> stu1.score.append(96)
    >>> stu2.score.append(98)
    >>> 
    >>> 
    >>> stu2.score
    [99, 96, 98]
    >>> 
    >>>
    
    
    对象属性
    >>> 
    >>> class Student:
    ...     def __init__(self):;
    ...         self.lst = []
    ... 
    >>> stu1 = Student()
    >>> stu2 = Student()
    >>> 
    >>> 
    >>> stu1.lst.append(1)
    >>> stu1.lst.append(2)
    >>> stu2.lst.append(9)
    >>> 
    >>> stu1.lst
    [1, 2]
    >>> 
    >>> stu2.lst
    [9]
    >>>

    一行代码实现列表偶数位加3后求和

    >>> a = [1,2,3,4,5,6]
    >>> [item+3 for item in a if a.index(item)%2==0]
    [4, 6, 8]
    >>> result = sum([item+3 for item in a if a.index(item)%2==0])
    >>> result
    18
    >>>

    字符串连接

    >>> 
    >>> name = 'hi ' 'standby' ' !'
    >>> name
    'hi standby !'
    >>>
    

      

    Python解释器中的 '_'

    _ 即Python解释器上一次返回的值

    >>> 
    >>> range(5)
    [0, 1, 2, 3, 4]
    >>> _
    [0, 1, 2, 3, 4]
    >>> 
    

      

    嵌套列表推导式

    >>> 
    >>> [(i, j) for i in range(3) for j in range(i)]
    [(1, 0), (2, 0), (2, 1)]
    >>> 
    

      

    Python3 中的unpack

    >>> 
    >>> first, second, *rest, last = range(10)
    >>> first
    0
    >>> second
    1
    >>> last
    9
    >>> rest
    [2, 3, 4, 5, 6, 7, 8]
    >>> 
    

      

    关于__setattr__  __getattr__  __getitem__  __setitem__  参考:http://www.cnblogs.com/standby/p/7045718.html

    Python把常用数字缓存在内存里 *****

    >>> 
    >>> a = 1
    >>> b = 1
    >>> a is b
    True
    >>> 
    >>> 
    >>> a = 256
    >>> b = 256
    >>> a is b
    True
    >>> 
    >>> a = 257
    >>> b = 257
    >>> a is b
    False
    >>>
    >>> a = 300
    >>> b = 300
    >>> a is b
    False
    >>> 

    注意:在[-5,256]之间的数字用在内存中的id号是相同的

    Python为了提高运行效率而将这些常用数字缓存到内存里了,所以他们的id号是相同的;

    另外,对a,b,c,....等的赋值也只是一种引用而已

    >>> 
    >>> id(9)
    10183288
    >>> num = 9
    >>> id(num)
    10183288
    >>> 

    Python对于短字符串会使用同一个空间,但是对于长字符串会重新开辟空间

    >>> 
    >>> a = 'I love PythonSomething!'
    >>> b = 'I love PythonSomething!'
    >>> c = [1, 2, 3]
    >>> d = [1, 2, 3]
    >>> 
    >>> a is b
    False
    >>> c is d
    False
    >>> 
    >>> id(a)
    139848068316272
    >>> id(b)
    139848068316336
    >>> id(c)
    139848068310152
    >>> id(d)
    139848068309936
    >>> 
    

    字符串 * 操作

    >>> 
    >>> def func(a):
    ...     a = a + '2'
    ...     a = a*2
    ...     return a
    ... 
    >>> 
    >>> func("hello")
    'hello2hello2'
    >>> 
    

      

    Python浮点数比较

    >>> 
    >>> 0.1
    0.10000000000000001
    >>> 0.2
    0.20000000000000001
    >>> 0.1 + 0.2
    0.30000000000000004
    >>> 
    >>> 0.3
    0.29999999999999999
    >>> 
    >>> 0.1 + 0.2 == 0.3 
    False
    >>> 
    

      

    Python里的 '~' 取反

    >>> 
    >>> 5
    5
    >>> ~5
    -6
    >>> ~~5
    5
    >>> ~~~5
    -6
    >>> ~~~~5
    5
    >>> 
    

    ~5 即对5取反,得到的是 -6 , 为什么?

    参考:https://www.cnblogs.com/piperck/p/5829867.html 和 http://blog.csdn.net/u011080472/article/details/51280919

        - 原码就是符号位加上真值的绝对值;

        - 反码的表示方法是:正数的反码就是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反;

        - 补码的表示方式是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1 (即在反码的基础上+1)

      真值 原码 反码 补码
    5 +000 0101 0000 0101 0000 0101 0000 0101
    -5 -000 0101 1000 0101 1111 1010 1111 1011

    对5取反即对 0000 0101 取反, 得到 1111 1010,那这个值的十进制是多少呢?

    因为 负数在计算机中是以补码形式表示的, 所以实际上就是求哪个值的补码是 1111 1010

    按照上面的规则反向计算:

    1111 1010  减1 得到其反码表示:1111 1001

    在保证符号位不变,其余各位取反:1000 0110 就是该值的原码,对应真值就是 -000 0110 ,对应十进制就是 -6 。

    那么对 -6 取反,得到的是多少呢?

    对-6取反即对 -6 的补码取反,就是对1111 1010取反,得到 0000 0101,很明显是一个正数。

    而正数原码==正数反码==正数补码,所以该值的原码就是 0000 0101,真值就是 +000 0101,对应十进制就是 5。

    bool()

    >>> 
    >>> bool('True')
    True
    >>> bool('False')
    True
    >>> bool('')
    False
    >>> bool()
    False
    >>> 
    >>> 
    >>> bool(1)
    True
    >>> bool(0)
    False
    >>> 
    

      

    等价于

    >>> 
    >>> True==False==False
    False
    >>> 
    >>> True==False and False==False
    False
    >>> 
    

      

    >>> 
    >>> 1 in [0,1]
    True
    >>> 1 in [0,1] == True
    False
    >>> 
    >>> (1 in [0,1]) == True
    True
    >>> 
    >>> 1 in ([0,1] == True)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: argument of type 'bool' is not iterable
    >>> 
    >>> 
    >>> 
    >>> (1 in [0,1]) and ([0,1] == True)
    False
    >>>

    Note that comparisons, membership tests, and identity tests,

    all have the same precedence and have a left-to-right chaining feature as described in the Comparisons section.

    参考:https://stackoverflow.com/questions/31354429/why-is-true-is-false-false-false-in-python

    while 结合 break

    >>> 
    >>> i = 0
    >>> while i < 5:
    ...     print(i)
    ...     i += 1
    ...     if i == 3:
    ...         break
    ... else:
    ...     print(0)
    ... 
    0
    1
    2
    >>> 
    

      

    set给list去重

    >>> 
    >>> nums = set([1,1,2,3,3,3,4])
    >>> 
    >>> nums
    set([1, 2, 3, 4])
    >>> 
    >>> type(nums)
    <type 'set'>
    >>> 
    >>> len(nums)
    4
    >>> 
    >>> 
    >>> li = list(nums)
    >>> li
    [1, 2, 3, 4]
    >>> 
    >>> type(li)
    <type 'list'>
    >>> 
    

    函数是第一类对象(First-Class Object)

    在 Python 中万物皆为对象,函数也不例外,

    函数作为对象可以赋值给一个变量、可以作为元素添加到集合对象中、

    可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的。

    函数可以嵌套,函数中里面嵌套的函数不能在函数外面访问,只能是在函数内部使用:

    def get_length(text):
        def clean(t):
            return t[1:]
        res = clean(text)
        return len(res)
    
    print(get_length('standby'))
    

      

    Python里的高阶函数

    函数接受一个或多个函数作为输入或者函数输出(返回)的值是函数时,我们称这样的函数为高阶函数。

    Python内置函数中,典型的高阶函数是 map 函数,map 接受一个函数和一个迭代对象作为参数,

    调用 map 时,依次迭代把迭代对象的元素作为参数调用该函数。

    def foo(text):
        return len(text)
    
    li = map(foo, ["the","zen","of","python"])
    print(li)        # <map object at 0x0000000001119FD0>
    li = list(li)
    print(li)        # [3, 3, 2, 6]

    lambda应用场景 

        - 函数式编程

    有一个列表: list1 = [3,5,-4,-1,0,-2,-6],需要按照每个元素的绝对值升序排序,如何做?

    # 使用lambda的方式
    >>>
    >>> list1
    [3, 5, -4, -1, 0, -2, -6]
    >>>
    >>> sorted(list1, key=lambda i : abs(i))
    [0, -1, -2, 3, -4, 5, -6]
    >>>
    
    # 不使用lambda的方式
    >>>
    >>> def foo(x):
    ...     return abs(x)
    ...
    >>> sorted(list1, key=foo)
    [0, -1, -2, 3, -4, 5, -6]
    >>>
    

    如何把一个字典按照value进行排序?

    >>>
    >>> dic = {'a': 9, 'c': 3, 'b': 1, 'd': 7, 'f': 12}
    >>> dic
    {'a': 9, 'f': 12, 'c': 3, 'd': 7, 'b': 1}
    >>>
    >>> from collections import Iterable
    >>> isinstance(dic.items(),Iterable)
    True
    >>>
    >>> dic.items()
    dict_items([('a', 9), ('f', 12), ('c', 3), ('d', 7), ('b', 1)])
    >>>
    >>> sorted(dic.items(), key=lambda x:x[1])
    [('b', 1), ('c', 3), ('d', 7), ('a', 9), ('f', 12)]
    >>>

    2019-08-20补充示例:列表排序

    In [57]: ver                                                                                                                                                                                                                              
    Out[57]: 
    ['10.3',
     '15.100',
     '10.50',
     '2.3',
     '10.30',
     '2.1',
     '10.0',
     '10.6',
     '10.20',
     '4.0',
     '3.0',
     '10.2',
     '10.8',
     '10.1',
     '15.0',
     '10.10',
     '10.9']
    
    In [58]: ver.sort(key=lambda x:tuple(int(v) for v in x.split(".")), reverse=True)                                                                                                                                                         
    
    In [59]: ver                                                                                                                                                                                                                              
    Out[59]: 
    ['15.100',
     '15.0',
     '10.50',
     '10.30',
     '10.20',
     '10.10',
     '10.9',
     '10.8',
     '10.6',
     '10.3',
     '10.2',
     '10.1',
     '10.0',
     '4.0',
     '3.0',
     '2.3',
     '2.1']
    
    In [60]: 

      - 闭包

    # 不用lambda的方式
    >>>
    >>> def my_add(n):
    ...     def wrapper(x):
    ...         return x+n
    ...     return wrapper
    ...
    >>> add_3 = my_add(3)
    >>> add_3(7)
    10
    >>>
    
    # 使用lambda的方式
    >>>
    >>> def my_add(n):
    ...     return lambda x:x+n
    ...
    >>> add_3 = my_add(3)
    >>> add_3(7)
    10
    >>>
    

      

    方法和函数的区别

    #!/usr/bin/python3
    
    from types import MethodType,FunctionType
    
    class Foo(object):
        def __init__(self):
            pass
        def func(self):
            print('func...')
    
    obj = Foo()
    print(obj.func)  # 自动传递 self 
    # <bound method Foo.func of <__main__.Foo object at 0x7f86121505f8>>
    print(Foo.func)
    # <function Foo.func at 0x7f861214e488>
    
    print(isinstance(obj.func,MethodType))         # True
    print(isinstance(obj.func,FunctionType))       # False
    
    print(isinstance(Foo.func,MethodType))         # False
    print(isinstance(Foo.func,FunctionType))       # True
    

    时间戳转换成年月日时分秒

    >>> from datetime import datetime
    >>> ts=1531123200
    >>> date_str = datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
    >>> date_str
    '2018-07-09 16:00:00'
    >>> 
    In [11]: import time                                                                                                                                                                                                                      
    
    In [12]: ts = int(time.time())                                                                                                                                                                                                            
    
    In [13]: ts                                                                                                                                                                                                                               
    Out[13]: 1559549982
    
    In [14]: time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ts))                                                                                                                                                                           
    Out[14]: '2019-06-03 16:19:42'
    
    In [15]: 

    年月日时分秒转换成时间戳

    >>> date_str
    '2018-07-09 16:00:00'
    >>> 
    >>> date_struct=time.strptime(date_str,'%Y-%m-%d %H:%M:%S')
    >>> date_struct
    time.struct_time(tm_year=2018, tm_mon=7, tm_mday=9, tm_hour=16, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=190, tm_isdst=-1)
    >>> 
    >>> int(time.mktime(date_struct))
    1531123200
    >>> 
    In [16]: d                                                                                                                                                                                                                                
    Out[16]: '2019-06-03 16:19:42'
    
    In [17]: time.mktime(time.strptime(d, "%Y-%m-%d %H:%M:%S"))                                                                                                                                                                               
    Out[17]: 1559549982.0
    
    In [18]: 

    获取当前月初和月末时间戳

    >>> import time
    >>> import datetime
    >>> 
    >>> start_st = datetime.datetime.now()
    >>> start_st
    datetime.datetime(2018, 7, 17, 16, 45, 39, 95228)
    >>> startts = int(time.mktime((start_st.year, start_st.month-1, 1, 0, 0, 0, 0, 0, -1)))
    >>> startts    # 当前月初时间戳
    1527782400
    >>> 
    >>> stopts = int(time.mktime((start_st.year, start_st.month, 1, 0, 0, 0, 0, 0, -1))) - 1
    >>> stopts
    1530374399     # 当前月末时间戳
    >>>

    IP地址转换成数字,从而进行比较,适用于地址库

    # 方法一:手动计算
    
    In [62]: ip                                                                                                                                                                                                                               
    Out[62]: '10.3.81.150'
    
    In [63]: ip.split('.')[::-1]                                                                                                                                                                                                              
    Out[63]: ['150', '81', '3', '10']
    
    In [64]: [ '{}-{}'.format(idx,num) for idx,num in enumerate(ip.split('.')[::-1]) ]                                                                                                                                                        
    Out[64]: ['0-150', '1-81', '2-3', '3-10']
    
    In [65]: [256**idx*int(num) for idx,num in enumerate(ip.split('.')[::-1])]                                                                                                                                                                
    Out[65]: [150, 20736, 196608, 167772160]
    
    In [66]: sum([256**idx*int(num) for idx,num in enumerate(ip.split('.')[::-1])])                                                                                                                                                           
    Out[66]: 167989654
    
    In [67]:
    
    # 方法二:使用C扩展库来计算
    In [71]: import socket,struct                                                                                                                                                                                                             
    
    In [72]: socket.inet_aton(ip)                                                                                                                                                                                                             
    Out[72]: b'
    x03Qx96'
    
    In [73]: struct.unpack("!I", socket.inet_aton(ip))     # !表示使用网络字节顺序解析, 后面的I表示unsigned int, 对应Python里的integer or long                                                                                                                                                                         
    Out[73]: (167989654,)
    
    In [74]: struct.unpack("!I", socket.inet_aton(ip))[0]                                                                                                                                                                                     
    Out[74]: 167989654
    
    In [75]: socket.inet_ntoa(struct.pack("!I", 167989654))                                                                                                                                                                                   
    Out[75]: '10.3.81.150'
    
    In [76]: 

    使用yield逐行读取多个文件并合并

    #!/usr/bin/python2.7
    
    def get_line_by_yield():
        with open('total.txt','r') as rf_total, open('extra.txt','r') as rf_extra:
            for line in rf_total:
                extra = rf_extra.readline()
                lst = line.strip().split() + extra.strip().split()
                yield lst
    
    with open('new_total.txt','w') as wf:
        for lst in get_line_by_yield():
            wf.write('%s
    ' % ''.join(map(lambda i: str(i).rjust(20), lst)))

    逐行读取

    def read_line(path):
        with open(path,'r') as rf:
            for line in rf:
                yield line
    

      

    检查进程是否 running

    In [16]: import signal
    
    In [17]: from os import kill
    
    In [18]: kill(17335, 0)    # 17335 是进程ID,第二个参数传0/signal.SIG_DFL 返回值若是None则表示正在运行
    
    In [19]: kill(17335, 15)   # 给进程传递15/signal.SIGTERM,即终止该进程
    
    In [20]: kill(17335, 0)    # 再次检查发现该进程已经不再running,则raise一个OSError
    ---------------------------------------------------------------------------
    OSError                                   Traceback (most recent call last)
    <ipython-input-20-cbb7c9624124> in <module>()
    ----> 1 kill(17335, 0)
    
    OSError: [Errno 3] No such process
    
    In [21]: 
      1 In [12]: import signal
      2 
      3 In [13]: signal.SIGKILL
      4 Out[13]: 9
      5 
      6 In [14]: signal.SIGTERM
      7 Out[14]: 15
      8 
      9 In [15]: signal.__dict__.items()
     10 Out[15]: 
     11 [('SIGHUP', 1),
     12  ('SIG_DFL', 0),
     13  ('SIGSYS', 31),
     14  ('SIGQUIT', 3),
     15  ('SIGUSR1', 10),
     16  ('SIGFPE', 8),
     17  ('SIGPWR', 30),
     18  ('SIGTSTP', 20),
     19  ('ITIMER_REAL', 0L),
     20  ('SIGCHLD', 17),
     21  ('SIGCONT', 18),
     22  ('SIGIOT', 6),
     23  ('SIGBUS', 7),
     24  ('SIGXCPU', 24),
     25  ('SIGPROF', 27),
     26  ('SIGCLD', 17),
     27  ('SIGUSR2', 12),
     28  ('default_int_handler', <function signal.default_int_handler>),
     29  ('pause', <function signal.pause>),
     30  ('SIGKILL', 9),
     31  ('NSIG', 65),
     32  ('SIGTRAP', 5),
     33  ('SIGINT', 2),
     34  ('SIGIO', 29),
     35  ('__package__', None),
     36  ('getsignal', <function signal.getsignal>),
     37  ('SIGILL', 4),
     38  ('SIGPOLL', 29),
     39  ('SIGABRT', 6),
     40  ('SIGALRM', 14),
     41  ('__doc__',
     42   'This module provides mechanisms to use signal handlers in Python.
    
    Functions:
    
    alarm() -- cause SIGALRM after a specified time [Unix only]
    setitimer() -- cause a signal (described below) after a specified
                   float time and the timer may restart then [Unix only]
    getitimer() -- get current value of timer [Unix only]
    signal() -- set the action for a given signal
    getsignal() -- get the signal action for a given signal
    pause() -- wait until a signal arrives [Unix only]
    default_int_handler() -- default SIGINT handler
    
    signal constants:
    SIG_DFL -- used to refer to the system default handler
    SIG_IGN -- used to ignore the signal
    NSIG -- number of defined signals
    SIGINT, SIGTERM, etc. -- signal numbers
    
    itimer constants:
    ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon
                   expiration
    ITIMER_VIRTUAL -- decrements only when the process is executing,
                   and delivers SIGVTALRM upon expiration
    ITIMER_PROF -- decrements both when the process is executing and
                   when the system is executing on behalf of the process.
                   Coupled with ITIMER_VIRTUAL, this timer is usually
                   used to profile the time spent by the application
                   in user and kernel space. SIGPROF is delivered upon
                   expiration.
    
    
    *** IMPORTANT NOTICE ***
    A signal handler function is called with two arguments:
    the first is the signal number, the second is the interrupted stack frame.'),
     43  ('SIG_IGN', 1),
     44  ('getitimer', <function signal.getitimer>),
     45  ('SIGURG', 23),
     46  ('SIGPIPE', 13),
     47  ('SIGWINCH', 28),
     48  ('__name__', 'signal'),
     49  ('SIGTERM', 15),
     50  ('SIGVTALRM', 26),
     51  ('ITIMER_PROF', 2L),
     52  ('SIGRTMIN', 34),
     53  ('SIGRTMAX', 64),
     54  ('ITIMER_VIRTUAL', 1L),
     55  ('set_wakeup_fd', <function signal.set_wakeup_fd>),
     56  ('setitimer', <function signal.setitimer>),
     57  ('signal', <function signal.signal>),
     58  ('SIGSEGV', 11),
     59  ('siginterrupt', <function signal.siginterrupt>),
     60  ('SIGXFSZ', 25),
     61  ('SIGTTIN', 21),
     62  ('SIGSTOP', 19),
     63  ('ItimerError', signal.ItimerError),
     64  ('SIGTTOU', 22),
     65  ('alarm', <function signal.alarm>)]
     66 
     67 In [16]: dict((k, v) for v, k in reversed(sorted(signal.__dict__.items()))
     68     ...:     if v.startswith('SIG') and not v.startswith('SIG_'))
     69 Out[16]: 
     70 {1: 'SIGHUP',
     71  2: 'SIGINT',
     72  3: 'SIGQUIT',
     73  4: 'SIGILL',
     74  5: 'SIGTRAP',
     75  6: 'SIGABRT',
     76  7: 'SIGBUS',
     77  8: 'SIGFPE',
     78  9: 'SIGKILL',
     79  10: 'SIGUSR1',
     80  11: 'SIGSEGV',
     81  12: 'SIGUSR2',
     82  13: 'SIGPIPE',
     83  14: 'SIGALRM',
     84  15: 'SIGTERM',
     85  17: 'SIGCHLD',
     86  18: 'SIGCONT',
     87  19: 'SIGSTOP',
     88  20: 'SIGTSTP',
     89  21: 'SIGTTIN',
     90  22: 'SIGTTOU',
     91  23: 'SIGURG',
     92  24: 'SIGXCPU',
     93  25: 'SIGXFSZ',
     94  26: 'SIGVTALRM',
     95  27: 'SIGPROF',
     96  28: 'SIGWINCH',
     97  29: 'SIGIO',
     98  30: 'SIGPWR',
     99  31: 'SIGSYS',
    100  34: 'SIGRTMIN',
    101  64: 'SIGRTMAX'}
    102 
    103 In [17]: 
    signal数字和代号的映射关系
    1 def check_if_process_is_alive(self):
    2         try:
    3             kill(self.current_pid, 0)
    4             kill(self.parent_pid, 0)
    5         except:
    6             # do something...
    7             exit(0)
    应用

      参考:https://stackoverflow.com/questions/13399734/how-to-find-out-when-subprocess-has-terminated-after-using-os-kill

    多指标排序问题

    In [26]: lst = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    
    In [27]: import operator
    
    In [28]: sorted(lst, key=operator.itemgetter(1))
    Out[28]: [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    
    In [29]: sorted(lst, key=operator.itemgetter(1,2))  # 先根据第二个域排序,然后再根据第三个域排序
    Out[29]: [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
    
    In [30]: 
    

      

    两个纯数字列表元素个数相等,按序相加求和,得到一个新的列表

    length = len(lst1)
    lst = reduce(lambda x,y:[x[i]+y[i] for i in range(length)], [lst1,lst2], [0]*length)

    或者直接使用numpy.array

    补充reduce+lambda合并多个列表

    In [15]: lst = [[1,2,3],['a','c'],['hello','world'],[2,2,2,111]]
    
    In [16]: reduce(lambda x,y: x+y, lst)
    Out[16]: [1, 2, 3, 'a', 'c', 'hello', 'world', 2, 2, 2, 111]
    
    In [17]: 

    扩展示例1:

    lst= [[{u'timestamp': 1545214320, u'value': 222842128},
      {u'timestamp': 1545214380, u'value': 224080288},
      {u'timestamp': 1545214440, u'value': 253812496},
      {u'timestamp': 1545214500, u'value': 295170240},
      {u'timestamp': 1545214560, u'value': 221196224},
      {u'timestamp': 1545214620, u'value': 252992096}],
     [{u'timestamp': 1545214320, u'value': 228121600},
      {u'timestamp': 1545214380, u'value': 225682656},
      {u'timestamp': 1545214440, u'value': 256428064},
      {u'timestamp': 1545214500, u'value': 292691424},
      {u'timestamp': 1545214560, u'value': 241462336},
      {u'timestamp': 1545214620, u'value': 250864528}],
     [{u'timestamp': 1545214320, u'value': 232334304},
      {u'timestamp': 1545214380, u'value': 230452032},
      {u'timestamp': 1545214440, u'value': 246094880},
      {u'timestamp': 1545214500, u'value': 260281088},
      {u'timestamp': 1545214560, u'value': 233277120},
      {u'timestamp': 1545214620, u'value': 258726192}]]
    
    # 要求:把上述列表合并
    # 方法一:使用Python内置函数
    In [83]: reduce(lambda x,y:[ { 'timestamp':x[i]['timestamp'], 'value':x[i]['value']+y[i]['value'] } for i in range(6) ], a)
    Out[83]: 
    [{'timestamp': 1545214320, 'value': 683298032},
     {'timestamp': 1545214380, 'value': 680214976},
     {'timestamp': 1545214440, 'value': 756335440},
     {'timestamp': 1545214500, 'value': 848142752},
     {'timestamp': 1545214560, 'value': 695935680},
     {'timestamp': 1545214620, 'value': 762582816}]
    
    In [84]:
    
    # 方法二:笨办法
     In [87]: b = a.pop(0)
    
    In [88]: 
    
    In [88]: for i in a:
        ...:     for idx in range(len(i)):
        ...:         b[idx]['value'] += i[idx]['value']
        ...:         
    
    In [89]: b
    Out[89]: 
    [{u'timestamp': 1545214320, u'value': 683298032},
     {u'timestamp': 1545214380, u'value': 680214976},
     {u'timestamp': 1545214440, u'value': 756335440},
     {u'timestamp': 1545214500, u'value': 848142752},
     {u'timestamp': 1545214560, u'value': 695935680},
     {u'timestamp': 1545214620, u'value': 762582816}]
    
    In [90]: 

    扩展示例2:

    In [48]: a
    Out[48]: 
    [{'A078102C949EC2AB': [1, 2, 3, 4]},
     {'457D37015E77700E': [2, 2, 2, 2]},
     {'5095060C4552175D': [3, 3, 3, 3]}]
    
    In [49]: reduce(lambda x,y: dict(x.items()+y.items()), a)
    Out[49]: 
    {'457D37015E77700E': [2, 2, 2, 2],
     '5095060C4552175D': [3, 3, 3, 3],
     'A078102C949EC2AB': [1, 2, 3, 4]}
    
    In [50]: 

    awk指定字段求和

    awk -F '=' '{count+=$4} END{print count}' file.log
    

    找出在列表1中但不在列表2中的元素

    list(set(lst1).difference(set(lst2)))
    

      

    解析url,把字段转换成字典

    # 方法一
    In [5]: url = 'index?name=standby&age=18&city=beijing'
    
    In [6]: parameter = url.split('?')[1]
    
    In [7]: parameter
    Out[7]: 'name=standby&age=18&city=beijing'
    
    In [8]: dict(map(lambda x:x.split('='),parameter.split('&')))
    Out[8]: {'age': '18', 'city': 'beijing', 'name': 'standby'}
    
    In [9]: 
    
    
    # 方法二
    In [9]: import urlparse
    
    In [10]: query = urlparse.urlparse(url).query
    
    In [11]: query
    Out[11]: 'name=standby&age=18&city=beijing'
    
    In [12]: dict([(k, v[0]) for k, v in urlparse.parse_qs(query).items()])
    Out[12]: {'age': '18', 'city': 'beijing', 'name': 'standby'}
    
    In [13]: 
    

    fromkeys使用的陷阱

    In [1]: a = dict.fromkeys(['k1','k2','k3'],{})
    
    In [2]: a
    Out[2]: {'k1': {}, 'k2': {}, 'k3': {}}
    
    In [3]: a['k1']['2018-10-10'] = 'hi'
    
    In [4]: a
    Out[4]: 
    {'k1': {'2018-10-10': 'hi'},
     'k2': {'2018-10-10': 'hi'},
     'k3': {'2018-10-10': 'hi'}}
    
    In [5]: 
    
    In [5]: a = dict.fromkeys(['k1','k2','k3'],[])
    
    In [6]: a['k1'].append(999)
    
    In [7]: a
    Out[7]: {'k1': [999], 'k2': [999], 'k3': [999]}
    
    In [8]: 
    
    In [8]: a = dict.fromkeys(['k1','k2','k3'],0)
    
    In [9]: a['k1'] += 9
    
    In [10]: a
    Out[10]: {'k1': 9, 'k2': 0, 'k3': 0}
    
    In [11]: 
    

      

    dateutil库解析时间对象

    In [76]: import datetime                                                                                                                                                                          
    
    In [77]: datetime.datetime.strptime('2019-04-10','%Y-%m-%d')                                                                                                                                      
    Out[77]: datetime.datetime(2019, 4, 10, 0, 0)
    
    In [78]: import dateutil                                                                                                                                                                          
    
    In [79]: dateutil.parser.parse('2019-04-10')                                                                                                                                                      
    Out[79]: datetime.datetime(2019, 4, 10, 0, 0)
    
    In [80]: dateutil.parser.parse('2019/04/10')                                                                                                                                                      
    Out[80]: datetime.datetime(2019, 4, 10, 0, 0)
    
    In [81]: dateutil.parser.parse('04/10/2019')                                                                                                                                                      
    Out[81]: datetime.datetime(2019, 4, 10, 0, 0)
    
    In [82]: dateutil.parser.parse('2019-Apr-10')                                                                                                                                                     
    Out[82]: datetime.datetime(2019, 4, 10, 0, 0)
    
    In [83]: 
    

    合并多个字典

    # Python2.7
    # 这种方式对资源的一种浪费
    # 注意这种方式在Python3中会报错:TypeError: unsupported operand type(s) for +: 'dict_items' and 'dict_items'
    
    In [7]: lst
    Out[7]: 
    [{'k1': [1, 1, 1, 1, 1, 1]},
     {'k3': [3, 3, 3, 4, 4, 4]},
     {'k5': [5, 5, 5, 6, 6, 6]}]
    
    In [8]: reduce(lambda x,y: dict(x.items()+y.items()), lst)
    Out[8]: {'k1': [1, 1, 1, 1, 1, 1], 'k3': [3, 3, 3, 4, 4, 4], 'k5': [5, 5, 5, 6, 6, 6]}
    
    In [9]: 
    
    
    # Python3.6
    In [67]: lst                                                                                                                                                                                                                              
    Out[67]: 
    [{'k1': [1, 1, 1, 1, 1, 1]},
     {'k3': [3, 3, 3, 4, 4, 4]},
     {'k5': [5, 5, 5, 6, 6, 6]}]
    
    In [68]: reduce(lambda x,y: {**x,**y}, lst)                                                                                                                                                                                               
    Out[68]: {'k1': [1, 1, 1, 1, 1, 1], 'k3': [3, 3, 3, 4, 4, 4], 'k5': [5, 5, 5, 6, 6, 6]}
    
    In [69]:
    
    
    # 另外补充两种兼容Py2和Py3的方法:
    # 1. 使用字典的构造函数
    reduce(lambda x,y: dict(x, **y), lst)
    # 2. 笨办法
    {k: v for d in lst for k, v in d.items()}
    

      

    zip的反操作/unzip

    In [2]: lst                                                                                                                                                                                                                               
    Out[2]: 
    [[1560239100, 16],
     [1560239400, 11],
     [1560239700, 14],
     [1560240000, 18],
     [1560240300, 18],
     [1560240600, 12],
     [1560240900, 19],
     [1560241200, 13],
     [1560241500, 16],
     [1560241800, 16]]
    
    In [3]: tss,vals = [ list(tpe) for tpe in zip(*[ i for i in lst ]) ]                                                                                                                                                                      
    
    In [4]: tss                                                                                                                                                                                                                               
    Out[4]: 
    [1560239100,
     1560239400,
     1560239700,
     1560240000,
     1560240300,
     1560240600,
     1560240900,
     1560241200,
     1560241500,
     1560241800]
    
    In [5]: vals                                                                                                                                                                                                                              
    Out[5]: [16, 11, 14, 18, 18, 12, 19, 13, 16, 16]
    
    In [6]: 
    

    获取前一天时间并格式化

    In [17]: from datetime import timedelta, datetime                                                                                                                                                                                         
    
    In [18]: yesterday = datetime.today() + timedelta(-1)                                                                                                                                                                                     
    
    In [19]: yesterday.strftime('%Y%m%d')                                                                                                                                                                                                     
    Out[19]: '20190702'
    
    In [20]: 
    

      

     时序数据列表转换位字典结构

    In [87]: lst                                                                                                                                                                                                                              
    Out[87]: 
    [(1562653200, 16408834),
     (1562653500, 16180209),
     (1562653800, 16178061),
     (1562654100, 16147492),
     (1562654400, 16103304),
     (1562654700, 16182462),
     (1562655000, 16334665),
     (1562655300, 15440130),
     (1562655600, 15433254),
     (1562655900, 16607189)]
    
    In [88]: { ts:value for ts,value in lst }                                                                                                                                                                                                 
    Out[88]: 
    {1562653200: 16408834,
     1562653500: 16180209,
     1562653800: 16178061,
     1562654100: 16147492,
     1562654400: 16103304,
     1562654700: 16182462,
     1562655000: 16334665,
     1562655300: 15440130,
     1562655600: 15433254,
     1562655900: 16607189}
    
    In [89]: 
    

      

    JavaScript实现table点击列头自动排序

     1 function comparer(index) {
     2      return function(a, b) {
     3        var valA = getCellValue(a, index),
     4          valB = getCellValue(b, index);
     5        return $.isNumeric(valA) && $.isNumeric(valB) ?
     6          valA - valB : valA.localeCompare(valB);
     7      };
     8 }
     9 function getCellValue(row, index) {
    10     return $(row).children('td').eq(index).text();
    11 }
    12 $(document).on('click', 'th', function() {
    13     var table = $(this).parents('table').eq(0);
    14     var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index()));
    15     this.asc = !this.asc;
    16     if (!this.asc) {
    17       rows = rows.reverse();
    18     }
    19     table.children('tbody').empty().html(rows);
    20 });

    模拟登录

    1 #1 curl 模拟登录并请求数据
    2 curl -X GET -u username:password "http://...."
    3 
    4 #2 python requests 模拟登录并请求数据
    5 import requests
    6 from requests.auth import HTTPBasicAuth
    7 requests.get("http://....",auth=HTTPBasicAuth(username, password))

    IP地址排序

    In [37]: ips                                                                                                                                                                                                                              
    Out[37]: 
    ['10.0.9.11',
     '10.13.8.1',
     '10.8.1.12',
     '10.0.120.99',
     '10.8.1.110',
     '10.0.13.12']
    
    In [38]: sorted(ips)                                                                                                                                                                                                                      
    Out[38]: 
    ['10.0.120.99',
     '10.0.13.12',
     '10.0.9.11',
     '10.13.8.1',
     '10.8.1.110',
     '10.8.1.12']
    
    In [39]: sorted(ips, key=lambda x:''.join([ i.rjust(3,'0') for i in x.split('.') ]))                                                                                                                                                      
    Out[39]: 
    ['10.0.9.11',
     '10.0.13.12',
     '10.0.120.99',
     '10.8.1.12',
     '10.8.1.110',
     '10.13.8.1']
    
    In [40]: 
    

      

    生成随机字符串

    In [7]: import random                                                                                                                                                                                                                     
    
    In [8]: import string                                                                                                                                                                                                                     
    
    In [9]: def id_generator(size): 
       ...:     chars = string.ascii_letters+string.digits 
       ...:     return ''.join(random.choice(chars) for _ in range(size)) 
       ...:                                                                                                                                                                                                                                   
    
    In [10]: id_generator(9)                                                                                                                                                                                                                  
    Out[10]: 'fL58Mqb7p'
    
    In [11]: id_generator(9)                                                                                                                                                                                                                  
    Out[11]: 'dijygQlZZ'
    
    In [13]: id_generator(12)                                                                                                                                                                                                                 
    Out[13]: 'k4Vki2BxREIy'
    
    In [14]: id_generator(7)                                                                                                                                                                                                                  
    Out[14]: 'N6sZmGK'
    
    In [15]: 
    

      

  • 相关阅读:
    "废物利用"也抄袭——“完全”DIY"绘图仪"<三、上位机程序设计>
    "废物利用"也抄袭——“完全”DIY"绘图仪"<二、下位机程序设计>
    "废物利用"也抄袭——“完全”DIY"绘图仪"<一、准备工作>
    我还活着,我回来了
    链表的基础操作专题小归纳
    文件的基础操作专题小归纳
    正整数序列 Help the needed for Dexter ,UVa 11384
    偶数矩阵 Even Parity,UVa 11464
    洛谷-跑步-NOI导刊2010提高
    洛谷-关押罪犯-NOIP2010提高组复赛
  • 原文地址:https://www.cnblogs.com/standby/p/8279719.html
Copyright © 2011-2022 走看看