2022-08-12 python暑期面试题目

题目1

现有函数mix和 f,代码如下:

"""Question 1 Code"""

def mix(f):
    def g(x):
        def h(y):
            return f(x, y) 
        return h

    def x(f):
        f = lambda x, y: x * 2 + y
        return f

    def y(x):
        x = lambda x, y: x + y * 2
        return f

    f = y(x(f))

    return g


def f(x, y): 
    f = lambda x, y: x + y 
    return mix(f)(x)(y) 

res = f(2, 3)

【单选】运行程序后,变量 res 的值是:( )
[A] 5
[B] 7
[C] 8
[D] 程序报错

题目1解析:本题目主要考察lambda函数与函数调用机制。
(1) 首先 f 作为一个函数被定义,其形参为 x 与 y 。在 f 函数体内定义了一个局部变量 f。为避免混淆,这时我们可以忽略前一个函数名 f,将其替换成 m 或者 n 也可以:

#将函数f名称换位m
def m(x, y): 
    f = lambda x, y: x + y 
    return mix(f)(x)(y) 

res = m(2, 3)

(2) 然后我们重点关注这个局部变量f,在m函数体其被赋值为一个lambda表达式,之后作为实参传入了mix(f),mix()函数的形参名也是f,为了避免混淆,我将形参f全部用n来代替,后面的x函数与y函数的形参我也分别换成了x1与x2:

def mix(n):
    def g(x):
        def h(y):
            return n(x, y) 
        return h

    def x(x1):
        x1 = lambda x, y: x * 2 + y
        return x1

    def y(x2):
        x2 = lambda x, y: x + y * 2
        nonlocal n
        n = x2
        return n  # 此时n作为mix函数的局部变量,是y函数的外部函数中的一个变量,可以直接访问,但要修改需用nonlocal

    #print(f(2,3))
    n = y(x(n))

    return g # 返回的是一个函数,这个函数通过嵌套得到的是一个lambda函数。


def m(x, y): 
    f = lambda x, y: x + y 
    return mix(f)(x)(y)   # 这里传入mix函数的f就是上边的lambda
                           # mix函数是m函数体内的一部分,因此f对于m函数来说是一个局部变量
                           # f对于mix函数是一个传入的实参
# print(f)  在m函数外部无法访问其局部变量f

res = m(2, 3)
print(res)

上面程序的运行结果与最初程序的运行结果分别是5和8,读者可以根据注释仔细地品。其中用到了函数变量作用域的知识可以参考这篇文章:2022-08-12 python函数式编程 - 简书 (jianshu.com)

题目2

字符串 s 只包括字符 ‘(’ 和 ‘)’,判断s是否是有效的括号表示。有效的括号要求:每组括号成对出现,左括号一定可以找到与之匹配的、位置正确的右括号。补全下列函数。

"""Question 2 Code"""

def is_parentheses(s: str) -> bool:
    """ 
    Is Valid Parentheses
    
    >>> is_valid("()")
    True
    >>> is_valid("(()(()()))")
    True
    >>> is_valid(")(")
    False
    >>> is_valid("((")
    False
    >>> is_valid("(")
    False
    >>> is_valid("())(")
    False
    """

    """TODO: WRITE YOUR CODE HERE"""

【Tips】如何测试代码是否正确:
若代码文件名为 question2.py,可在命令行中执行如下指令,进行文档测试。

 python3 -m doctest question2.py

题目2解析:本题目可以在leetcode找到类型原题,具体思路如下:利用一个栈,不断地往里压左括号,一旦遇上了一个右括号,我们就把栈顶的左括号弹出来,表示这是一个合法的组合,以此类推,直到最后判断栈里还有没有左括号剩余。
在python中使用list即可实现栈数据结构,通过append()方法在栈顶增加一个元素,通过pop()方法在栈顶删除一个元素,保证“后进先出”。以下是问题2的答案代码:

# 上勘院暑期第二题
def is_parentheses(s: str) -> bool: # 输入函数需要是一个字符串,返回值类型是bool
    if not isinstance(s, str):  # 判断输入的实参是否为字符串,不是字符串予以提示
        print('请输入一个字符串实参')
        return False
    for i in s:
        if (i != '(') and (i != ')'):
            print('输入的字符串元素只能是"("或者")"')
            return False
    lst = [i for i in s] #将字符串转换为列表
    #print(lst)
    stack = [] # 建立一个空栈,用来处理字符串
    for i in lst:
        if i == '(':
            stack.append(i)  # 如果遇到了左括号,就将其压入栈中
        elif i == ')': # 如果遇到了右括号
            if lst.index(i) == 0: # 如果字符串第一个元素是右括号,
                return False
            else:
                if stack == []:
                    return False # 如果此时栈中已经没有左括号,说明右括号多了
                else:
                    stack.pop() # 遇到一个右括号就弹出一个与之对应的左括号
    if len(stack) == 0: # 遍历完字符串所有元素后判读栈中是否还有剩余的左括号,没有的话说明左右括号正好匹配
        return True
    else:
        return False
if __name__ == '__main__':
    print(is_parentheses('()'))  # 返回True
    print(is_parentheses('(()(()()))'))  # 返回True
    print(is_parentheses(')('))  # 返回False
    print(is_parentheses('(('))  # 返回False
    print(is_parentheses('('))   # 返回False
    print(is_parentheses('('))   # 返回False
    print(is_parentheses('())('))  # 返回False

题目3

现有一组传感器在对某结构变形进行监测,传感器id分别为1~10。每隔一段时间,各个传感器都会采集一次数据,得到原始数据文件为 raw_data.csv。
原始数据中包含三个字段:
◦ time: 本次测量的时间,timestamp格式
◦ id: 传感器的id
◦ val: 本次测值
由于各个传感器获得采集信号的时间不一致,同一个测量指令下,各个传感器时间的采集时间略有不同。你的任务是确定各传感器的测量批次,并输出结果文件 result.csv。结果文件会在原始数据的基础上新增一列:
◦ batch: 测量批次,递增整数
题目提供了如下的代码框架,已经实现了数据文件的读取和结果文件的保存。你只需要完成文件中的 process() 函数部分。请将完成后的代码和运得到的结果文件粘贴在下方。

【Tips】
• 由于硬件的不稳定,部分传感器的测值可能在某次测量时缺失
• 代码框架:

"""Question 3 Code"""

import os
import numpy as np
import pandas as pd


def load_raw_data():
    """load raw data from `raw_data.csv` file, return DataFrame"""
    path = os.path.join(os.path.curdir, "raw_data.csv")
    print(path)
    assert os.path.exists(path), "未找到 [raw_data.csv], 请将csv文件与代码文件放在同一目录"
    data = pd.read_csv(path, encoding="utf-8")
    return data


def save_result(result: pd.DataFrame):
    """save processed data to `result.csv` file"""
    path = os.path.join(os.path.abspath("."), "result.csv")
    result.to_csv(path, encoding="utf-8", index=None)


def process(data: pd.DataFrame) -> pd.DataFrame:
    """TODO: WRITE YOUR CODE HERE"""


def main(file_name: str, depth: int):
    """main function to run the whole process"""
    data = load_raw_data()
    result = process(data)
    save_result(result)


if __name__ == "__main__":
    main()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容