1、python是一门什么语言,和其他语言有什么区别?
python是一门强类型的动态解释性语言
强类型:不允许不同类型相加 (js 、c 弱类型 ,java python弱类型)
动态:不需要事先声明变量类型,确定一个变量的类型是在变量第一次被赋值的时候 (java c 都是要声明类型)
解释性语言:python运行的时候不需要事先编译 (java c都需要事先编译)
2.说下*args **kwargs ,使用场景是什么?
*args 表示这是一个可变的位置参数,当我们不确定要往函数中传入多少个位置参数的时候
**kwargs表示这是一个可变的关键字参数
*可以把序列(list,tuple)解包成位置参数,**可以把字典解包成关键字参数
#### *args必须在**kwargs之前 位置参数必须在关键字之前
3.谈谈python的装饰器
装饰器的本质上就是一个函数(高阶函数+闭包),它可以让其他函数在不修改源代码和调用方式的情况下增加额外的功能,通常用于插入日志,性能测试,事务处理,权限校验等场景
import time
import functools
def timer(func):
@functools.wraps(func) #防止被装饰的函数的名字改变
def wrapper(*args,**kwargs):
start = time.time()
result = func(*args,**kwargs)
end = time.time()
print('{0}花费了{1}').format(func.__name__,end-start)
return result
return wrapper
4.简单描述一下python的垃圾回收机制
python中垃圾回收机制主要是以引用计数为主,标记-清除和分代回收为辅
引用计数:python在内存中存储每个对象都有引用计数,如果引用计数为0,该对象就会消失,分配给该对象的内存会释放
标记-清除:一些容器对象(list,tuple)可能会出现循引用,垃圾回收器会定时回收这些循环
分代回收:python把内存根据对象的存活时间分为三代,对象创建后,垃圾回收器会分配他们所属的代,越晚创建的对象越容易被回收
5.讲一讲python的多线程,GIL
python并不支持真正意义上的多线程,因为python有一个叫做GIL解释器全局锁的东西,他能够保证你的代码在一个cpu中永远只有一个线程在执行,这就意味着如果你的代码是计算密集型的情况下比较鸡肋还可能会更慢,但是在IO密集型的代码的表现良好,因为锁的存在,遇到了阻塞就切换,从而实现并发
6.说下os,sys模块的不同,并列举出常用的模块方法
os模块提供了一种方便使用操作系统函数的方法(与操作系统交互)
sys模块可供访问由解释器使用或维护的变量和与解释器交互的函数(与解释器交互)
os.path.join()将各部分组合成一个路径名
os.getcwd()获取当前工作目录
sys.argv 命令行参数list,第一个元素是程序本身路径
7.lambda表达式,他有什么好处
lambda匿名函数,顾名思义不需要函数名的函数,简洁
fib = lambda n:n if n<=2 else fib(n-1)+fib(n-2)
尾递归版本: fib = lambda n,x=0,y=1:x if not n else fib(n-1,y,x+y)
8.深复制和浅复制
浅复制:copy.copy() 切片 只拷贝父对象,不拷贝父对象的子对象
深复制:copy.deepcopy() 拷贝父对象和子对象 开辟一个新空间完全的独立
9. new init 的区别
init_为初始化方法 new方法是真正的构造函数
--new--是实例创建之前被调用 ,它的任务是创建并返回该实例
init是在实例被创建后调用,然后设置对象属性的一些初始值
总结:new方法在init方法之前被调用,并且new方法的返回值将传递给init方法作为第一个参数,最后init给这个实例设置一些参数
10.python的自省
自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型,type(), getattr(), hasattr(), isinstance()
11.@classmethod
, @staticmethod
和@property
这三个装饰器y
classmethod 类方法 不用实例化通过类就能调用函数 ,传递的第一个参数是类本身
class A:
@classmethod
def a(cls): #不是self 而是cls 表示类方法
print('a')
A.a() A().a()
staticmethod 静态方法 就是普通的函数,只不过他是写在类里面的,需要通过类或者实例来调用
class A:
@staticmethod
def a(): #不需要self
print('a')
A.a() A().a()
property 可以通过属性来访问方法
class A:
x='getattr'
@property
def a(self):
return x
@a.setattr
def a(cls, val):
cls.x =val
A().a #但是需要实例化才能访问