python基础知识必备

  1. python是静态还是动态类型?是强类型还是弱类型?
    动态类型语言
    动态还是静态指的是编译期还是运行期确定类型 无类型声明
    强类型:js数字转字符串会自动转换是弱类型 不会自动转换

  2. python作为后端语言的优缺点?
    1.胶水语言,轮子多,应用广泛
    2.语言写起来快
    3.性能比较慢,python2 python3 不兼容

  3. 什么是鸭子类型?
    关注对象的行为【方法】,而不是类型
    比如file StringIO socket 对象都支持read/write方法(file like object)
    再比如定义了_iter_魔术方法的对象可以用for迭代

  4. 什么是monkey patch?那些地方用到了?自己如何实现?
    所谓的monkey patch就是运行时类型替换
    比如gevent库需要修改内置的socket
    from gevent import monkey;
    monkey.patch_socket()
    (把内置阻塞的库替换成非阻塞的socket)

  5. 什么是自省?
    运行是判断一个对象的类型的能力。
    python一切皆对象

  6. is 和 == 区别?
    is:比较的是两个对象的id值是否相等,也就是比较两个对象是否是同一个实例,是否指向同一个地址。
    ==:比较的是两个对象的内容是否相等,默认会调用对象的__equal__()方法

python所做的性能优化:
1.小整数对象[-5,256]是全局解释器范围内被重复使用,永远不会被GC回收。
2.同一个代码块中的不可变对象,只要是值相等的,就不会重复创建新的对象。
3.字符串中单个20以内他们的内存地址一样,单个21以上,内存地址不一样

  1. 什么是列表和字典推导?
    一种快速生成list/dict/set的方式

  2. 什么是生成器,迭代器?
    1.生成器定义
    在Python中,一边循环一边计算的机制,称为生 成器:generator。
    生成器仅仅保存了一套生成数值的算法,并且没有让这个算法现在就开始执行,而是我什么时候调它,它什么时候开始计算一个新的值,并给你返回。

    1)生成器(generator)能够迭代的关键是它有一个next()方法,
    
      工作原理就是通过重复调用next()方法,直到捕获一个异常。
    
    (2)带有 yield 的函数不再是一个普通函数,而是一个生成器generator。
    
      可用next()调用生成器对象来取值。next 两种方式 t.__next__()  |  next(t)。
    
      可用for 循环获取返回值(每执行一次,取生成器里面一个值)
    
      (基本上不会用next()来获取下一个返回值,而是直接使用for循环来迭代)。
    
    (3)yield相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从yield的下一条语句开始执行。
    
    (4).send() 和next()一样,都能让生成器继续往下走一步(下次遇到yield停),但send()能传一个值,这个值作为yield表达式整体的结果
    
      ——换句话说,就是send可以强行修改上一个yield表达式值。比如函数中有一个yield赋值,a = yield 5,第一次迭代到这里会返回5,a还没有赋值。第二次迭代时,使用.send(10),那么,就是强行修改yield 5表达式的值为10,本来是5的,那么a=10
    
    我又想要得到庞大的数据,又想让它占用空间少,那就用生成器。
    
    迭代原理
    面试题:for循环的原理是什么?
    答:1. 获取迭代器
     2. 循环获取下一个元素
     3. 遇到异常停止迭代
    
    可以被for的条件是什么?
    答:能被for的对象必须具备__iter__方法
    答:能被for的对象是可迭代对象
    
    2.迭代器是一个可以记住遍历的位置的对象。
    迭代器有两个基本的方法:iter() 和 next()。
    
  3. python2/3差异常考题
    1.python3中print为函数,python2中print为关键字。
    2.编码问题 python3不再有Unicode对象,默认str就是unicode
    3.除法返回浮点数
    4.string 字母 大小写字符串
    string.letters:包含所有字母(大写或小写)的字符串
    Python 3.0中,string.ascii_letters.
    5.python 2.7 cmp(x,y)函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1

    python3.7 cmp()已经不存在了,如果你需要实现比较功能,需要引入 operator 模块,适合任何对象
    6.python3可以加类型注解,帮助IDE实现类型检查
    7.优化的super()方便直接调用父类函数
    8.高级解包操作:
    9.参数传递:

  4. Python新增
    yield from 链接子生成器
    asyncio内置库
    新增库enum

  5. python3改进
    生成的pyc文件统一放到_pychche_
    一些内置库的修改 urllib selector
    dict性能优化

  6. python如何传递参数?
    对象引用的方式传递
    默认参数只计算一次
    不可变对象:bool,int,float,tuple,str
    可变对象:list set dict

  7. 函数传递中*args,**kwargs含义是什么?
    *args 被打包成tuple
    **kwargs 字典

  8. 什么时候需要捕获处理异常呢?看python内置异常的类型。
    1.网络请求(超时,连接错误)
    2.资源访问(权限问题)
    3.代码逻辑异常
    finally:无论异常有没有发送都会执行的代码,一般处理资源的关闭和释放

  9. 什么是Cpython GIL
    GIL:global interpreter lock
    Cpython使用简单的锁机制避免多个线程同时执行字节码。
    限制了程序的多核执行
    同一个时间只能有一个线程执行字节码
    CPU密集程序难以利用多核
    IO期间会释放GIL,对I/O密集程序影响不大

    CPU:cpu密集可以使用多进程+进程池
    IO:IO密集使用多协程、线程

  10. 如何剖析程序性能
    使用内置的profile/cprofile等工具

  11. 服务端性能优化措施
    1.数据结构与算法优化
    2.数据库层:添加索引批量操作减少IO
    3.缓存:使用内存数据库redis
    4.异步框架:asyncio
    5.并发:gevent/多线程

  12. 什么是生成器?
    可以生成值的函数
    当一个函数里有了yield关键字就成了生成器
    生成器可以挂起执行并且报存当前执行的状态

19.什么是单元测试?
单元测试相关库:nose/pytest
如何设计测试用例:
1.正常值功能测试
2.边界值(比如最大,最小,最左最右)
3.异常值 (比如None,空值,非法值)

  1. Python深拷贝和浅拷贝?
    深拷贝:又开辟了一块空间,复制过来
    浅拷贝:指向的是同一个对象

猜你喜欢

转载自blog.csdn.net/baidu_41796276/article/details/113037505