logo

Python 面试问题

王哲峰 / 2023-01-09


目录

Python 数据结构

对象分类:

对象类型 对象名 分类 是否可变
数字 int,float,complex 数值
字符串 string 序列
列表 list 序列
字典 dict 对应
元组 tuple 序列
文件 file 扩展
Sets set 集合
frozenset 集合
bytearay 序列

要点:

Python Tuple 赋值问题

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

try:
   a, b = (123,)
except Exception as e:
   print("Error:", e)
finally:
   print("End")

输出结果:

> Error: Exception
> End

python buildin functions

   class Coordinate():
       x = 10
       y = -5
       z = 0

   point = Coordinate()
   delattr(Coordinate, "z")
sotred(iterable, key = None, reverse = False)

L = [5, 2, 3, 1, 4]
L.sort()
L_sorted = sorted(L)

D = {1: "D", 2: "B", 3: "B", 4: "E", 5: "A"}
D_sorted = sorted(D)

L2 = [5, 0, 6, 1, 2, 7, 3, 4]
L2_sorted = sorted(L2, key = lambda x: x * -1, reverse = True)
a = [1, 2, 3]
b = [4, 5, 6]
c = [4, 5, 6, 7, 8]

zipped = zip(a, b)
list(zipped)

list(zip(a, c))

a1, a2 = zip(*zip(a, b))
list(a1)
list(a2)
def square(x):
    return x ** 2

map(square, [1, 2, 3, 4, 5])
map(lambda x: x ** 2, [1, 2, 3, 4, 5])
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
def is_odd(n):
   return n % 2 == 1

tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(tmplist))
seq = ["one", "two", "three"]
for i, element in enumerate(seq):
    print(i, seq[i])
a = 2
b = "two"
isinstance(a, int)
isinstance(a, [str, int, list])

python collections 库

from collections import OrderedDict, Counter

# Remembers the order the keys are added
x = OrderedDict(a = 1, b = 2, c = 3)

# Counts the frequency of each character
y = Counter("Hello World!")

Python 单例模式

Singleton Pattern

Python 深拷贝和浅拷贝

import copy

a = [1, 2, 3, 4, ['a', 'b'], 'strings'] # 原始对象
b = a 						 # 赋值, 传递对象的引用
c = copy.copy(a) 			 # 对象拷贝, 浅拷贝
d = copy.deepcopy(a) 		 # 对象拷贝, 深拷贝

print(id(a))
print(id(b))
print(id(c))
print(id(d))

a.append(5)					 # 修改对象a
a[4].append('c')			 # 修改对象a中的可变对象list
a[5].upper()				 # 修改对象a中的不可变对象str

b.append(5)					 # 修改对象b
b[4].append('c')			 # 修改对象b中的可变对象list
b[5].upper()				 # 修改对象b中的不可变对象str

c.append(5)					 # 修改对象c
c[4].append('c')			 # 修改对象c中的可变对象list
c[5].upper()				 # 修改对象c中的不可变对象str

d.append(5)					 # 修改对象d
d[4].append('c')			 # 修改对象d中的可变对象list
d[5].upper()				 # 修改对象d中的不可变对象str

print('a = ', a)
print('b = ', b)
print('c = ', c)
print('d = ', d)

浅拷贝

在Python中标识一个对象的唯一身份是: 对象的 id, id(object) (内存地址)、对象类型、对象值. 浅拷贝就是创建一个具有相同类型、相同值但不同id 的新对象

对可变对象, 对象的值一样可能包含有对其他对象的引用, 浅拷贝产生的新对象, 虽然具有完全不同的 id, 但是其值若包含可变对象, 这些对象和原始对象中的值包含同样的引用

可见浅拷贝产生的新对象中可变对象的值发生改变时, 会对原对象的值产生副作用, 因为这些值是同一个引用

浅拷贝仅仅对对象自身创建了一份拷贝, 而没有再进一步处理对象中包含的值, 因此使用浅拷贝的典型使用场景是: 对象自身发生改变的同时需要保持对象中的值完全相同 , 比如: list 排序

深拷贝

深拷贝不仅拷贝了原始对象的地址, 也对其包含的值进行拷贝. 他会递归的查找对象中包含的其他对象的引用, 来完成更深层次拷贝. 因此, 深拷贝产生的副本可以随意修改而不需要担心会引起原始值的改变

值的注意的是, 深拷贝并非完完全全递归查找所有对象, 因为一旦对象引用了自身, 完全递归可能会导致无限循环. 一个对象被拷贝了, python会对该对象做个标记, 如果还有其他需要拷贝的对象引用着该对象, 他们的拷贝其实指的是同一份拷贝

