zoukankan      html  css  js  c++  java
  • 全面Python小抄(转)

    add by zhj: 有些地方不正确,有时间再改吧

    原文:Python Cheat Sheet

    Cheat sheet of Python. Some basic concepts for Python programmer need to know.

    Python Naming Styles

    # see: PEP8
    # for public use
    var
    
    # for internal use
    _var
    
    # convention to avoid conflict keyword 
    var_
    
    # for private use in class
    __var
    
    # for protect use in class
    _var_
    
    # "magic" method or attributes
    # ex: __init__, __file__, __main__
    __var__
    
    # for "internal" use throwaway variable 
    # usually used in loop
    # ex: [_ for _ in range(10)]
    # or variable not used
    # for _, a in [(1,2),(3,4)]: print a
    _

    Check object attributes

    # example of check list attributes
    >>> dir(list)
    ['__add__', '__class__', ...]

    Define a function __doc__

    # Define a function document
    >>> def Example():
    ...   """ This is an example function """
    ...   print "Example function"
    ...
    >>> Example.__doc__
    ' This is an example function '
    
    # Or using help function
    >>> help(Example)

    Check instance type

    >>> ex = 10
    >>> isinstance(ex,int)
    True

    Check, Get, Set attribute

    >>> class example(object):
    ...   def __init__(self):
    ...     self.name = "ex"
    ...   def printex(self):
    ...     print "This is an example"
    ... 
    
    # Check object has attributes
    # hasattr(obj, 'attr')
    >>> ex = example()
    >>> hasattr(ex,"name")
    True
    >>> hasattr(ex,"printex")
    True
    >>> hasattr(ex,"print")
    False
    
    # Get object attribute
    # getattr(obj, 'attr')
    >>> getattr(ex,'name')
    'ex'
    
    # Set object attribute
    # setattr(obj, 'attr', value)
    >>> setattr(ex,'name','example')
    >>> ex.name
    'example'

    Check inheritance

    >>> class example(object):
    ...   def __init__(self):
    ...     self.name = "ex"
    ...   def printex(self):
    ...     print "This is an example"
    ... 
    >>> issubclass(example,object)
    True

    Check all global variables

    # globals() return a dictionary
    # {'variable name': variable value}
    >>> globals()
    {'args': (1, 2, 3, 4, 5), ...}

    Check "callable"

    >>> a = 10
    >>> def fun():
    ...   print "I am callable"
    ... 
    >>> callable(a)
    False
    >>> callable(fun)
    True

    Common Use "Magic"

    # see python document: data model 
    # For command class
    __main__
    __name__
    __file__
    __module__
    __all__
    __dict__
    __class__
    __doc__
    __init__(self, [...)
    __str__(self)
    __repr__(self)
    __del__(self)
    
    # For Descriptor
    __get__(self, instance, owner)
    __set__(self, instance, value)
    __delete__(self, instance)
    
    # For Context Manager
    __enter__(self)
    __exit__(self, exc_ty, exc_val, tb)
    
    # Emulating container types
    __len__(self)
    __getitem__(self, key)
    __setitem__(self, key, value)
    __delitem__(self, key)
    __iter__(self)
    __contains__(self, value)
    
    # Controlling Attribute Access
    __getattr__(self, name)
    __setattr__(self, name, value)
    __delattr__(self, name)
    __getattribute__(self, name)
    
    # Callable object
    __call__(self, [args...])
    
    # Compare related
    __cmp__(self, other)
    __eq__(self, other)
    __ne__(self, other)
    __lt__(self, other)
    __gt__(self, other)
    __le__(self, other)
    __ge__(self, other)
    
    # arithmetical operation related
    __add__(self, other)
    __sub__(self, other)
    __mul__(self, other)
    __div__(self, other)
    __mod__(self, other)
    __and__(self, other)
    __or__(self, other)
    __xor__(self, other)

    Arithmetic operators and Comparison

    class example(object):
    
       def __init__(self,val1,val2):
          self.val1 = val1
          self.val2 = val2
       def __add__(self,other):
          _1 = self.val1 + other.val1
          _2 = self.val2 + other.val2
          return _1 + _2
    
       def __sub__(self,other):
          _1 = self.val1 - other.val1
          _2 = self.val2 - other.val2
          return _1 - _2
    
       def __mul__(self,other):
          _1 = self.val1 * other.val1
          _2 = self.val2 * other.val2
          return _1 * _2
    
       def __div__(self,other):
          _1 = self.val1 / other.val1
          _2 = self.val2 / other.val2
          return _1 / _2
    
       def __mod__(self,other):
          _1 = self.val1 % other.val1
          _2 = self.val2 % other.val2
          return _1 % _2
       
       def __eq__(self,other):
          if self.val1 == other.val1 and
                self.val2 == other.val2:
             return True
          return False
    
       def __ne__(self,other):
          if self.val1 != other.val1 or
                self.val2 != other.val2:
             return True
          return False
       
       def __lt__(self,other):
          if self.val1 < other.val1 or
                self.val2 < other.val2:
             return True
          return False
    
       def __gt__(self,other):
          if self.val1 > other.val1 or
                self.val2 > other.val2:
             return True
          return False
    
       def __le__(self,other):
          if self.val1 <= other.val1 or
                self.val2 <= other.val2:
             return True
          return False
    
       def __ge__(self,other):
          if self.val1 >= other.val1 or
                self.val2 >= other.val2:
             return True
          return False
    
    # example result:
    >>> ex1 = example(1.,2.)
    >>> ex2 = example(3.,4.)
    >>> ex1+ex2
    10.0
    >>> ex1-ex2
    0.0
    >>> ex1*ex2
    24.0
    >>> ex1/ex2
    0.6666666666666666
    >>> ex1%ex2
    1.0
    >>> ex1>ex2
    False
    >>> ex1<ex2
    True
    >>> ex1==ex2
    False

    Representations of your class behave

    >>> class example(object):
    ...    def __str__(self):
    ...       return "example __str__"
    ...    def __repr__(self):
    ...       return "example __repr__"
    ... 
    >>> print str(example())
    example __str__
    >>> example()
    example __repr__

    Get list item "SMART"

    >>> a = [1,2,3,4,5]
    >>> a[0]
    1
    >>>a[-1]
    5
    >>> a[0:]
    [1,2,3,4,5]
    >>> a[:-1]
    [1,2,3,4]
    
    # a[start:end:step]
    >>> a[0:-1:2]
    [1,3]
    
    # using slice object
    # slice(start,end,step)
    >>> s = slice(0,-1,2)
    >>> a[s]
    [1,3]
    
    # Get index and item in loop
    >>> a = range(3)
    >>> for idx,item in enumerate(a):
    ...   print (idx,item),
    ... 
    (0, 0) (1, 1) (2, 2)
    
    # with filter
    >>> [x for x in range(5) if x>1]
    [2, 3, 4]
    >>> _ = ['1','2',3,'Hello',4]
    >>> f = lambda x: isinstance(x,int)
    >>> filter(f,_)
    [3, 4]

    Get dictionary item "SMART"

    # get dictionary all keys
    >>> a={"1":1,"2":2,"3":3}
    >>> b={"2":2,"3":3,"4":4}
    >>> a.keys()
    ['1', '3', '2']
    
    # get dictionary key and value as tuple
    >>> a.items()
    [('1', 1), ('3', 3), ('2', 2)]
    
    # find same key between two dictionary
    >>> [_ for _ in a.keys() if _ in b.keys()]
    ['3', '2']
    # better way
    >>> c = set(a).intersection(set(b))
    >>> list(c)
    ['3', '2']
    # or
    >>> [_ for _ in a if _ in b]
    ['3', '2']
    
    # update dictionary
    >>> a.update(b)
    >>> a
    {'1': 1, '3': 3, '2': 2, '4': 4}

    Set a list/dict "SMART"

    # get a list with init value
    >>> ex = [0]*10
    >>> ex
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    
    # using generator
    >>> [x for x in range(10)]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> fn = lambda x: x**2
    >>> [fn(x) for x in range(5)]
    [0, 1, 4, 9, 16]
    >>> {'{0}'.format(x): x for x in range(3)}
    {'1': 1, '0': 0, '2': 2}
    
    # using builtin function "map"
    >>> map(fn,range(5))
    [0, 1, 4, 9, 16] 

    Delegating Iteration (__iter__)

    # __iter__ return an iterator object
    # Be careful: list is an "iterable" object not an "iterator" 
    >>> class example(object):
    ...    def __init__(self,list_):
    ...       self._list = list_
    ...    def __iter__(self):
    ...    return iter(self._list)
    ...
    >>> ex = example([1,2,3,4,5])
    >>> for _ in ex: print _,
    ...
    1 2 3 4 5

    Using Generator as Iterator

    # see: PEP289
    >>> a = (_ for _ in range(10))
    >>> for _ in a: print _,
    ... 
    0 1 2 3 4 5 6 7 8 9
    
    # equivalent to
    >>> def _gen():
    ...   for _ in range(10):
    ...     yield _
    ... 
    >>> a = _gen()
    >>> for _ in a: print _,
    ... 
    0 1 2 3 4 5 6 7 8 9 

    Emulating a list

    >>> class emulist(object):
    ...   def __init__(self,list_):
    ...     self._list = list_
    ...   def __repr__(self):
    ...     return "emulist: "+str(self._list)
    ...   def append(self,item):
    ...     self._list.append(item)
    ...   def remove(self,item):
    ...     self._list.remove(item)
    ...   def __len__(self):
    ...     return len(self._list)
    ...   def __getitem__(self,sliced):
    ...     return self._list[sliced]
    ...   def __setitem__(self,sliced,val):
    ...     self._list[sliced] = val
    ...   def __delitem__(self,sliced):
    ...     del self._list[sliced]
    ...   def __contains__(self,item):
    ...     return item in self._list
    ...   def __iter__(self):
    ...     return iter(self._list) 
    ...
    >>> emul = emulist(range(5))
    >>> emul
    emulist: [0, 1, 2, 3, 4]
    >>> emul[1:3]
    [1, 2]
    >>> emul[0:4:2]
    [0, 2]
    >>> len(emul)
    5
    >>> emul.append(5)
    >>> emul
    emulist: [0, 1, 2, 3, 4, 5]
    >>> emul.remove(2)
    >>> emul
    emulist: [0, 1, 3, 4, 5]
    >>> emul[3] = 6
    >>> emul
    emulist: [0, 1, 3, 6, 5]
    >>> 0 in emul
    True

    Emulating a dictionary

    >>> class emudict(object):
    ...   def __init__(self,dict_):
    ...     self._dict = dict_
    ...   def __repr__(self):
    ...     return "emudict: "+str(self._dict)
    ...   def __getitem__(self,key):
    ...     return self._dict[key]
    ...   def __setitem__(self,key,val):
    ...     self._dict[key] = val
    ...   def __delitem__(self,key):
    ...     del self._dict[key]
    ...   def __contains__(self,key):
    ...     return key in self._dict
    ...   def __iter__(self):
    ...     return iter(self._dict.keys())
    ... 
    >>> _ = {"1":1,"2":2,"3":3}
    >>> emud = emudict(_)
    >>> emud
    emudict: {'1': 1, '3': 3, '2': 2}
    >>> emud['1']
    1
    >>> emud['5'] = 5
    >>> emud
    emudict: {'1': 1, '3': 3, '2': 2, '5': 5}
    >>> del emud['2']
    >>> emud
    emudict: {'1': 1, '3': 3, '5': 5}
    >>> for _ in emud: print emud[_],
    ... 
    1 3 5
    >>> '1' in emudict
    True

    Decorator

    # see: PEP318
    >>> def decor(func):
    ...   def wrapper(*args,**kwargs):
    ...     print "wrapper"
    ...     func()
    ...     print "-------"
    ...   return wrapper
    ... 
    >>> @decor
    ... def example():
    ...   print "Example"
    ... 
    >>> example()
    wrapper
    Example
    -------
    
    # equivalent to
    >>> def example():
    ...   print "Example"
    ... 
    >>> example = decor(example)
    >>> example()
    wrapper
    Example
    -------

    Decorator with arguments

    >>> def example(val):
    ...   def decor(func):
    ...     def wrapper(*args,**kargs):
    ...       print "Val is {0}".format(val)
    ...       func()
    ...     return wrapper
    ...   return decor
    ...
    >>> @example(10)
    ... def undecor():
    ...   print "This is undecor func"
    ...
    >>> undecor()
    Val is 10
    This is undecor func
    
    # equivalent to
    >>> def undecor():
    ...   print "This is undecor func"
    ...
    >>> d = example(10)
    >>> undecor = d(undecor)
    >>> undecor()
    Val is 10
    This is undecor func

    for: exp else: exp

    # see document: More Control Flow Tools
    # forloop’s else clause runs when no break occurs
    >>> for _ in range(5):
    ...   print _,
    ... else:
    ...   print "
    no break occur"
    ... 
    0 1 2 3 4 
    no break occur
    >>> for _ in range(5):
    ...   if _ % 2 ==0:
    ...     print "break occur"
    ...     break
    ... else:
    ...   print "else not occur"
    ... 
    break occur
    # above statement equivalent to
    flag = False
    for _ in range(5):
      if _ % 2 == 0:
        flag = True
        print "break occur"
        break
    if flag == False:
      print "else not occur"

    Lambda function

    # lambda [input]: expression
    >>> fn = lambda x: x**2
    >>> fn(3)
    9
    >>> (lambda x:x**2)(3)
    9
    >>> (lambda x: [x*_ for _ in range(5)])(2)
    [0, 2, 4, 6, 8]
    >>> (lambda x: x if x>3 else 3)(5)
    5
    
    # multiline lambda example 
    >>> (lambda x:
    ... True
    ... if x>0 
    ... else 
    ... False)(3)
    True

    Function with option arguments (*args, **kwargs)

    >>> def example(a,b=None,*args,**kwargs):
    ...   print a, b
    ...   print args
    ...   print kwargs
    ...
    >>> example(1,"var",2,3,word="hello")
    1 var
    (2, 3)
    {'word': 'hello'}
    >>> _args = (1,2,3,4,5)
    >>> _kwargs = {"1":1,"2":2,"3":3}
    >>> example(1,"var",*_args,**_kwargs)
    1 var
    (1, 2, 3, 4, 5)
    {'1': 1, '3': 3, '2': 2}

    Callable object

    >>> class calobj(object):
    ...   def example(self):
    ...     print "I am callable!"
    ...   def __call__(self):
    ...     self.example()
    ... 
    >>> ex = calobj()
    >>> ex()
    I am callable!

    "with" statement (Context Manager)

    # replace try: ... finally: ...
    # see: PEP343
    # common use in open and close
    # example:
    import socket
    class Socket(object):
       def __init__(self,host,port):
          self.host = host
          self.port = port
       def __enter__(self):
          sock = socket.socket(
                   socket.AF_INET,
                   socket.SOCK_STREAM   
                )
          sock.bind((self.host,self.port))
          sock.listen(5)
          self.sock = sock
          return self.sock
    
       def __exit__(self,*exc_info):
          if exc_ty is not None:
             import traceback
             traceback.print_exception(
                *exc_info   
             )
          self.sock.close()
    
    if __name__=="__main__":
       host = 'localhost'
       port 5566
       with Socket(host,port) as s:
          while True:
             conn, addr = s.accept()
             msg = conn.recv(1024)
             print msg
             conn.send(msg)
             conn.close()

    Using "contextlib" implement Context Manager

    from contextlib import contextmanager
    @contextmanager
       def opening(filename):
          f = open(filename)
          try:
              yield f
          finally:
              f.close()
              
    with opening('example.txt','r') as fd:
       fd.read()

    Using "with" statement open file

    >>> with open("example",'r') as f:
    ...    content = f.read()

    Property - Managed attributes

    class example(object):
       def __init__(self,value):
          self.val = value
       
       @property
       def val(self):
          return self._val
    
       @val.setter
       def val(self,value):
          if not isintance(value,int):
             raise TypeError("Expect int")
          self._val = value
    
       @ val.deleter
       def val(self):
          del self._val
    
    # example result:
    >>> ex = example(123)
    >>> ex.val = "str"
    Traceback (most recent call last):
      File "", line 1, in 
      File "test.py", line 12, in val
        raise TypeError("Expect int")
    TypeError: Expect int

    Computed attribures - Using property

    # Concept: Attribure's value is not store in memory. Computing the value only when we need.
    >>> class example(object):
    ...   @property
    ...   def square3(self):
    ...     return 2**3
    ... 
    >>> ex = example()
    >>> ex.square3
    8

    Descriptor - Another choice to manage attributes

    # Descriptor
    >>> class Integer(object):
    ...   def __init__(self,name):
    ...     self._name = name
    ...   def __get__(self,inst,cls):
    ...     if inst is None:
    ...       return self
    ...     else:
    ...       return inst.__dict__[self._name]
    ...   def __set__(self,inst,value):
    ...     if not isinstance(value,int):
    ...       raise TypeError("Expected INT")
    ...     inst.__dict__[self._name] = value
    ...   def __delete__(self,inst):
    ...     del inst.__dict__[self._name]
    ...
    >>> class example(object):
    ...   x = Integer('x')
    ...   def __init__(self,val):
    ...     self.x = val
    ...
    >>> ex = example(1)
    >>> ex = example("str")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 4, in __init__
      File "<stdin>", line 11, in __set__
    TypeError: Expected an int

    @staticmethod, @classmethod

    # @classmethod: bound to class
    # @staticmethod: like python function but in class
    >>> class example(object):
    ...   @classmethod
    ...   def clsmethod(cls):
    ...     print "I am classmethod"
    ...   @staticmethod
    ...   def stmethod():
    ...     print "I am staticmethod"
    ...   def instmethod(self):
    ...     print "I am instancemethod"
    ... 
    >>> ex = example()
    >>> ex.clsmethod()
    I am classmethod
    >>> ex.stmethod()
    I am staticmethod
    >>> ex.instmethod()
    I am instancemethod
    >>> example.clsmethod()
    I am classmethod
    >>> example.stmethod()
    I am staticmethod
    >>> example.instmethod()
    Traceback (most recent call last):
      File "", line 1, in 
    TypeError: unbound method instmethod() ...

    Abstract method - Meta class

    # usually using in define methods but not implement
    from abc import ABCMeta, abstractmethod
    
    >>> class base(object):
    ...   __metaclass__ = ABCMeta
    ...   @abstractmethod
    ...   def absmethod(self):
    ...     """ Abstract method """
    ... 
    >>> class example(base):
    ...   def absmethod(self):
    ...     print "abstract"
    ... 
    >>> ex = example()
    >>> ex.absmethod()
    abstract
    
    # another better way to define a meta class
    >>> class base(object):
    ...   def absmethod(self):
    ...     raise NotImplementedError
    ...
    >>> class example(base):
    ...   def absmethod(self):
    ...     print "abstract"
    ... 
    >>> ex = example()
    >>> ex.absmethod()
    abstract
  • 相关阅读:
    Average of Levels in Binary Tree
    Maximum Average Subarray I
    Integer Replacement
    Add Digits
    Binary Tree Level Order Traversal II
    Majority Element II
    Majority Element
    匿名函数
    Django的Template不支持range()函数的问题解决办法
    python文件对比利用difflib库实现文件夹下详细内容对比
  • 原文地址:https://www.cnblogs.com/ajianbeyourself/p/4379246.html
Copyright © 2011-2022 走看看