前鹅厂员工:前leader真不当人啊,之前和他有些不愉快,拿低绩效走人,为了背调送了一瓶茅台和三千多的冬虫草礼盒,结果。。
刚刷到个贴子,说有个前鹅厂员工,为了背调,硬着头皮请前领导吃饭,还送了茅台和冬虫草。结果人家收了礼,转头背调却把他踩得一文不值,害得他丢了百万年薪的offer。
网友有人骂领导不地道,也有人劝“这种人本来就靠不住”。我更认同后者——你把希望寄托在别人嘴上,本身就挺危险的。职场里,感情归感情,利益归利益,你以为是人情往来,人家当场子戏。
换个角度想,背调是公司制度,不是靠送礼能解决的事。与其讨好别人,不如提前维护好自己的口碑,把硬实力和合作记录留在档案里。说到底,真正能护住你饭碗的,还是自己的专业和口碑。【备注:文末可领最新资料】
面试题:Alt 和 Tab 模拟
昨天晚上十一点多,我在公司楼下喝完奶茶准备收工,小李又在群里问:哥,能不能用 Python 模拟一下 Alt+Tab,那种按住 Alt 连点 Tab 轮着切窗口、松开再生效的效果?行吧,趁脑子还清醒,说一遍。
我们先定个最小可用的一套规则,够用就行:
有一串窗口的“最近使用”列表(MRU),第 0 位是当前激活窗口。 ALT_DOWN进入选择态(只移动光标不立刻切换);ALT_UP退出并提交选择结果,把选中的窗口挪到 MRU 头部。TAB只有在按着 Alt 时才有效,每按一次,选择指针往后循环一格。OPEN x:如果 x 不在列表,插到头部;在的话等价于被激活——移到头部。CLICK x:模拟鼠标点窗口,直接把 x 移到头部(不存在就当 OPEN)。CLOSE x:关掉并从列表里删掉;若正处在 Alt 选择态,要把选择指针相应左移并取模。TAB在没有按 Alt 的时候忽略(图省事)。初始 MRU 可以给一个列表,比如 ["WeChat","IDE","Chrome"]。
整件事就是两个状态:MRU 列表 + 是否在 Alt 选择态及当前选择下标。TAB 改下标,ALT_UP 把下标对应的窗口挪到头。其余操作直接改 MRU。
from collections import deque
classAltTabSimulator:
def__init__(self, initial=None):
self.mru = deque(initial or []) # 0 位是当前激活
self.alt_on = False
self.sel = 0# Alt 选择指针(基于当前 mru)
self.index = {app: i for i, app in enumerate(self.mru)} # 仅作加速用
def_rebuild_index(self):
self.index = {app: i for i, app in enumerate(self.mru)}
def_move_to_front(self, app):
# 如果存在,删旧放头;否则直接放头
if app in self.index:
i = self.index[app]
# 把第 i 个旋到左侧为头,再 popleft,再 appendleft,实现 O(k)但足够快
self.mru.rotate(-i)
self.mru.popleft()
self.mru.appendleft(app)
self.mru.rotate(i) # 复位剩余顺序
else:
self.mru.appendleft(app)
self._rebuild_index()
self.sel = 0# 激活后,选择指针回到头
def_remove(self, app):
if app notin self.index:
return
i = self.index[app]
# 调整选择指针(仅在 alt 模式下才需要)
if self.alt_on:
if len(self.mru) > 1:
if i < self.sel or (i == self.sel and self.sel == len(self.mru)-1):
self.sel = (self.sel - 1) % (len(self.mru)-1)
else:
self.sel = 0
# 真实删除
self.mru.rotate(-i)
self.mru.popleft()
self._rebuild_index()
if self.alt_on and self.mru:
self.sel %= len(self.mru)
defhandle(self, event):
# event 形如 ("ALT_DOWN",) 或 ("OPEN","IDE")
t = event[0]
if t == "ALT_DOWN":
ifnot self.mru: return
self.alt_on = True
self.sel = 0
elif t == "TAB":
if self.alt_on and self.mru:
self.sel = (self.sel + 1) % len(self.mru)
elif t == "ALT_UP":
if self.alt_on and self.mru:
chosen = list(self.mru)[self.sel]
self._move_to_front(chosen)
self.alt_on = False
elif t == "OPEN"or t == "CLICK":
app = event[1]
self._move_to_front(app)
elif t == "CLOSE":
app = event[1]
self._remove(app)
defstate(self):
# 返回当前激活窗口与 MRU 列表(提交后的真实状态)
active = self.mru[0] if self.mru elseNone
return active, list(self.mru)
defpreview(self):
# 在 Alt 选择态下,看看当前“高亮”的是谁,不改变实际激活
ifnot (self.alt_on and self.mru):
returnNone
return list(self.mru)[self.sel]
defsimulate(initial, events):
sim = AltTabSimulator(initial)
snapshots = []
for e in events:
sim.handle(e)
snapshots.append((sim.preview(),) + sim.state())
return snapshots
初始 ["WeChat","IDE","Chrome"],事件:
ALT_DOWN, TAB, TAB, ALT_UP, OPEN "Docs", ALT_DOWN, TAB, ALT_UP, CLOSE "IDE"
大致轨迹:按两次 Tab 选到 Chrome,松开后 Chrome 到头;打开 Docs 又到头;再 Alt+Tab 一次选 WeChat;关 IDE…最后 MRU ≈ ["WeChat","Docs","Chrome"],激活的是 WeChat。
每次操作都是 O(n) 内的小旋转/重建索引,窗口数量通常很小,足够用了。要极致优化可以用双向链表+哈希表做成严格 O(1),但没必要。行了不啰嗦,我去热个包子先。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领