python典型面试题

一、有个学生成绩的列表[15,58,99,28,78,67,83,57],需要对列表按照标准分组计数。

1)分组标准为[(0,59),(60,79),(80,89),(90,100)]

2)输出结果[(0,59):数量4,(60,79):数量2,(80,89):数量1,(90,100):数量1]

分析:

1、字典的理解和使用,字典可通过字典推导式、zip函数、字典的fromkeys函数生成

2、分组区间作为key,value统计数量,满足要求的计数+1

scores = [15, 58, 99, 28, 78, 67, 83, 57]
group = [(0, 59), (60, 79), (80, 89), (90, 100)]

# 字典生成1-字典推导式
dct = {k: 0 for k in group}

# 字典生成2-zip函数
# count = [0,0,0,0]
# dct = dict(zip(group, count))

# 字典生成3-字典的fromkeys函数, 需要初始化value为0
# dct = dict.fromkeys(group)
# for k in dct: dct[k] = 0

for i in scores:
    for k in group:
        if k[0] <= i <= k[1]:
            dct[k] += 1
            break
dct1 = {str(k):"数量"+str(v) for k,v in dct.items()}
print(dct1)

二、输入字符串,输出字符串中出现次数最多的字母及其出现次数

分析:字典的特性去重、字典推导式的使用

def find_max_str(str):
    # 集合字典去重,查找所有字母数量
    dct = {k: 0 for k in str}
    for i in str:
        for k in dct.keys():
            if i == k:
                dct[k] += 1
    # 查找字典中value最大的
    max = 1
    alphamax = ""
    for k, v in dct.items():
        if v > max:
            max = v
            alphamax = k
        else:
            pass
    return {alphamax:max}
print(find_max_str("hello hello lala"))

三、现有一个list,里面所有的元素都是字符串,编写一个函数对它实现一个大小写无关的排序,然后打乱这个排好序的list,再查找其中是否有某元素a

分析:

1、列表排序,不区分大小写,元素均转换成大写或小写,用sorted()函数

2、随机排序,导入random,使用random.shuffle(l)

3、列表的查找元素方式index(),不区分大小写的话可先转换后查找;也可直接用any()函数和列表推导式

import random
def list_handle1(lst, find_element):
    newlist = sorted(lst, key=lambda i: i.upper())
    random.shuffle(newlist)
    # 方法一:使用index()完全匹配,注意未找到元素时抛出ValueError异常
    try:
        idx = newlist.index(find_element)
        print("已找到对应元素")
    except ValueError:
        print("未找到对应元素")

def list_handle2(lst, find_element):
    newlist = sorted(lst, key=lambda i: i.upper())
    random.shuffle(newlist)
    flag = False
    # 不区分大小写,先转换成大写再判断
    # 方法一:for循环判断,找到元素设置flag为True
    # for i in newlist:
    #     if i.upper() == find_element.upper():
    #         flag = True
    # 方法二:使用any函数+列表推导式
    flag = any(i.lower() == find_element.lower() for i in newlist)
    if flag == True:
        print("已找到对应元素")
    else:
        print("未找到对应元素")

list_handle1(['a', 'Z', 'C', 'g'], 'a')
list_handle2(['b', 'Z', 'C', 'g'], 'a')
list_handle2(['yes', 'Why', 'change', 'Python'], 'Python')

四、写一段程序,逐行读取一个文本文件(每行均为字符串),并在屏幕上打印文件每行的内容,打印每行内容的首字母要求大写。

分析:文件读取,并处理文件内容,首字母大写函数capitalize(),字符串去空strip()

def file_handle(filename):
    # 实现一
    # file = open(filename, 'r')
    # for line in file.readlines():
    #     print(line.strip().capitalize())
    # file.close()
    # 实现二
    with open(filename, 'r') as file:
        for line in file:
            print(line.strip().capitalize())
file_handle("text.txt")

五、生成一个字典,将字典内容写入到一个csv文件之中,首先生成csv文件首行的表头,再将字典中的内容写入到表头对应的列。

分析:

1、csv文件写入,导入包csv ,csv.DictWriter(csvfile, fieldnames=headers)

2、针对单字典或者列表字典,选择指定字典的keys()作为csv文件的表头

3、csv写入文件,writeheader()写入表头,writerow()写入一行数据,writerows()写入多行数据

4、newline=‘’,避免写入空行;含中文时指定encoding='utf-8-sig'进行编码处理

