zoukankan      html  css  js  c++  java
  • 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

    life is short,i need python
  • 相关阅读:
    团队开发——描绘用户场景
    学习EXTJS6(2)“Hello Usegear”
    D2007从win7升级到win10下的莫名其妙问题。
    学习EXTJS6(1)安装环境
    raize5的修改。
    EurekaLog是什么鬼?
    EditorLineEnds.ttr的困扰
    dev的汉化
    cxGrid主从表删除从表记录的困惑
    痛苦的Windows下的temp目录
  • 原文地址:https://www.cnblogs.com/lvhonglei-python/p/7586835.html
Copyright © 2011-2022 走看看