第一周算法设计与分析:A : log2(N)

简介: 这篇文章介绍了解决算法问题"输入一个数N,输出log2N(向下取整)"的三种编程思路,包括使用对数函数和幂函数的转换方法,以及避免浮点数精度问题的整数逼近方法。

(程序员必备技能)基于Python的鼠标与键盘控制实战与源码

文章目录

  • (程序员必备技能)基于Python的鼠标与键盘控制实战与源码
    • 一、序言
    • 二、配置环境
      • 1.下载pyautogui包
    • 三、鼠标控制
      • 1、获取鼠标位置函数以及测试源码
      • 2、控制鼠标左击/右击/双击函数以及测试源码
      • 3、控制鼠标移动/拖动
      • 3、控制鼠标滚轮滚动
    • 四、键盘控制
      • 1、控制输出单个键
      • 2、控制键盘输出快捷键(同时输出多个键)
      • 3、控制键盘长按某个键
      • 4、控制键盘输出一段话
      • 5、停顿一段时间
    • 五、结语
      • 1、电脑的眼睛
        • a.调用电脑相机
        • b.调用手机相机
        • c.获取当前电脑屏幕
      • 2、电脑的大脑
        • a.图像匹配
        • b.视觉Al

一、序言

使用python控制按键无疑非常重要的技能,特别是结合机器视觉更是能发挥出超强的实力!

二、配置环境

1.下载pyautogui包

pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:如果有可能,可以在pycharm中进行以下Python控制的鼠标和键盘的测试与学习。
Pycharm与Anaconda3的下载与配置博客可以参考如下博客:Anaconda3和pycharm的下载指南

三、鼠标控制

注:由于这部分功能我不能通过截屏来显著表现出来,在程序运行结果就不截屏了,保持界面整洁

1、获取鼠标位置函数以及测试源码

#获取鼠标位置
import pyautogui as pg           #没别的作用就单纯换个名字
try:
    while True:
        x,y=pg.position()        #核心函数pg.position()
        print(str(x)+" "+str(y)) #输出鼠标的x,y

except KeyboardInterrupt:
    print("\n")

程序功能:

  • 实时输出当前鼠标位置

核心函数:

函数名 功能
pyautogui .position() 返回当前鼠标的x,y坐标。

核心代码:

  1. 换名:第2行 import pyautogui as pg
  2. 输出鼠标位置:第5~6行
    x,y=pg.position() #核心函数pg.position()
    print(str(x)+" "+str(y)) #输出鼠标的x,y

2、控制鼠标左击/右击/双击函数以及测试源码

# 获取鼠标位置
import pyautogui as pg

try:
    while True:
        x, y = pg.position()
        print(str(x) + " " + str(y))  #输出鼠标位置

        if 1746 < x < 1800 and 2 < y < 33:
            pg.click()#左键单击
        if 1200 < x < 1270 and 600 < y < 620:
            pg.click(button='right')#右键单击
        if 1646 < x < 1700 and 2 < y < 33:
            pg.doubleClick()#左键双击

except KeyboardInterrupt:
    print("\n")

a.程序功能
在输出鼠标位置的基础,分别设置了三个区域,当鼠标达到这三个区域时候,进行左键单击、右键单击,左键双击。

b.核心函数

函数名 功能
pyautogui.click() 鼠标左键单击
pyautogui.click(button=‘right’) 鼠标右键单击
pyautogui.doubleClick() 鼠标左键双击

c.核心代码
1、触发某事件就控制鼠标点击:第9~14行
注:click()函数默认:button=‘left’

3、控制鼠标移动/拖动

# 3、控制鼠标移动/拖动demo
import pyautogui as pg

try:
    while True:
        x, y = pg.position()
        print(str(x) + " " + str(y))  #输出鼠标位置
        #实现鼠标绝对移动功能
        if 1011 < x < 1357 and 320 < y < 527:
            pg.moveTo(1750, 20, 2)#花2s从当前位置移动到(1750,20)
            pg.click()  # 左键单击

        #实现鼠标相对移动功能
        if 600 < x < 1000 and 305 < y < 425:
            pg.move(0, 200)  # 基于当前位置瞬间向下移动200像素

        #实现鼠标拖动功能
        if 1142<x<1391 and y<25:
            pg.dragTo(300, 400, 2, button='left') #花2s从当前位置拖到(300,400)

except KeyboardInterrupt:
    print("\n")

a.程序功能
在输出鼠标位置的基础,分别设置了三个区域,当鼠标达到这三个区域时候,分别进行绝对移动,相对移动,鼠标拖动三个运行演示。
注:在运行代码全,将Pycharm全屏演示效果更好哦

b.核心函数

函数名 功能
pyautogui.moveTo() 鼠标绝对移动
pyautogui.move() 鼠标相对移动
pyautogui.dragTo() 鼠标绝对拖动

