Python技术迷

前鹅厂员工:前leader真不当人啊,之前和他有些不愉快,拿低绩效走人,为了背调送了一瓶茅台和三千多的冬虫草礼盒,结果。。

刚刷到个贴子,说有个前鹅厂员工,为了背调,硬着头皮请前领导吃饭,还送了茅台和冬虫草。结果人家收了礼,转头背调却把他踩得一文不值,害得他丢了百万年薪的offer。

Image

网友有人骂领导不地道,也有人劝“这种人本来就靠不住”。我更认同后者——你把希望寄托在别人嘴上,本身就挺危险的。职场里,感情归感情,利益归利益,你以为是人情往来,人家当场子戏。

换个角度想,背调是公司制度,不是靠送礼能解决的事。与其讨好别人,不如提前维护好自己的口碑,把硬实力和合作记录留在档案里。说到底,真正能护住你饭碗的,还是自己的专业和口碑。【备注:文末可领最新资料】

面试题: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 全部免费领