zoukankan      html  css  js  c++  java
  • python面试题总结

    python 基础整理

    1列表,字典推导式?

    # 字典推导式
    d = {key:value for (key,value) in iterable }
    # 字典推导式格式 : {key:value for循环 if判断}
    dict1 = {“name”: “zhangsan”, “age”: 18}
    dict2 = {value: key for key, value in dict1.items()}
    print(dict2)
    # {'1': 'name', 18: 'age'}
    # 列表推导式
    l= [x*y for x in range(1,5) if x>2 for y in range(1,4) if y < 3]   # 3,4   1,2   x*y
    # [3, 6, 4, 8]

    python可变对象和不可变对象?

    • 不可对象: 数字类型, 字符串, 元组. 不允许改变变量的值,改变后会创建新的对象即指向新的内存空间

    • 可变对象: 列表, 字典, 集合.允许变量的值发生改变且内存地址不变,不会创建新的对象,

    python内置数据类型?

    • 数字类型,字符串类型, 元组, 列表,字典,集合

    python 中有多少种运算符?并简单说明.

    • 算术运算符: + - * / 等

    • 赋值运算符: = += -= /= 等

    • 逻辑运算符: and or not

    • 位运算符: & | ~ ^

    • 身份运算符: is not is

    • 关系运算符: > < == >= <=等

    • 成员运算符: in not in

    python 2 和python 3 的区别?

    2python 中 单下划线 , 双下划线 ?

    • 单下换线 _xx : 是一种约定, 表示私有变量, 但是外部也可以调用

    • 单 双下换线: __xx : 表示真正的私有变量, 只有内部可以调用. 不过也有特殊的方法使外部也可以调用

    • 双 双下划线: 表示系统变量.

    3python自省 ?

    • 自省就是面向对象的语言所写的程序在运行时, 就可以知道对象的类型.

    
    
    a = [1,2,3]
    b = {'a':1,'b':2,'c':3}
    c = True
    print(type(a),type(b),type(c))
    # <type 'list'> <type 'dict'> <type 'bool'>

    4python作用域

    • 范围从大到小: 内置作用域 --> 全局作用域 - -> 闭包作用域 --> 局部作用

    • 查找顺序: 局部作用域 --> 闭包作用域 --> 全局作用域 --> 內置作用域

    5new 和 int的区别?

    • new 实例创建之前调用,创建实例返回实例对象.是个静态方法. 必须有返回值.在 init 之前调用

    • int 实例对象创建之后调用, 初始化类的实例.是个实例方法


    ※ __new__和__init__的区别,说法正确的是? (ABCD)

    A. __new__是一个静态方法,而__init__是一个实例方法
    B. __new__方法会返回一个创建的实例,而__init__什么都不返回
    C. 只有在__new__返回一个cls的实例时,后面的__init__才能被调用
    D. 当创建一个新实例时调用__new__,初始化一个实例时用__init__

    6lambda函数?, 有什么好处?

    • lambda函数比较轻便,即用即删, 也不用费神的去命名.

    # 有参五默认值
    f = lambda x,y: x*y
    f(6,7)
    #42
    # 有参有默认值
    f = lambda x=5, y=8: x*y
    f()
    #40
    f(5,6)
    #30
    
    

    7python 中的 is 和 == 的区别?

    • 首先python 对象 有三个基本要素 1. id 即 内存地址 2. type 即 对象类型 3. value 值.

    • is 是判断 对象是否是同一对象 即 判断 id 是否相同

    • == 是判断对象是否相等, 即判断value值是否相等

    8python 中 赋值, 浅拷贝, 深拷贝?

    • 赋值: 不会创建新的对象, 是对原对象的引用.简单说就是给原对象起了个新名字.

    • 浅拷贝: 会创建的新的对象, 两个对象不指向同一内存空间, 但是浅拷贝只是拷贝第一层, 对象里面的元素指向同一内存空间, 改变原对象里面的元素 拷贝的对象也会改变.

    • 深拷贝: 会创建一个全新对象, 两个对象不指向同一内存空间, 即使 原对象 存在多层嵌套, 改变原对象,拷贝的对象也不会发生改变.

    • 注意: 对于非容器没有拷贝一说(数字类型, 字符串等),如果元组变量只包括原子类型则没有深拷贝

      import copy
         一层的情况:
      ​
          # 浅拷贝
      ​
          li1 = [1, 2, 3]
          li2 = li1.copy()
          li1.append(4)
          print(li1, li2)  # [1, 2, 3, 4] [1, 2, 3]
      # 深拷贝
      ​
          li1 = [1, 2, 3]
          li2 = copy.deepcopy(li1)
          li1.append(4)
          print(li1, li2)  # [1, 2, 3, 4] [1, 2, 3]
      ​
      ​
        多层的情况:
          import copy
      ​
          # 浅拷贝
      ​
          li1 = [1, 2, 3, [4, 5], 6]
          li2 = li1.copy()
          li1[3].append(7)
          print(li1, li2)  # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5, 7], 6]
      # 深拷贝
      ​
          li1 = [1, 2, 3, [4, 5], 6]
          li2 = copy.deepcopy(li1)
          li1[3].append(7)
          print(li1, li2)  # [1, 2, 3, [4, 5, 7], 6] [1, 2, 3, [4, 5], 6]

    9装饰器?

    • 装饰器本质也是一个函数. 在不改变源代码的情况下, 给函数增加额外的功能.返回值也是个函数.

    
    
    def wrapper(func):
        def innier(*args,**kwargs):
            '''被装饰函数前需要的添加的内容'''
            ret = func(*args,**kwargs) #被装饰的函数
            '''被装饰函数后需要添加的内容'''
            return ret
        return inner
                
     

    10闭包?

    • 函数嵌套函数, 内函数必须引用外函数的临时变量, 外函数的返回值必须是内函数的引用.

    11递归函数?

    • 如果一个函数在内部 直接或者间接的调用自身

    • 递归函数最大递归层数: 998

    • 递归函数必须有一个终止条件

    12python 中的 可迭代对象, 迭代器, 生成器 ?

    • 可迭代对象包括 迭代器, 序列(字符串, 列表, 元组), 字典. 生成器是一种特殊的迭代器

    • 可迭代对象 一般能被for循环遍历的对象就是可迭代对象, 如果给一个确切的定义的话, 就是 只要它返回一个迭代器的 iter 方法,或者支持下标索引的 getitem方法 那么他就是可迭代对象.

    • 如果一个对象拥有 iner 方法 那么它就是可迭代对象, 如果一个对象拥有iter, next方法 那么他就是一个迭代器

    • 生成器 是一种特殊的迭代器 , 生成器自动实现了 iter next 方法, 不需要手动实现, 具有yield 关键字的都是生成器, yield 可以理解的为 return 不同的是 return 返回后 函数就会释放, 而生成器不会, 它会从yield 下一句开始执行, 直到遇到下一个yield

    13python 进程, 线程, 协程 ?

    • 简单说 有个运行的程序就一个进程, 进程是

    • 线程一般使用的是 threading 模块,

    14谈谈python GIL 锁 ?

    • GIL 锁, 全局解释器锁, 限制多线程同时执行,保证同一时间内只有一个线程在执行.

    • GIL锁是 解释器(CPython)中引入发一个概念, 如果不是用的cpython解释器就不存在这个问题

    • 为了更好的利用多核处理器的性能, 就出现了多线程编程的方式,各个线程访问数据资源时会出现竞争状态,即数据可能会同时被多个线程占用,造成数据混乱的情况.这就是线程的不安全.因此就出现了 GIL全局解释器锁 来限制多线程同时执行, 保证同一时间只有一个线程在执行.

    • 因为GIL全局解释器锁的存在, 就导致CPython解释器下的多线程实则是伪多线程. 解决 1. 进程 + 协程. 2. 更换解释器

    15python的内存管理机制 ?

    • 引用计数: 在python中, 每个对象都有指向该对象的引用总数即引用计数, 查看对象的引用计数: sys.getrefcount(), 当一个python对象被引用时其引用计数加一; 当引用计数等于 0 时 对象被删除.

    • 垃圾回收

    • 内存池机制: python 中分为大内存和小内存: 256k为界限

      • 大内存使用malloc 进行分配

      • 小内存使用内存池是进行分配

      • python的内存池金字塔:

        • 第3层: 最上层, 用户对python对象的直接操作

        • 第1层和第2层: 内存池, 有python 的 接口函数 PyMen_Malloc 实现, 若请求分配的内存在1 - 256字节之间就使用内存池进行分配, 调用malloc 函数分配内存, 但是每次只会分配 256 k 的内存. 不会调用free 函数释放内层. 将该内存块留在内存池中便下次使用

        • 第 0 层: 大内存 . 若请求分配的内存大于 256 k , malloc函数分配, free函数释放内存

        • 第 - 1 -2 层: 操作系统进行操作

    16简述 解释型语言 和 编译型语言?

    • 解释型语言: 解释型语言编写的程序不需要编译, 在执行的时候,专门有一个解释器能够将其翻译成机器语言,每个语句都是在执行时才被翻译. 解释型语句执行一次就会翻译一次.

    • 编译型语言: 编译型语言写的程序执行之前, 需要一个专门的编译过程, 通过编译系统把原高级程序编译成机器语言文件, 编译只做一次, 运行时不需要编译.

    17python解释器的种类 以及特点 ?

    • CPython : 是用C语言开发的, 所以叫CPython , 在命令行下运行python就是 CPython解释器, CPython 是使用的最广的python解释器

    • IPython : IPython 是基于CPython 之上的一个互交的解释器, IPython , 只是在交互方式上有所增加, 其他方面跟CPython 一样.

    • PyPy: 它 目标是速度, pypy 采用 JIT 技术, 对于python 代码进行动态编译, 所以在运行速度显著提高

    • JPython : JPython 是运行在java 平台上的python解释器, 可以直接把python代码编译成Java字节码执行

    python 参数传递是值传递还是引用传递?

    • 首先 python的参数传递有: 位置参数, 默认值参数, 可变参数, 关键字参数.

    • 函数的传值到底是值传递还是引用传递,要分情况:

      • A 不可变参数用值传递: 像整数和字符串这样的不可变对象, 是通过拷贝进行传递的,因为你无论如何都不可能在原处改变不可变对象

      • B 可变参数是引用传递: 比如列表, 字典这样的对象是通过引用传递,可变对象能在函数内部改变


    网络部分

    1cookie 和session 的区别?

    2常见的端口号?

    1 http 和https 区别?

    2http常见状态码?

    3UDP 和 CTP 的区别?

    tcp/ip 协议族

    4七成模型?

    5csrf 攻击及防御?

    url形式?

    六大设计原则


    数据库整理

    mysql

    基础部分:

    面试部分:

    1数据库优化?

    2mysql 事务特性?

    • 原子性:

    • 隔离性:

    • 一致性:

    • 持久性:

    3mysql 有哪些引擎, 有什么区别?

    • innodb:

      • 支持事务

      • 支持外键

      • 支持行级锁

      • 5.5.5以后默认索引是innodb, 5.6.4innodb 也支持全文索引

      • 比较适合频繁修改,以及涉及安全性较高的 应用

      • innodb 不保存表单行数, select conunt(*) from 表 时 innodb 需要 扫描全表计算有多少行

    • myisam:

      • 不支持事务

      • 不支持外键

      • 支持表级锁

      • 5.5.5 以前是mysql的默认引擎,支持全文索引

      • 比较适合繁查询,插入为主的应用.

      • myisam 保存表的行数, 比如 select conunt(*) from 表 时 只需要读取出保存的行数

    4索引的类型?

    • 唯一索引: 索引的列必须唯一, 允许为空值

    • 主键索引: 特殊的唯一索引,不允许有空值

    • 全文索引: myisam 特有的 针对大数据 但是生成全文索引 耗时耗空间

      • 5.6.4 以前只有myisam 支持全文索引. 以后 innodb引擎也支持

    • 普通索引: 最基本的索引 没有任何限制

    • 复合索引: 多个字段同时建立索引

      • 查看所有的的索引: show index from 表名/G

      • 唯一索引

        • alter table 表 add unique(username); 创建唯一索引 没有名字

          alter table 表 add unique un_naem(username); 创建有名字的唯一索引

      • 主键索引

        • alter table 表名 add primary key(id) 创建主键索引

        • alter table 表名 modif id int(11) unsigned not null auto_increment 自增

      • 全文索引

        • alter table 表名 add fulltext f_name(username); 创建全文本索引

          • alter table 表名 drop index f_name 删除全文索引

    5sql注入及防御?


    爬虫部分

  • 相关阅读:
    #Laravel 笔记# 多语言化 App::setLocale() 持久化。
    thinkphp 3.2 发送邮件(Phpmailer)
    深度学习的注意力机制
    图像检索引擎vearch安装与测试使用
    word2vector
    GPU环境搭建
    ImportError: libSM.so.6: cannot open shared object file: No such file or dir
    shell中&&和||的用法
    Linux 远程连接sftp与ftp
    mysql-connector-java各版本及与mysql、JDK版本的对应
  • 原文地址:https://www.cnblogs.com/zhuyalong/p/11240979.html
Copyright © 2011-2022 走看看