使用 __copy____deepcopy 可以完成对一个对象拷贝的定制

Python 序列反转

L = [1, 2, 3, 4]
T = (1, 2, 3, 4)
S = "Python"
# List
L_reversed_v1 = L[::-1]
L_reversed_v2 = reversed(L)
print(L_reversed_v1, list(L_reversed_v2))
# Tuple
T_reversed_v1 = T[::-1]
T_reversed_v2 = reversed(T)
print(T_reversed_v1, tuple(T_reversed_v2))
# String
S_reversed_v1 = S[::-1]
S_reversed_v2 = "".join(reversed(S))
print(S_reversed_v1, S_reversed_v2)

Python 字典反转

字典的 key 和 value 对换

压缩器

D = {
   'a': 1,
   'b': 2,
   'c': 3,
   'd': 4
}

print(D.items())
print(D.keys())
print(D.values())
D_ziped = zip(D.values(), D.keys())
print(list(D_ziped))

D_reversed_v1 = dict(zip(D.values(), D.keys()))
print(D_reversed_v1)

字典解析

D_reversed_v2 = {v: k for k, v in D.items()}
print(D_reversed_v2)

Python求众数

import numpy as np

np.random.seed(123)
nums = np.random.randint(low = 1, high = 10, size = 10)

numpy.argmax(np.bincount())

nums_mode_v1 = np.argmax(np.bincount(nums))
print(nums_mode_v1)

scipy.stats

from scipy import stats
nums_mode_v2 = stats.mode(nums)[0][0]
print(nums_mode_v2)

Panda 和 Numpy 连接

Pandas DataFrame 合并,连接 & Numpy ndarray 合并, 连接

字符串拼接

+=

pieces = ['Today', 'is', 'really', 'a', 'nice', 'day', '!']
BigString = ''
for s in pieces:
    BigString += s + ' '
print(BigString)

% / .format()

S1 = '%s, Your current money is %.1f' % ('Nupta', 500.52)
S2 = '{}, Your current money is {:.1f}'.format('Nupta', 500.52)
print(S1)
print(S2)

“".join()

S = " ".join(pieces)
print(S)

随机数生成 (函数参数)

np.random.seed(123)                    # 设置随机数
np.random.permutation(np.arange(16))   # 返回一个序列的随机排列或返回一个随机排列的范围
np.random.shuffle(np.arange(5))        # 对一个序列就地随机排列
np.random.rand((5)                     # 生成均匀分布随机数[0, 1)
np.random.uniform(10)                  # 均匀分布(0, 1)
np.random.randint()                    # 从给定范围内随机取整数

正态分布
np.random.normal(loc = 0, scale = 1, size = (6))
np.random.normal(size = (5))
# from random import normalvariate
# normalvariate(, )
np.random.randn()                      # 标准正态分布
np.random.normal(loc = 0, scale = 1, size = (6))

其他分布
np.random.binomial(5)
np.random.beta(5)
np.random.chisquare(5)
np.random.gamma(5)

Python-Numpy

# np.ravel()
import numpy as np

x = np.array([[1, 2, 3], 
             [4, 5, 6]])
np.ravel(x)
np.ravel(x, order = 'C')
np.ravel(x, order = 'K')
np.ravel(x.T, order = 'F')
x.reshape(-1)

np.ravel(x, order = 'F')
np.ravel(x, order = 'A')
np.ravel(x.T, order = 'C')
# .flatten()
import numpy as np

x = np.arange(1, 7).reshape(2, 3)
x.flatten()
x.flatten(order = 'F')
# np.flat
x = np.arange(6).reshape(2, 3)
f1 = x.flat
type(f1)

for item in f1:
   print(item)

f1[2:4]
f1 = 3
f1[[1, 4]] = 1

f1.base
f1.coords
f1.index
f1.next()
f1.copy()

解析字符串

import json

string = '[{"requestid": "b9a9b0f264a44ec28f7d20ed4826c691", "content": "前台Ennma 退房很快"阮冬琴开发票也很快"两个人配合不错"}]'

# 正则表达式
# res = "".join([i for i in string if u'\u4e00' <= i <= u'\u9fff'])
# print(res)


# Json解析
while True:
    try:
        res = json.loads(string)[0]["content"]
        print(res)
        break
    except json.JSONDecodeError as e:
        str_index = int(str(e).split(" ")[-1][:-1])
        string = string[:str_index - 1] + string[str_index:]