題目1
現(xiàn)有函數(shù)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)
【單選】運(yùn)行程序后,變量 res 的值是:( )
[A] 5
[B] 7
[C] 8
[D] 程序報(bào)錯(cuò)
題目1解析:本題目主要考察lambda函數(shù)與函數(shù)調(diào)用機(jī)制。
(1) 首先 f 作為一個(gè)函數(shù)被定義攒磨,其形參為 x 與 y 缺亮。在 f 函數(shù)體內(nèi)定義了一個(gè)局部變量 f。為避免混淆形庭,這時(shí)我們可以忽略前一個(gè)函數(shù)名 f,將其替換成 m 或者 n 也可以:
#將函數(shù)f名稱換位m
def m(x, y):
f = lambda x, y: x + y
return mix(f)(x)(y)
res = m(2, 3)
(2) 然后我們重點(diǎn)關(guān)注這個(gè)局部變量f藻治,在m函數(shù)體其被賦值為一個(gè)lambda表達(dá)式碘勉,之后作為實(shí)參傳入了mix(f),mix()函數(shù)的形參名也是f桩卵,為了避免混淆验靡,我將形參f全部用n來代替,后面的x函數(shù)與y函數(shù)的形參我也分別換成了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 # 此時(shí)n作為mix函數(shù)的局部變量雏节,是y函數(shù)的外部函數(shù)中的一個(gè)變量胜嗓,可以直接訪問,但要修改需用nonlocal
#print(f(2,3))
n = y(x(n))
return g # 返回的是一個(gè)函數(shù)钩乍,這個(gè)函數(shù)通過嵌套得到的是一個(gè)lambda函數(shù)辞州。
def m(x, y):
f = lambda x, y: x + y
return mix(f)(x)(y) # 這里傳入mix函數(shù)的f就是上邊的lambda
# mix函數(shù)是m函數(shù)體內(nèi)的一部分,因此f對(duì)于m函數(shù)來說是一個(gè)局部變量
# f對(duì)于mix函數(shù)是一個(gè)傳入的實(shí)參
# print(f) 在m函數(shù)外部無法訪問其局部變量f
res = m(2, 3)
print(res)
上面程序的運(yùn)行結(jié)果與最初程序的運(yùn)行結(jié)果分別是5和8寥粹,讀者可以根據(jù)注釋仔細(xì)地品变过。其中用到了函數(shù)變量作用域的知識(shí)可以參考這篇文章:2022-08-12 python函數(shù)式編程 - 簡書 (jianshu.com)
題目2
字符串 s 只包括字符 ‘(’ 和 ‘)’,判斷s是否是有效的括號(hào)表示涝涤。有效的括號(hào)要求:每組括號(hào)成對(duì)出現(xiàn)媚狰,左括號(hào)一定可以找到與之匹配的、位置正確的右括號(hào)阔拳。補(bǔ)全下列函數(shù)崭孤。
"""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】如何測(cè)試代碼是否正確:
若代碼文件名為 question2.py,可在命令行中執(zhí)行如下指令,進(jìn)行文檔測(cè)試辨宠。
python3 -m doctest question2.py
題目2解析:本題目可以在leetcode找到類型原題遗锣,具體思路如下:利用一個(gè)棧,不斷地往里壓左括號(hào)嗤形,一旦遇上了一個(gè)右括號(hào)精偿,我們就把棧頂?shù)淖罄ㄌ?hào)彈出來,表示這是一個(gè)合法的組合赋兵,以此類推还最,直到最后判斷棧里還有沒有左括號(hào)剩余。
在python中使用list即可實(shí)現(xiàn)棧數(shù)據(jù)結(jié)構(gòu)毡惜,通過append()方法在棧頂增加一個(gè)元素,通過pop()方法在棧頂刪除一個(gè)元素斯撮,保證“后進(jìn)先出”经伙。以下是問題2的答案代碼:
# 上勘院暑期第二題
def is_parentheses(s: str) -> bool: # 輸入函數(shù)需要是一個(gè)字符串,返回值類型是bool
if not isinstance(s, str): # 判斷輸入的實(shí)參是否為字符串勿锅,不是字符串予以提示
print('請(qǐng)輸入一個(gè)字符串實(shí)參')
return False
for i in s:
if (i != '(') and (i != ')'):
print('輸入的字符串元素只能是"("或者")"')
return False
lst = [i for i in s] #將字符串轉(zhuǎn)換為列表
#print(lst)
stack = [] # 建立一個(gè)空棧帕膜,用來處理字符串
for i in lst:
if i == '(':
stack.append(i) # 如果遇到了左括號(hào),就將其壓入棧中
elif i == ')': # 如果遇到了右括號(hào)
if lst.index(i) == 0: # 如果字符串第一個(gè)元素是右括號(hào)溢十,
return False
else:
if stack == []:
return False # 如果此時(shí)棧中已經(jīng)沒有左括號(hào)垮刹,說明右括號(hào)多了
else:
stack.pop() # 遇到一個(gè)右括號(hào)就彈出一個(gè)與之對(duì)應(yīng)的左括號(hào)
if len(stack) == 0: # 遍歷完字符串所有元素后判讀棧中是否還有剩余的左括號(hào),沒有的話說明左右括號(hào)正好匹配
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
現(xiàn)有一組傳感器在對(duì)某結(jié)構(gòu)變形進(jìn)行監(jiān)測(cè)张弛,傳感器id分別為1~10荒典。每隔一段時(shí)間,各個(gè)傳感器都會(huì)采集一次數(shù)據(jù)吞鸭,得到原始數(shù)據(jù)文件為 raw_data.csv寺董。
原始數(shù)據(jù)中包含三個(gè)字段:
? time: 本次測(cè)量的時(shí)間,timestamp格式
? id: 傳感器的id
? val: 本次測(cè)值
由于各個(gè)傳感器獲得采集信號(hào)的時(shí)間不一致刻剥,同一個(gè)測(cè)量指令下遮咖,各個(gè)傳感器時(shí)間的采集時(shí)間略有不同。你的任務(wù)是確定各傳感器的測(cè)量批次造虏,并輸出結(jié)果文件 result.csv御吞。結(jié)果文件會(huì)在原始數(shù)據(jù)的基礎(chǔ)上新增一列:
? batch: 測(cè)量批次,遞增整數(shù)
題目提供了如下的代碼框架漓藕,已經(jīng)實(shí)現(xiàn)了數(shù)據(jù)文件的讀取和結(jié)果文件的保存陶珠。你只需要完成文件中的 process() 函數(shù)部分。請(qǐng)將完成后的代碼和運(yùn)得到的結(jié)果文件粘貼在下方撵术。
【Tips】
? 由于硬件的不穩(wěn)定背率,部分傳感器的測(cè)值可能在某次測(cè)量時(shí)缺失
? 代碼框架:
"""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], 請(qǐng)將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()