import csv
def dict_handle(dct, file):
    # 键作为表头
    headers = dct.keys()
    # 写入csv文件
    with open(file, 'w', newline='', encoding='utf-8-sig') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=headers)
        writer.writeheader()
        writer.writerow(dct) # 写入一行数据

def list_dict_handle(lst, file):
    # 获取表头
    headers = lst[0].keys()
    # 写入csv文件
    with open(file, 'w', newline='', encoding='utf-8-sig') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=headers)
        writer.writeheader()
        writer.writerows(lst)  # 写入多行数据

if __name__ == "__main__":
    # 写入字典,单行数据
    # sample_dict = {"姓名": "张三","年龄": 25,"城市": "北京","职业": "工程师"}
    # dict_handle(sample_dict, "output.csv")
    # 写入字典列表,多行数据
    sample_dict = [
        {"姓名": "张三","年龄": 25,"城市": "北京","职业": "工程师"},
        {"姓名": "王五","年龄": 31,"城市": "深圳","职业": "设计师"}
    ]
    list_dict_handle(sample_dict, "output.csv")
    print("字典已成功写入output.csv文件")

### 图像处理与OpenCV常见面试题及答案 #### 1. 如何使用OpenCV读取和显示图像? OpenCV 提供了 `cv2.imread()` 函数用于读取图像文件,`cv2.imshow()` 函数用于在窗口中显示图像。例如: ```python import cv2 # 读取图像 img = cv2.imread('image.jpg') # 显示图像 cv2.imshow('Image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码展示了如何加载并显示图像的基本操作[^1]。 #### 2. 如何调整图像的大小? 可以使用 `cv2.resize()` 函数来调整图像尺寸。例如,将图像缩放为宽度为 300 像素,高度按比例调整: ```python resized_img = cv2.resize(img, (300, 0), fx=0, fy=0) ``` 该方法允许通过指定目标尺寸或缩放因子进行图像缩放[^1]。 #### 3. RGB图像转换为灰度图的原理是什么? RGB 图像转换为灰度图的本质是将三维颜色空间映射到一维亮度空间。通常使用的加权公式为: $$ Gray = 0.299 \times R + 0.587 \times G + 0.114 \times B $$ 该公式考虑了人眼对不同颜色的敏感程度,其中绿色权重最高,蓝色最低。OpenCV 中可通过 `cv2.cvtColor()` 实现: ```python gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ``` 此过程利用了人眼对亮度变化的非线性感知特性[^3]。 #### 4. 如何检测图像中的边缘? OpenCV 提供了多种边缘检测方法,如 Sobel、Canny 和 Laplacian 算子。以 Canny 边缘检测为例: ```python edges = cv2.Canny(gray_img, threshold1=100, threshold2=200) ``` Canny 算法结合了高斯滤波、梯度计算和非极大值抑制等步骤,能够有效提取图像边缘信息。 #### 5. OpenCV 中的人脸识别方法有哪些? OpenCV 提供了多种人脸识别方法,包括基于 Haar 级联分类器的传统方法和基于深度学习的方法。例如,使用 Haar 分类器进行人脸检测: ```python face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=5) ``` 此外,也可以集成深度学习模型(如 DNN 模块)实现更高精度的人脸识别[^2]。 #### 6. 物体跟踪的基本流程是什么? 物体跟踪通常涉及颜色空间转换、掩膜生成、轮廓检测等步骤。以下是一个基于颜色阈值的简单示例: ```python hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) lower_red = np.array([0, 120, 70]) upper_red = np.array([10, 255, 255]) mask = cv2.inRange(hsv, lower_red, upper_red) contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) ``` 上述流程适用于静态背景下的颜色目标跟踪任务[^1]。 #### 7. OpenCV 中的仿射变换与透视变换有何区别? 仿射变换保持平行关系不变,常用于图像旋转、平移和缩放;而透视变换可处理图像的倾斜视角变化,适用于更复杂的几何变形。两者分别通过 `cv2.warpAffine()` 和 `cv2.warpPerspective()` 实现。 仿射变换矩阵由三个点确定,而透视变换需要四个对应点来构建变换矩阵[^1]。 #### 8. 如何使用卷积神经网络进行目标检测?列举两种主流算法。 目前基于卷积神经网络的目标检测方法主要分为 one-stage 和 two-stage 两类。one-stage 方法直接预测目标类别和位置,代表性算法有 YOLO(You Only Look Once)和 SSD(Single Shot MultiBox Detector)。two-stage 方法先生成候选区域再进行分类,典型代表是 Faster R-CNN。 这些算法在速度与精度之间提供了不同的平衡点,适用于不同场景的需求[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值