【python面试指北】1.语言基础

1. python是动态强类型的语言。

动态还是静态指的是编译器还是运行期确定类型

强类型指的是不会发生隐式类型转换。比如js能够执行1+"1",但是python不行,所以python是弱类型的语言。

2. 鸭子类型

当一只鸟走起来像鸭子、游泳起来像鸭子、叫气力啊也像鸭子,那么这只鸟就可以被称为鸭子。

鸭子类型关注的是对象的行为,而不是类型。比如file,StringIO,socket对象都支持read/write方法,再比如定义了iter魔术方法的对象可以用for迭代。

3. monkey patch

所谓的monkey patch就是运行时替换。

4. 自省

运行时判断一个对象类型的能力。

python一切皆对象,用type, id, isinstance获取对象类型信息。

5. 列表和字典推导

如 [i for i in range(10) if i % 2 == 0],如果[]改为(),则为生成器

6. python2和python3

  • print成为函数
  • 编码问题。python3不再有unicode对象,默认str就是unicode
  • 除法变化。python3除号返回浮点数,如果要返回整数,应使用//
  • 类型注解。帮助IDE实现类型检查
  • 优化的super()方便直接调用父类函数
  • 高级解包操作。a, b, *rest = range(10)
  • keyword only arguments。限定关键字参数
  • chained exceptions。python3重新抛出异常不会丢失栈信息
  • 一切返回迭代器。range, zip, map, dict.values, etc. are all iterators
  • 性能优化等。。。

7. python如何传递参数

python既不是值传递也不是引用传递,唯一支持的参数传递是共享传参。

call by object(call by object reference or call by sharing)

call by sharing(共享传参),函数形参获得实参中各个引用的副本。

变量一切都是对象。list是可变对象,string是不可变对象

总结一下:根据对象的引用来传递,根据对象是可变对象还是不可变对象,得到两种不同的结果。如果是可变对象,则直接修改。如果是不可变对象,则生产新对象,让形参指向新对象

8. python可变/不可变对象

不可变对象: bool/int/float/tuple/str/frozenset
可变对象:list/set/dict

练习题:

# 1
def clear_list(l)
    l = []
ll = [1,2,3]
clear_list(ll)
print(lll)

# 2
def fl(l=[1]):
    l.append(1)
    print(l)
fl()
fl()
# 记住:默认参数只计算一次

**9. *args, kwargs

用来处理可变参数,args被打包成tuple,kwargs被打包成dict

传递方式有两种

# 第一种
foo(1,2,3)
foo(a=1,b=2)
# 第二种
foo(*[1,2,3])
foo(**dict(a=1,b=2)})

10. python异常机制

BaseException
下面有SystemExit/KeyboardInterrupt/GeneratorExit/Exception(其他异常都属于它)

try:
     # func   # 可能会抛出异常的代码
except (Exception1, Exception2) as e:  # 可以捕获多个异常并处理
    # 异常处理的代码
else:
    # pass  # 异常没有发生的时候代码逻辑
finally:
    pass     # 无论异常有没有发生都会执行的代码,一般处理资源的关闭和释放

11. 自定义异常

继承Exception实现自定义异常,给异常加上一些附加信息

不用baseException是因为这样的话ctrl+c的keybord异常就用不了了

12. python性能分析与优化,GIL

  • cpython解释器的内存管理并不是线程安全的
  • 保护多线程情况下对python对象的访问
  • cpython使用简单的锁机制避免多个线程同时执行字节码

GIL的影响

限制了程序的多核执行

  • 同一个时间只能有一个线程执行字节码
  • CPU密集程序难以利用多核优势
  • IO期间会释放GIL,对IP密集程序影响不大

对IO密集程序影响不大

如何规避GIL的影响

区分CPI和IO密集程序

  • CPU密集可以使用多进程+进程池
  • IO密集使用多线程/协程
  • cpython扩展

13. 服务端性能优化措施

web应用一般语言不会成为瓶颈

  • 数据结构与算法优化
  • 数据库层:索引优化,慢查询消除,批量操作减少IO,NoSQL
  • 网络IO:批量操作,pipeline操作,减少IO
  • 缓存:使用内存数据库 redis/memcached
  • 异步:asyncio,celery
  • 并发:gevent/多线程

14. python生成器与协程

Generator

  • 生成器就是可以生成值的函数
  • 当一个函数里有了yield关键字就成了生成器
  • 生成器可以挂起执行并且保持当前执行的状态

协程不懂

15. python3原生协程

async/await支持原生协程

16. python单元测试

三无代码不可取(无稳定、无注释、无单测)

  • 保证的代码逻辑的正确性
  • 单侧影响设计,易测的代码往往是高内聚低耦合的
  • 回归测试,防止改一处整个服务不可用

单元测试相关的库

  • nose/pytest较为常用
  • mock模块用来模拟替换网络请求等
  • coverage统计测试覆盖率

17. python深拷贝与浅拷贝

你可能感兴趣的:(【python面试指北】1.语言基础)