from:https://zhuanlan.zhihu.com/p/23526961?refer=passer
- *args和 **kwargs
*args:是tuple,list格式
**kwargs: 是字典格式
标准答案
如果不确定往一个函数中传入多少个参数,或者用tuple或list的形式传参数时,我们可以用args.
如果不知道往函数传递多少个关键词或者想传入字典的值作为关键参数,我们可以用*kwargs.
def func(*args, ** kwargs):
print args,kwargs
d = {'s':1, 'r':2}
l = [1,2,3]
func( *l, c=2,**d)
#输出 (1, 2, 3) {'s': 1, 'r': 2, 'c': 2}
2.为什么要用装饰器
装饰器本质是函数, 他可以让其他函数不作任何改动的情况下增加额外功能,装饰器的返回值也是一个函数对象。
经常用于有切面需求的吃场景。比如:插入日志,性能测试,事务处理,缓存,权限校验。
import functools
def log(function):
functools.wraps(function)
def wrapper(*args, **kwargs):
print "Call %s" % function.__name__
return function(*args, **kwargs)
return wrapper
@log
def func(*args, ** kwargs):
print args,kwargs
d = {'s':1, 'r':2}
l = [1,2,3]
func( *l, c=2,**d)
3.python的垃圾回收机制。
python中的垃圾回收是以引用计数为主, 标记-清除和分代收集为辅。
引用计数:Python在内存中存储每个对象的引用计数,如果计数变成0,该对象就会消失,分配给该对象的内存就会释放出来。
一些容器对象,比如list、dict、tuple,instance等可能会出现引用循环,对于这些循环,垃圾回收器会定时回收这些循环(对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边)。
分代收集:
Python把内存根据对象存活时间划分为三代,对象创建之后,垃圾回收器会分配它们所属的代。每个对象都会被分配一个代,而被分配更年轻的代是被优先处理的,因此越晚创建的对象越容易被回收。
4.Python多线程包(multi-threading)。这是个好主意吗?
python并不支持真正意义的多线程。python中有一个叫Global Interpreter Lock(GIL)的东西,它能确保你的代码中永远只有一个线程在执行。
当然如果你的代码是IO密集型,多线程可以明显提高效率, 相反如果你的代码是CPU密集型的,这种情况下多线程大部分是鸡肋。
5.说明os,sys模块不同,并列举常用的模块方法?
官方文档:
os模板提供了一种方便的使用操作系统函数的方法。
sys模板可供访问由解释器使用或维护的变量和与解释器交互的函数。
下面是sys模块(由解释器使用或维护的变量和与解释器交互)
6.什么是lambda表达式? 它有什么好处?
简单来说,lambda表达式通常是你需要使用一个函数,但又不想费脑去命名一个函数的时候使用,也就是通常所说的匿名函数。
lambda表达式形式是: lambda关键词后面紧接一个或多个参数,紧接冒号“:”,后面跟着表达式。 它是一个表达式不是语句。
func = lambda x,y,z: x+y+z
print func(1,2,3)
7.字符串替换
12.什么是自省
简单一句话就是运行时能够获得对象的类型