Python面试题——基础篇

文件操作时,xreadlines和readlines的区别?

readlines()是把文件的全部内容读取到内存,并解析成一个字符串列表。
xreadlines()返回一个iter(file)迭代器,在Python2.3后已经不推荐这种表示方法了,直接使用for循环迭代文件对象。

运算符 is 与 == 有什么区别?

Python中对象包含三要素:id, type, value。其中id用来唯一标识一个对象,type标识对象的类型,value是对象的值。
is,判断的是对象间的唯一身份标识,即id是否相同。
==,判断两个对象的value(值)是否相等。

现有字典 dict = {'a':24, 'g': 52, 'i':12, 'k':33}请按字典中的value值进行排序?

sorted(dict.items(), key = lambda x:x[1], reverse=True) #reverse决定顺序还是倒序

如何将一个字符串逆序输出?

1、切片法
print('str'[::-1])
2、转换成列表
list = list(str)
list.reverse()
''.join(list)

常用字符串格式化哪几种?

name = 'zhangsan'
1) %占位符
'hello %s' % name
2) format
msg = "my name is {}, and age is {}"
msg.format("hqs",22)
3) f-string (python3.6之后才有的特性)
s = f'{name}  你好'

下面代码输出的结果是什么?

list = ['a', 'b', 'c', 'd', 'e']
print(list[10:]) #输出[],不会产生IndexError错误

print(list[10]) #IndexError: list index out of range,列表越界

写一个列表生成式,产生一个公差为11的等差数列

print([x*11 for x in range(10)])

如何求两个列表(list)的交集、差集或并集?

list1 = [1, 2, 3]
list2 = [3, 4, 5]
set1 = set(list1)
set2 = set(list2)
#交集
set1&set2,set1.intersection(set2)
#差集
set1^set2,set1.difference(set2)
#并集
set1.union(set2)

如何删除一个列表(list)中的重复元素?

elements = ['a', 'b', 'c', 'a']
1、使用集合的方式
e = `list(set(elements))`
如何想保持原来的顺序,可以加上sort方法,如下
`e.sort(key = elements.index)`
2、使用字典的方式,利用字典key的唯一性
`list({}.fromkeys(elements))` 或 `list({}.fromkeys(elements).keys())`

列举字符串、列表、元组、字典常用的5个方法

字符串:replace, strip, split, reverse, upper, lower,join...
列表:append, pop, insert, remove, sort, count, index...
元组:index, count, len, dir
字典:get, keys, values, pop, popitems, clear, update, items...

什么是反射?以及应用场景?

绝大部分语言中都有反射机制的存在,可以用字符串的方式去访问对象的属性,
调用对象的方法(但是不能去访问方法),Python中一切皆对象,是很多框架的基石。

Python垃圾回收机制

自动帮助我们管理内容,清理垃圾的一种工具
1、引用计数
简单直观
2、标记清除
3、分代回收

如何打乱一个排好序的list对象?

import random
random.shuffle(list)

从0-99这100个数中随机取出10个,要求不能重复,可以自己设计数据结构

print([x * x for x in range(1, 11)])

Python递归的最大层数

最大数为998

列表推导式和生成器表达式分别输出什么?

[i % 2 for i in range(10)]
(i % 2 for i in range(10))

什么是闭包?谈谈对闭包的理解

闭包函数是定义在一个函数内部的函数,为外层函数包裹着,特点是可以访问外层函数中的变量。
def outer():
  num = 1
  def inner():
    print(num)
  return inner

func = outer()
num = 10000
func() #输出结果:1

#理解
函数式编程的重要语法结构,也是一种组织代码的结构,统一提高了代码的可重复使用性。
当一个内嵌函数引用其外部作用域的变量,就会得到一个闭包。创建一个闭包必须满足以下几点:
* 必须有一个内嵌函数
* 内嵌函数必须引用外部函数中的变量
* 外部函数的返回值必须是内嵌函数

请实现一个装饰器,限制该函数被调用的频率,如10秒一次

import time
def time_pay(func):
  def inner(*args, **kwargs):
    for line in range(10):
      print(line + 1)
      time.sleep(1)

    res = func(*args, **kwargs)
    return res
  return inner
@time_pay
def func1():
  print('from func1...')

func1()

函数调用的时候参数的传递方式是值传递还是引用传递?

参数传递有:位置参数、默认参数、可变参数、关键字参数
分情况:
不可变参数用值传递:如整数和字符串
不可变对象:可变参数是引用传递的,如列表、字典

递归函数停止的条件?

终止条件一般定义在递归函数内部,在递归调用前要做一个条件判断,根据判断的结果选择是继续调用自身还是return,返回终止递归。
终止的条件:
1、判断的次数是否达到某一限定值
2、判断运输的结果是否达到某个范围等,根据设计的目的来选择

mro是什么?

全称 Method Resolution Order,指的是方法解析顺序
方法调用事就需要对当前类和基类进行搜索以确定方法所在的位置,而搜索是顺序就是所谓的“方法解析顺序”。

什么是 C3 算法?

最早被提出是用在Lisp中,应用在Python中是为了解决原来基于深度优化搜索算法不满足本地优先级和单调性的问题。
本地优先级:指声明时父类的顺序,比如C(A,B),如果访问C类对象属性,应该根据声明顺序,优先查找A类,然后再查找B类。
单调性:如果C的解析顺序中,A排在B的前面,那么在C的所有子类里,也必须满足这个顺序。

列举面向对象中带双下划线的特殊方法

__setattr__
__delattr__
__getattr__
__getattribute__

双下划线和单下划线的区别?

单下划线:开始的成员变量叫保护变量,只有类对象和子类对象自己能访问。
双下划线:开始的是私有成员,只有类对象自己能访问,子对象也不能访问到这个数据。

请口述with的用法

上下文协议所需要的方法,__enter__, __exit()__

实现一个Singleton单例类,要求遵循基本语言编程规范,用尽可能多的方式


json序列化时,默认遇到中文会转换成 Unicode,如何保留中文?

import json
a = json.dumps({"ddf":"你好"}, ensure_ascii=False)
print(a)

匹配HTML标签的时候,<.*><.*?>有什么区别?

`<.*>` 贪婪匹配,会匹配到符合条件的所有标签
`<.*?>` 非贪婪匹配,匹配到符合条件的第一个标签
原文地址:https://www.cnblogs.com/jiaoran/p/14290550.html