1. 我是皮皮虾首页
  2. 编程开发
  3. 后端
  4. Python

python后端开发面试-语言基础篇

Python是动态语言还是静态?强类型还是弱类型?

  • python动态语言,怎么区分呢?关键看类型检测是在运行时检查还是编译时检查,Python是运行时检查,所以是动态语言,像java、golang是静态语言,它们在编译的时候检查类型
  • Python 是强类型,怎么区分呢?看它会不会发生隐式类转换,比如运算b = a + 1 在python中会报错,因为字符串不能与int类型相加,所以是强类型,但是在javascript结果为a1,因为javascript会把1自动转为字符串,所以javascript是弱类型

用推导式生成一个字典,俗称字典解析式

注意列表推导式外面是[],字典是{}

dict_data = {x:2*x for x in range(10) }

Python中is和==的区别

  • == 比较的是值是否相等
  • is 不仅比较值是否相等,还比较所引用的对象地址是否一致,可以理解为比较id(x)==id(y)

高阶函数Map、reduce、filter区别

他们都是高阶函数,第一个参数传递的是一个函数或者lambda表达式

  • map 遍历第二个参数的列表,并把每个参数传递给第一个参数,显然第一个参数是一个函数表达式
>>> a = map(lambda x:x*2,[1,2,3])
>>> list(a)
[2, 4, 6]
  • reduce 在python3中需要从functools导入reduce,它负责的功能是将前一次的计算结果作为后一次的参数,再做计算,需要注意的是,这里的lambda需要两个参数x,y;x,y第一次传递进去的是1,2(来自[1,2,3]中的1,2),第一次传递的是3,2(来自[1,2,3]中的3,和前面计算的结果2)
from functools import  reduce
>>> a = reduce(lambda x,y:x*y,[1,2,3])
6
  • filter 就是一个过滤函数类似js的filter,下面的功能是过滤%2不等于的数,也就是求奇数
>>> a = filter(lambda x: x % 2, [1,2,3,4,5,6])
In [12]: list(a)
Out[12]: [1, 3, 5]

lambda函数的用法

lambda函数是一种匿名函数,也就是当你不想给函数命名的时候,且函数比较简单,就可以考虑使用lambda表达式

In [17]: a = lambda x: x * 2
In [18]: a(10)
Out[18]: 20

*args,**kwargs区别和用法

  • *args 是列表参数,接受的是一个可变列表
  • **kwargs 是字典参数,接受的是一个可变字典

单下划线函数和双下划线函数的区别

  • _xx:前置单下划线,私有化属性或方法,一般来讲,变量名_xx被看作是“私有 的”,在模块或类外不可以使用。类似java中的protect
  • __xx:前置双下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到,只能是允许这个类本身进行访问了。连子类也不可以)类似java中的private
  • __xx__:前后双下划线,这被称为魔法方法,也是系统定义的名字,因为变量名__xxx__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。

可变类型和不可变类型

怎么区分呢?记住可变类型就行,可变类型会有各种方法,比如list类型有append、remove,set有add;其余的基本是不可变

  • 可变类型:list、set、dict
  • 不可变类型:int、bool、float、str、tuple

python2和python3有什么区别

区别挺多的。下面说下python3的新特性

  • python3默认是Unicode编码,不像python2默认是ASCII str() 类型,unicode() 是单独的,头部还需要加上# utf-8 才能使用s = u”中国”
  • print是函数,需要print()才能调用
  • 除法运算默认是浮点类型,在python2中除法默认是整数
  • python3合并range和xrange成range函数,都是迭代器
  • python3新增原生协程,asyncio

深拷贝和浅拷贝

  • 复制不可变数据类型,不管copy还是deepcopy,都是同一个地址当浅复制的值是不可变对象(数值,字符串,元组)时和=“赋值”的情况一样,对象的id值与浅复制原来的值相同。
In [59]: c = (1,2,3)

In [60]: c1 = copy.copy(c)

In [61]: c
Out[61]: (1, 2, 3)

In [62]: c1
Out[62]: (1, 2, 3)

In [63]: id(c)
Out[63]: 4611674400

In [64]: id(c1)
Out[64]: 4611674400

In [65]: c2 = copy.copy(c)

In [66]: c2
Out[66]: (1, 2, 3)

In [67]: id(c2)
Out[67]: 4611674400

In [68]: c = (1,2,3,4)

In [69]: c1
Out[69]: (1, 2, 3)

In [70]: c2
Out[70]: (1, 2, 3)

In [71]: c
Out[71]: (1, 2, 3, 4)
  • 复制的值是可变对象(列表和字典)
  • 浅拷贝copy有两种情况:

第一种情况:复制的 对象中无复杂子对象,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。

第二种情况:复制的对象中有 复杂子对象 (例如列表中的一个子元素是一个列表), 改变原来的值 中的复杂子对象的值 ,会影响浅复制的值。

In [40]: b = [9,0,1]
In [41]: b1 = [b,3,4]
In [43]: b1
Out[43]: [[9, 0, 1], 3, 4]
In [44]: b2 = copy.copy(b1)
In [45]: b2
Out[45]: [[9, 0, 1], 3, 4]

In [46]: b.append(3)
In [47]: b
Out[47]: [9, 0, 1, 3]

In [48]: b1
Out[48]: [[9, 0, 1, 3], 3, 4]

In [49]: b2
Out[49]: [[9, 0, 1, 3], 3, 4]

In [50]: id(b1)
Out[50]: 4616205448

In [51]: id(b2)
Out[51]: 4616489736
  • 深拷贝deepcopy:完全复制独立,包括内层列表和字典,例子中的b如果再append 一个20,深拷贝的数据不会变
In [52]: b3 = copy.deepcopy(b2)

In [53]: b3
Out[53]: [[9, 0, 1, 3], 3, 4]

In [54]: b.append(20)

In [55]: b
Out[55]: [9, 0, 1, 3, 20]

In [56]: b3
Out[56]: [[9, 0, 1, 3], 3, 4]

In [57]: b1
Out[57]: [[9, 0, 1, 3, 20], 3, 4]

原创文章,作者:站长,如若转载,请注明出处:https://wsppx.cn/611/%e7%bd%91%e7%bb%9c%e5%bc%80%e5%8f%91/%e5%90%8e%e7%ab%af/

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注