【python面试170题】8. 其他内容

【面试题目来着微信公众号:GitChat】

其他内容

  1. 解释一下 python 中 pass 语句的作用?
    写代码的时候用作占位。在搭建代码框架时,功能模块可以先用注释和pass占位,之后再补充完善代码。

  2. 简述你对 input()函数的理解
    用户输入字符串,返回一个字符串。

  3. python 中的 is 和==
    【is】比较地址是否相同
    【==】比较值是否相等

  4. Python 中的作用域
    【概念】在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域。
    【分类】LEGB
    L(local)局部作用域:函数
    E(enclosing)嵌套作用域:父函数
    G(global)全局作用域:模块
    B(built-in)内置作用域:系统内固定模块里定义的变量

  5. 三元运算写法和应用场景?
    【写法】为真时的结果 if 判断条件 else 为假时的结果(注意,没有冒号)
    【应用】return返回时我会用到。return True if XXX else False

  6. 了解 enumerate 么?
    【enumerate(sequence, [start=0])】用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中
    【应用】遍历列表时,获取索引。

    for i, v in enumerate(l):
    	print("索引:% s" % i)
    	print("元素:% s" % v)
    
  7. 列举 5 个 Python 中的标准模块
    math,os,sys,time,datetime,logging,threading,multiprocessing等
    python 标准库

  8. 如何在函数中设置一个全局变量

    global xxx
    
  9. pathlib 的用法举例
    pathlib是 python3.x中加入的处理路径的模块,类似os.path.

    常用操作

    p = Path(r'd:\test\tt.txt.bk')
    p.name                          # 获取文件名
    # tt.txt.bk
    p.stem                          # 获取文件名除后缀的部分
    # tt.txt
    p.suffix                        # 文件后缀
    # .bk
    p.suffixs                       # 文件的后缀们...
    # ['.txt', '.bk']
    p.parent                        # 相当于dirnanme
    # WindowsPath('d:/test')
    p.parents                       # 返回一个iterable, 包含所有父目录
    # <WindowsPath.parents>
    for i in p.parents:
        print(i)
    # d:\test
    # d:\
    a.parts                         # 将路径通过分隔符分割成一个元祖
    # ('d:\\', 'test', 'tt.txt.bk')
    

    另一些常用操作…

    p = Path(r'd:\test')
    p = Path(p, 'tt.txt')           # 字符串拼接
    p.exists()                      # 判断文件是否存在
    p.is_file()                     # 判断是否是文件
    p.is_dir()                      # 判断是否是目录
    

    遍历文件夹

    p = Path(r'd:\test')
    # WindowsPath('d:/test')
    p.iterdir()                     # 相当于os.listdir
    p.glob('*')                     # 相当于os.listdir, 但是可以添加匹配条件
    p.rglob('*')                    # 相当于os.walk, 也可以添加匹配条件
    

    创建文件夹

    p = Path(r'd:\test\tt\dd')
    p.mkdir(exist_ok=True)          # 创建文件目录(前提是tt目录存在, 否则会报错)
    # 一般我会使用下面这种创建方法
    p.mkdir((exist_ok=True, parents=True) # 递归创建文件目录
    

    文件详细信息(size, createtime…)

    p = Path(r'd:\test\tt.txt')
    p.stat()                        # 获取详细信息
    # os.stat_result(st_mode=33206, st_ino=562949953579011, st_dev=3870140380, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1525254557, st_mtime=1525254557, st_ctime=1525254557)
    p.stat().st_size                # 文件大小
    # 0
    p.stat().st_ctime               # 创建时间
    # 1525254557.2090347
    # 其他的信息也可以通过相同方式获取
    p.stat().st_mtime               # 修改时间
    
  10. Python 中的异常处理,写一个简单的应用场景

    def test39():
        try:
            print("捕获异常")
            raise Exception("被捕获到的异常")
        except Exception as e:
            print("成功捕获到异常: %s" % e)
        else:
            print("没有异常则执行.")
        finally:
            print("无论是否异常都执行")
    
  11. Python 中递归的最大次数,那如何突破呢?
    python中为了防止无限递归造成python异常崩溃,设置了默认的最大递归次数,默认值是1000.如果超出了最大次数,则会抛出异常RecursionError: maximum recursion depth exceeded while calling a Python object

    import sys
    sys.getrecursionlimit()	# 查看最大递归次数
    sys.setrecursionlimit(1500)	# 设置最大递归次数
    
  12. 什么是面向对象的 mro
    【理解】方法解析顺序(Method Resoluthion Order, 或MRO)
    【应用】这个帖子说得挺好的
    【现在新版本的MRO】python2.3之后,C3算法便是唯一用来确认新类的方法解析顺序的算法了。C3算法就是,C的线性化是C加上父类的线性化和父类列表的总和:L[SubClass(Base1, Base2, ..., BaseN)] = [SubClass] + merge(L[base1], ..., L[baseN], Base1, ..., BaseN)
    这里的关键在于 merge,其输入是一组列表,按照如下方式输出一个列表:
    1.检查第一个列表的头元素(如 L[B1] 的头),记作 H。
    2.若 H 未出现在其它列表的尾部,则将其输出,并将其从所有列表中删除,然后回到步骤1;否则,取出下一个列表的头部记作 H,继续该步骤。
    3.重复上述步骤,直至列表为空或者不能再找出可以输出的元素。如果是前一种情况,则算法结束;如果是后一种情况,说明无法构建继承关系,Python 会抛出异常。
    【例子】

    class X(object): pass
    
    class Y(object): pass
    
    class A(X, Y): pass
    
    class B(X, Y): pass
    
    class C(A, B): pass
    
    print C.__mro__
    
    L[object] = [object]
    L[X] = [X, object]
    L[Y] = [Y, object]
    L[A] = [A] + merge(L[X], L[Y], [X], [Y])
    	 = [A] + merge([X, object], [Y, object], [X], [Y])
         = [A, X] + merge([object], [Y, object], [Y])
         = [A, X, Y] + merge([object], [object])
         = [A, X, Y, object]
    # 同理可以得出
    L[B] = [B, Y, X, object]
    # 最终可得出C
    L[C] = [C] + merge(L[A], L[B], [A], [B])
    = [C] + merge([A, X, Y, object], [B, X, Y, object], [A], [B])
    = [C, A] + merge([X, Y, object], [B, X, Y, object])
    = [C, A, B] + merge([X, Y, object], [X, Y, object])
    = [C, A, B, X] + merge([Y, object], [Y, object])
    = [C, A, B, X, Y] + merge([object], [object])
    = [C, A, B, X, Y, object]
    
  13. isinstance 作用以及应用场景?
    【作用】判断对象是否为某种类。
    【应用】校验参数类型时我会使用这个方法。

  14. 什么是断言?应用场景?
    python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。

  15. lambda 表达式格式以及应用场景?
    【格式】lambda 参数: 表达式
    【应用场景】简单的,可以一行书写的代码中使用,可以简化代码。在内置方法filter(), map(), reduce()中使用口感更佳.

  16. 新式类和旧式类的区别
    【分类】在python2中存在两种类,经典类和新式类,而新式类都继承于object。在python2.1之前,经典类是唯一的选择,python3之后新式类是唯一的选择,而python2.2~python2.7则可以混杂使用,但推荐使用新式类。
    【区别】
    1.经典类(calssic class),深度优先遍历
    2.在python2.2中提出了type和class的统一,出现了一个内建类型以及自定义类的公共祖先object,即新式类(new-style class)预计算
    3.python2.3之后新式类的C3算法,这是python3唯一支持的方式

  17. dir()是干什么用的?
    【作用】dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息
    【语法】dir([object])

  18. 一个包里有三个模块,demo1.py, demo2.py, demo3.py,但使用 from tools import *导入模块时,如何保证只有 demo1、demo3 被导入了。

# 在包的__init__.py文件或.py文件中定义__all__属性
__all__ = ["demo1", "demo3"]
  1. 列举 5 个 Python 中的异常类型以及其含义
    【Exception】常规异常的基类
    【BaseException】所有异常的基类
    【AssertionError】断言语句False
    【AttributeError】对象没有这个属性
    【ImportError】导入模块失败
    【KeyError】映射中没有这个key
    【SyntaxError】语法错误

  2. copy 和 deepcopy 的区别是什么?
    【copy】浅拷贝,可变类型的元素的地址是不变的,没有做拷贝。
    【deepcopy】深拷贝,递归拷贝,所有的子元素都进行了拷贝。包括可变类型数据。

  3. 代码中经常遇到的*args, **kwargs 含义及用法。
    在这里插入图片描述

  4. Python 中会有函数或成员变量包含单下划线前缀和结尾,和双下划线前缀结尾,区别是什么?
    这些都是私有变量或私有方法
    _a单前置下划线,私有化属性或方法,类对象和子类可以访问,from somemodule import *禁止导入
    __a双前置下划线,私有化属性或方法,无法在外部直接访问(名字重整所以访问不到)
    __a__双前后下划线,系统定义名字(不要自己发明这样的名字)
    a__单后置下划线,用于避免与Python关键词的冲突

  5. w、a+、wb 文件写入模式的区别
    在这里插入图片描述

  6. 举例 sort 和 sorted 的区别
    【sort】是列表的方法,是对原列表进行排序,没有返回值。
    【sorted】是内置的函数,是副本排序,返回一个排序之后的对象,原数据是不会变的。

  7. 什么是负索引?
    负索引就是从右往左计数的索引,最右一位是-1,倒数第二为是-2,以此类推。

  8. pprint 模块是干什么的?
    pprint是python的内置模块,打印出来比print更美观。

  9. 解释一下 Python 中的赋值运算符

def test42():
    a = 5
    b = a  # 把a的地址传给b
    a += 1  # a = a + 1
    a -= 1  # a = a - 1
    a *= 1  # a = a * 1
    a /= 1  # a = a / 1
    a //= 1  # a = a // 1
    a %= 1  # a = a % 1
    a **= 1  # a = a ** 1
  1. 解释一下 Python 中的逻辑运算符
    在这里插入图片描述
  2. 讲讲 Python 中的位运算符
    在这里插入图片描述
  3. 在 Python 中如何使用多进制数字?
    【二进制】二进制数字由0和1组成,我们使用0b或0B前缀表示二进制数,使用bin()函数强转为二进制
    【八进制】八进制数由数字0-7组成,用前缀0o或0O表示8进制数;使用oct()函数强转八进制
    【十六进制】十六进数由数字0-15组成,用前缀0x或者0X表示16进制数;使用hex()函数强转十六进制
    【十进制】正常数字,使用int()函数转换为十进制
  4. 怎样声明多个变量并赋值?
a, b =1,2

面试题目来着微信公众号:GitChat
Python 爬虫面试题 170 道
以上答案皆为鄙人回答,如有问题,敬请诸君指出.
【python面试170题】系列
1. 语言特性
2. 编码规范
3. 数据类型-字符串
4. 数据类型-列表、字典
5. 数据类型-综合
6. 操作类题目
7. 高级特性、正则表达式
8. 其他内容
9. 算法和数据结构
10. 爬虫相关
11. 网络编程、并发、Git

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值