c.核心代码
1、触发某事件就控制鼠标移动/拖动:第9~19行
注:click()函数默认:button=‘left’

3、控制鼠标滚轮滚动

import pyautogui as pg
# 执行鼠标滚轮的滚动。垂直滚动还是水平滚动取决于底层操作系统。
pg.scroll(100)  # scroll up 50 "clicks"

注:是的就两行,如果你是放在上面中使用,应该算只要一行就可以实现了。

四、键盘控制

1、控制输出单个键

import pyautogui as pg
pg.press('q')

核心函数:

函数名 功能
pyautogui.press() 摁键
注:pyautogui.press(‘enter’)代表按下回车
注:pg.press(‘left’)#左移 其中,left,down,up,right是代表键盘移动键

2、控制键盘输出快捷键(同时输出多个键)

功能:复制当前界面内容并粘贴

import pyautogui as pg

pg.hotkey('ctrl','a')
pg.hotkey('ctrl','c')
pg.click()
pg.hotkey('ctrl','v')

核心函数:

函数名 功能
pyautogui.hotkey() 支持同时摁多个键

3、控制键盘长按某个键

功能:复制当前界面内容并粘贴

import pyautogui as pg

pg.keyDown('ctrl')#摁定ctrl
pg.press('a')
pg.press('c')
pg.click()
pg.press('v')
pg.keyUp('ctrl')
#程序描述:相当于先摁住ctrl,然后分别摁‘a’,'c','v',然后再松开‘ctrl’

核心函数:

函数名 功能
pyautogui.keyDown() 长按不动
pyautogui.keyUp() 释放按键

4、控制键盘输出一段话

import pyautogui as pg
#pg.write()参数从左到右分别是内容,输入每个字符停顿时间
pg.write('hello world !', interval=0.3)

注:pg.write不支持中文,如果出现中文就会空格替代

注:不过可以用拼音,粗糙表示如:

import pyautogui as pg
pg.write('nihao1 shijie1!', interval=0.3)#你好世界

注:运行前记得打开拼音。
核心函数:

函数名 功能
pyautogui.write() 输出一段字符串

5、停顿一段时间

功能:复制当前界面内容并粘贴

import pyautogui as pg
pg.hotkey('ctrl','a')
pg.PAUSE=0.5#停顿0.5s
pg.hotkey('ctrl','c')
pg.PAUSE=0.5
pg.moveTo(1500,300)#绝对移动到1500,300
pg.click()#点击一下,确定窗口
pg.PAUSE=0.5
pg.hotkey('ctrl','v')

核心函数:

函数名 功能
pg.PAUSE 停顿: 单位s

五、结语

通过以上学习,利用pyautogui,你已经学会了如何用python模拟人类的绝大部分键盘/鼠标行为。
到了这里或许,你会疑惑我该怎么确定,电脑应该在哪里控制鼠标做出什么操作,哪里控制键盘,应该输入什么。人是怎么做到这些的?视觉与大脑!
简单来说,就是图像输入与图像处理部分,加上这一部分学会的一双‘手’,电脑才可以大放异彩。

1、电脑的眼睛

在这里不得不提到opencv,它实现了图像处理和计算机视觉方面的很多通用算法。
如果有兴趣可以在这里学习:OpenCV4 C++ 快速入门视频30讲 - 系列合集

a.调用电脑相机
import cv2
cap=cv2.VideoCapture(0) #打开默认相机0,如果有外接摄像头,修改这个为1
if cap!=None:
    while True:
        ref,img=cap.read()        
        cv2.imshow('video',img)
        if cv2.waitKey(1)==27:
            break
b.调用手机相机

可以看下面这个博客
使用手机摄像头做网络ip摄像头用opencv中打开

c.获取当前电脑屏幕

可以看下面这个博客
(必备技能)使用Python实现屏幕截图

2、电脑的大脑

a.图像匹配

有兴趣的检索一下:aircv

b.视觉Al

有兴趣的检索一下:yolo
下面这个博客可以参考一下
yolov5无从下手?一篇就够,2021年全部基于最新配置的yolo入门升级路线

结束。

相关文章
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
57 4
|
8天前
|
存储 SQL 监控
|
8天前
|
运维 监控 安全
|
11天前
|
监控 关系型数据库 MySQL
分析慢查询日志
【10月更文挑战第29天】分析慢查询日志
28 3
|
11天前
|
监控 关系型数据库 数据库
怎样分析慢查询日志?
【10月更文挑战第29天】怎样分析慢查询日志?
29 2
|
19天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1619 14
|
1月前
|
存储 消息中间件 大数据
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
大数据-69 Kafka 高级特性 物理存储 实机查看分析 日志存储一篇详解
32 4
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
43 2
|
26天前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。