Python语言面试问题集锦(实时更新ing)
目录
6: Python语言怎么处理内存溢出的情况, 怎么设计内存回收?
9: 列出python中可变数据类型和不可变数据类型,并简述原理
10: filter方法的使用, 求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1: python中小整数对象池
Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,无论这个整数处于LEGB中的哪个位置,所有位于这个范围内的整数使用的都是同一个对象。同理,单个字母也是这样的。
上图解释: 变量num1和变量num2的地址是相同的, 是因为它们指的都是小整数对象池中的3, 但是后面将它们都赋值为300的时候,会发现地址不一样了,是因为300不在小整数池中,相当于两个对象. 即使小整数是在列表中, 它们的地址也是相同的, 还有就是单个字母,它们的地址也是相同的.
2: 元祖那些事
不可变(immutable)对象类型: int, float, decimal, complex, bool, str, tuple, range, frozenset. bytes
可变(mutable)对象类型: list, dict, set. bytearray
元祖中是可以放可变类型的,如放入两个列表,列表中的元素可以随意添加更改.
3: endswith()的用法
endswith() 方法用于判断字符串是否以指定后缀结尾,如果以指定后缀结尾返回True,否则返回False。可选参数"start"与"end"为检索字符串的开始与结束位置。
上图解释: 定义了字符串a, 直接不指定可选参数start和end的话, 默认是字符串结尾, 例子一就是说a字符串是否以'you'串结尾, 例子二指定了start=0, end=3 相当于就是将原始字符串0-3的字符单独看, 不算3. 看是否有'ow'结尾.
4: __main__的一些问题
用第二个函数去调用第一个函数, 注意: 如果单独执行第一个函数, 也就是print_fun.py, '__name__ value:' 为 __main__, 如果通过调用, 即执行print_module.py '__name__ value:' 为print_fun. 也不会去执行main()函数
5: python中,集合是怎样保证去重的?
答: python中集合的元素必须是唯一的(即hashable类型). 因此必须是不可变类型, 不可变类型: tuple, constant 可变类型: list dict set. 同理 字典的key也不能为不可变类型.
集合去重主要是对地址的比对, 同一个数的ids是一样的. 当一个值要加入集合时, 如果该值在集合中, 那这个值对应的地址, 集合也知道. 因此无法加入.
6: Python语言怎么处理内存溢出的情况, 怎么设计内存回收?
答: 内存泄露: 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。导致程序运行速度减慢甚至系统崩溃等严重后果。有 del() 函数的对象间的循环引用是导致内存泄漏的主凶。不使用一个对象时使用:del object 来删除一个对象的引用计数就可以有效防止内存泄漏问题。通过 Python 扩展模块 gc 来查看不能回收的对象的详细信息。可以通过 sys.getrefcount(obj) 来获取对象的引用计数,并根据返回值是否为 0 来判断是否内存泄漏
内存溢出: 内存溢出: 你申请了10个字节的内存,但写入了大于10个字节的数据
内存溢出原因:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,产生了堆积,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小
内存溢出的解决方案:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)
第二步,检查错误日志,查看“OutOfMemory”错误前是否有其 它异常或错误。
第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。
7: python中列表切片会出现索引错误吗?
答: 不会, 如果你按索引去找,会报Indexerror, 但是切片不会,切片的过程中,如果你的索引大于列表的长度,会切出一个空列表
8: python2和python3区别? 列举五个
答: ①. python3使用print()打印, python2既可以使用python() 也可以不加括号, 用空格隔开.
②. python3中range返回的是迭代器, 节约内存, 而python2中返回的是一个列表
③. python3中使用utf-8编码, python2使用ASCII码编码
④. python3中可以直接使用中文, 而python2中需要引用coding声明
⑤. python3中使用input()函数, 而python2中使用的是raw_input()函数
9: 列出python中可变数据类型和不可变数据类型,并简述原理
答: 不可变数据类型:数值型、字符串型string和元组tuple
不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象(一个地址).
可变数据类型:列表list和字典dict;
允许变量的值发生变化,即如果对变量进行append、+=等这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,不过对于相同的值的不同对象,在内存中则会存在不同的对象,即每个对象都有自己的地址,(a = [1, 2], b = [1, 2] 他们是不同的对象) 相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象
10: filter方法的使用, 求出列表所有奇数并构造新列表,a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
答: filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表