sort,GIL,函数式编程,单例,hasattr

1、排序基础, 一个简单的升序排列很简单-只需要调用sorted()函数即可。 这个函数返回一个新的排序列表。:

  >>> sorted([5,2,3,1,4])

  [1,2,3,4,5]

  你也可以使用list的list.sort()方法。这个方法会修改原始的list(返回值为None)。

        通常这个方法不如sorted()方便,如果你不需要原始的list,list.sort()方法效率会稍微高一些。

  >>> a=[5,2,3,1,4]

  >>> a.sort()

  >>> a

  [1,2,3,4,5]

  另一个区别在于list.sort()方法只为list定义。而sorted()函数可以接收任何的iterable
  >>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})     [1, 2, 3, 4, 5]

        Key Functions(关键字函数)
    从Python2.4开始,list.sort()和sorted()方法都添加了一个key参数来说明一个函数,这个函数在做比较之前会对list中的每个元素进行调用。


      例如,这里是一个大小写不敏感的字符串比较:

    >>> sorted("This is a test string from Andrew".split(), key=str.lower) ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
      key的值应该是一个函数,这个函数接收一个参数并且返回一个用于比较的关键字。

      这种技术比较快,原因在于对每个输入记录,这个函数只会被调用一次。

      >>> student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10), ]

      >>> sorted(student_tuples, key=lambda student: student[2])
      # sort by age [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

      reverse=True 表示降序 默认是false 升序

2、函数式编程

    a = [1,2,3,4,5,6,7]
    >>>b = filter(lambda x: x > 5, a)
    >>>print b
    >>>[6,7]

    a = map(lambda x:x*2,[1,2,3])
    >>> list(a)
    [2, 4, 6]

    reduce函数是对一个序列的每个项迭代调用函数,下面是求3的阶乘

    reduce(lambda x,y:x*y,range(1,4))

3、谈谈你对GIL锁对python多线程的影响?

    GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。

    每个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,

      并发和并行从宏观上来讲都是同时处理多路请求的概念。

    但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。)
    在Python多线程下,每个线程的执行方式:
      1、获取GIL
      2、执行代码直到sleep或者是python虚拟机将其挂起。
      3、释放GIL
      可见,某个线程想要执行,必须先拿到GIL,可以把GIL看作是“通行证”,并且在一个python进程中,

        GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。

4、__new__方法是创建实例对象的方法,然后才会调用__init__进行初始化、

    单例模式就是看起来创建了多个对象,其实就一个对象

    class car(object):

      def __new__(cls):
        return cls.__new__(cls)

    class car(object):
      __first_new=true
      __instance= false
      def __new__(cls):
        if __first_new:
        cls.__instance =__cls.__new__(cls)
          return cls.instance
        else:
          return cls.__instance

5、
  判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False
    class test():
      name="xiaohua"
      def run(self):
        return "HelloWord"

      t=test()
      hasattr(t, "name") #判断对象有name属性
      True
      hasattr(t, "run") #判断对象有run方法
      True

posted @ 2017-09-24 12:09  西湖歌舞几时休  阅读(104)  评论(0编辑  收藏  举报