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