返回顶部
首页 > 资讯 > 后端开发 > Python >ESP32+Python
  • 953
分享到

ESP32+Python

python开发语言 2023-09-29 20:09:24 953人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录 一、 MicroPython 1.1 所用开发板 1.2 Th开发环境、ESP32-python固件、官方文档 1.3 代码 1.3.0 点灯 1.3.1 定时器 1.3.2 PWM 1.3.2 PWM 控制舵机

目录

一、 MicroPython

1.1 所用开发板

1.2 Th开发环境、ESP32-python固件、官方文档

1.3 代码

1.3.0 点灯

1.3.1 定时器

1.3.2 PWM

1.3.2 PWM 控制舵机

1.3.3 TCP\UDP通信

1.3.4 LCD1602

1.3.5 数码管

1.3.6 SSD1306

1.3.7 DS18B20

1.3.8 WS2812b

1.3.9 74HC595数码管

1.3.10 MAX7219数码管

1.3.11 IIC-OLED

1.3.12 GY-30光照传感器

1.3.13 AHT10

1.3.13 DHT11

1.3.14 HCSR04

1.3.15 获取网络时间

1.3.16 获取心知天气

1.3.17 I2S播放WAV

1.4 参考资料

二 、 Pyhon

1.1 语法

1.1.0

1.1.1 语法糖

1.2 例子

1.2.0 Python爬取Bing图片

1.2.1 批量修改文件名


一、 Micropython

1.1 所用开发

1.2 Th开发环境、ESP32-Python固件、官方文档

Thonny, Python IDE for beginners

MicroPython - Python for microcontrollers

Overview — MicroPython latest documentation

micropython: micropython官方库 https://github.com/micropython/micropython.git

GitHub - micropython/micropython-lib: Core Python libraries ported to MicroPython

1.3 代码

1.3.0 点灯
//点灯from Machine import Pin //导入GIPO库Pin2 = Pin(2,Pin.OUT)  //设置pin2口pin2.on()pin2.off()//读取电平设置电平pin2.value()//读pin2.value(1)//设置//Python库的函数粗延时from machine import Pinimport timepin2 = Pin(2,Pin.OUT)while True:    pin2.on()    time.sleep_ms(50)    pin2.off()    time.sleep_ms(50)
1.3.1 定时器
#def 定义#period 时期#PERIODIC 周期模式#callback 回调#lambda  入/闭包就是匿名函数,没有名字的函数,属于函数式编程概念from machine import Pin,Timerled = Pin(2,Pin.OUT)def led_get(Tim):    print(led.value())    led.on()Tim = Timer(0)Tim.init(period = 1000 ,mode = Timer.PERIODIC,callback = led_get)Tim = Timer(1)Tim.init(period = 2000 ,mode = Timer.PERIODIC,callback = lambda t:led.off())
1.3.2 PWM
from machine import Pin,PWMimport time pwm = PWM(Pin(2))pwm.freq(1000)def pwm_set():    while True:        for i in range(0,1024,1):            pwm.duty(i)            time.sleep_ms(1)        for i in range(1023,0,-1):            pwm.duty(i)            time.sleep_ms(1)pwm_set()
1.3.2 PWM 控制舵机
from  machine import Pin,PWMimport timemotor = PWM(Pin(2),freq = 50 ,duty = 0)def motor_test():    while True:        for i in range(0,181,1):            motor.duty(int((i/90+0.5)/20*1023))            time.sleep_ms(1)                    for i in range(180,-1,-1):            motor.duty(int((i/90+0.5)/20*1023))            time.sleep_ms(1)motor_test()     
1.3.3 tcp\UDP通信

TCP

import networK                         //导入库wlan = network.WLAN(network.STA_IF)    //创建waln对象,STA_IF从机模式 ESP32用的是2.4Gwlan.active(True)                      //是否启动WIFIwlan.scan()                            //扫描附近WiFiwlan.isconnected()                     //是否连接过网络wlan.connect('HIKVISION_6CA780','yhnokn..123')     //连接WiFiwlan.config('mac')                     //查看ESP32设备MACwlan.ifconfig()                        //查看路由器给设备分配的IP
from Socket import *        //导入库tcp_socket = socket(AF_INET,SOCK_STREAM)serve_ip = "192.168.0.196"serve_port = 8080tcp_socket.connect((serve_ip,serve_port))    //连接本地的网络调试助手服务器,参数是元组形式send_data = "this is a message"              //发送数据tcp_socket.send(send_data.encode("utf-8"))from_serve_msg = tcp_socket.recv(1024)         //接收数据print(from_serve_msg.decode("utf-8"))

UDP

from socket import *udp_socket = socket(AF_INET,SOCK_DGRAM)dest_addr = ("192.168.0.196",8080)send_data = "this is a message"udp_socket.sendto(send_data.encode('utf-8'),dest_addr)

UDP 联网点亮LED

from machine import Pinfrom socket import  *import networkimport time#网络配置def do_connect():    wlan = network.WLAN(network.STA_IF)#创建WLAN对象    wlan.active(True)#激活WLAN        if not wlan.isconnected():        print('connecting to network...')        wlan.connect('HIKVISION_6CA780','yhnokn..123')        while not wlan.isconnected():            pass    print('network config',wlan.ifconfig())#创建网络连接def create_network_socket():    udp_socket = socket(AF_INET,SOCK_DGRAM)#创建UDP套接字    udp_socket.bind(("192.168.0.188",8080))#绑定端口    return  udp_socket#接收数据函数def udp_RXT_data():    do_connect()    udp_socket = create_network_socket()    led = Pin(2,Pin.OUT)        while True:        #接收的数据 #发送者地址 #接收字节的长度        recv_data,sendr_info = udp_socket.recvfrom(1024)        #解码接收到的数据以便打印出中文        recv_data_srt = recv_data.decode("utf8")        print("数据内容:{}   数据地址:{}".fORMat(recv_data_srt,sendr_info))        if recv_data_srt == "开灯":            led.value(1)        elif recv_data_srt == "关灯":            led.value(0)            def main():    udp_RXT_data()if __name__ == "__main__":    main()

TCP 联网点亮LED

from machine import Pinfrom socket import  *import networkimport time#网络配置def do_connect():    wlan = network.WLAN(network.STA_IF)#创建WLAN对象    wlan.active(True)#激活WLAN        if not wlan.isconnected():        print('connecting to network...')        wlan.connect('HIKVISION_6CA780','yhnokn..123')        while not wlan.isconnected():            pass    print('network config',wlan.ifconfig())#创建网络连接def create_network_socket():    tcp_socket = socket(AF_INET,SOCK_STREAM)#创建套接字    serve_ip = "192.168.0.196"#需要连接服务器地址    serve_port = 8080 #需要连接的端口    tcp_socket.connect((serve_ip,serve_port))    return tcp_socket#接收数据函数def tcp_RXT_data():    do_connect()    tcp_socket = create_network_socket()    led = Pin(2,Pin.OUT)        while True:        #接收的数据        recv_data = (tcp_socket.recv(1024).decode("utf-8"))        print("{}".format(recv_data))                if recv_data == "开灯":            led.value(1)        elif recv_data == "关灯":            led.value(0)            def main():    tcp_RXT_data()if __name__ == "__main__":    main()

『if __name__ == "__main__"』到底啥意思❓

1.3.4 LCD1602

导入所所需要的库: lcd_api.py 和 machine_i2c_lcd.py

下载地址 GitHub - dhylands/python_lcd: Python based library for talking to character based LCDs.

from machine import SoftI2C,Pinfrom machine_i2c_lcd import I2cLcdimport timelcd_addr = 0x27I2C = SoftI2C(scl = Pin(16),sda = Pin(4),freq = 100000)lcd = I2cLcd(I2C,lcd_addr,2,16)def main():    while True:        for i in range(0,10):            lcd.clear()            lcd.putchar("{}".format(i))            time.sleep_ms(1000)    if __name__ == "__main__":    main()
1.3.5 数码管

(列表、字典知识点)

from machine import Pinimport  time gnd = Pin(0,Pin.OUT)a = Pin(12,Pin.OUT)b = Pin(14,Pin.OUT)c = Pin(27,Pin.OUT)d = Pin(26,Pin.OUT)e = Pin(25,Pin.OUT)f = Pin(33,Pin.OUT)g = Pin(32,Pin.OUT)dp = Pin(2,Pin.OUT)       #列表(数组)smg_pin = [a,b,c,d,e,f,g,dp]#字典smg_code = {        0:"11111100",#键:值   (效果一样)"11111100":0        1:"01100000",        2:"11011000",        3:"11110010",        4:"01100110",        5:"11100110",        6:"10111110",        7:"11100000",        8:"11111110",        9:"11110110",        }def smg_disply(num):    gnd.value(0)    if smg_code.get(num): #判断传入值是否在字典中        i = 0;        for count in smg_code.get(num):#在字典中则将键值按位赋值给count            if count == "1": #字符型的比较                smg_pin[i].value(1)            else:                smg_pin[i].value(0)            i+=1;        def main():    smg_disply(0)    time.sleep(1)    while  True:        passif __name__ == "__main__":    main()
1.3.6 SSD1306

SSD1306官方驱动库:SSD1306

SPI方式驱动(用到的OLED为带字库的接线方式有所不同)用到CLK、MOSI、DC、CS1

from machine import  Pin,SoftSPI from ssd1306 import  SSD1306_SPIimport time dc = Pin(2,Pin.OUT)res = Pin(15,Pin.OUT)cs = Pin(4,Pin.OUT)spi = SoftSPI(baudrate=100000, polarity=1, phase=0, sck=Pin(18), mosi=Pin(23), miso=Pin(19)) oled = SSD1306_SPI(128,64,spi,dc,res,cs)def main():    oled.text("littleone",24,28,1)    while  True:        for i in range(100):            oled.fill(0)            oled.text("littleone:%d"%i,24,28,1)            oled.invert(i)            oled.rotate(i)            oled.contrast(i)            oled.show()            time.sleep(1)            if __name__ == "__main__":    main()
1.3.7 DS18B20

(一线通信接口)

from machine import Pinimport onewire,ds18x20,time#创建单总线对象ONEWIRE = onewire.OneWire(Pin(2))#创建ds18b20对象DS18B20 = ds18x20.DS18X20(ONEWIRE)def  dis18b20_read_Temp():    roms =DS18B20.scan() #扫描ds18b20地址    DS18B20.convert_temp() #开始温度转换    time.sleep(1)#12位精度延迟750ms这里延时1s    for rom in roms:#把读取到的器件地址循环写入        temp = DS18B20.read_temp(rom)#读取温度写入器件地址    return temp #将温度值返回        def main():    dis18b20_read_Temp()    while True:        print("temp = %.2f ℃"%dis18b20_read_Temp())if __name__ == "__main__":    main()

python格式化输出

1.3.8 WS2812b

2^24 = 16,777,216‬

ws2812教程

from machine import Pinimport neopixel,timepin = Pin(2,Pin.OUT)#1:引脚  2:灯珠数  3:颜色格式(3为RGB)  4:频率 0=400K 1=800Knp = neopixel.NeoPixel(pin,n=12,bpp=3,timing=3)def main():    while True:           for i in range (0,12,1):            np[i] = (24,89,i*8)            np.write()            time.sleep_ms(50)            np.fill((0,0,0))            np.write()            if __name__ == "__main__":    main()
1.3.9 74HC595数码管
from machine import Pinimport timeds = Pin(15,Pin.OUT) #DIO数据RCLK = Pin(0,Pin.OUT) #存储寄存器时钟SCLK = Pin(2,Pin.OUT) #移位寄存器时钟def ch595_write_Byte(duan,wei):#段选,位选    for i in range(8):        if duan & 0x80: #0x80=1000 0000            ds.value(1)        else:            ds.value(0)        SCLK.value(0)        SCLK.value(1)        duan <<= 1            for i in range(8):        if wei & 0x80: #0x80=1000 0000            ds.value(1)        else:            ds.value(0)        SCLK.value(0)        SCLK.value(1)        wei <<= 1        RCLK.value(0)    RCLK.value(1)    def ch595_dispy_numberr(num,show_point):    #0-9 共阴 我所用的是共阳所以把每一个数字按位取反 ~0x00为清屏不显示    number = [~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x00]     point = [0x1,0x1<<1,0x1<<2,0x1<<3,0x1<<4,0x1<<5,0x1<<6,0x1<<7]    ch595_write_Byte(number[num],point[show_point])    def main():    while True:        for i in range (8):            ch595_dispy_numberr(i,i)            time.sleep_ms(100)            ch595_dispy_numberr(10,i)        if __name__ == "__main__":    main()
1.3.10 MAX7219数码管
from machine import Pin,SPIimport timeclk = Pin(14,Pin.OUT)cs = Pin(12,Pin.OUT)dio = Pin(13,Pin.OUT)#自己写"""def MAX7219_Write(addr,data):        cs.value(0)    for i in range (8):        clk.value(0)        dio.value(1 if((addr<字符串用chr()把数值转换成一个字符    spi.write(chr(data)) #写的是字符串用chr()把数值转换成一个字符    cs.value(1)def MAX7219_Init():    MAX7219_Write(0x0c,0x01)    MAX7219_Write(0x0f,0x00)    MAX7219_Write(0x09,0xff)    MAX7219_Write(0x0b,0x03) #要显示的数码管个数 0x03(对应4个)    MAX7219_Write(0x0a,0x01) #亮度设置0-15    def MAX7219_Write_Number(num):        MAX7219_Write(4,num//1000)    MAX7219_Write(3,num%1000//100)    MAX7219_Write(2,num%100//10)    MAX7219_Write(1,num%10)                def main():    MAX7219_Init()    while  True:        for i in range(1000):            MAX7219_Write_Number(i)            time.sleep_ms(50)        pass    if __name__ == "__main__":    main()

点阵管

max7219.py

from machine import Pin,SPIimport Max7219,timecs = Pin(12,Pin.OUT)spi = SPI(1,1000000,sck=Pin(14),mosi=Pin(13),miso=Pin(19))MAX = Max7219.Matrix8x8(spi,cs,1)MAX.init()def main():    MAX.brightness(7)    MAX.fill(0)    while True:        for i in range(9):            MAX.rect(8-i,8-i,i,i,1)            MAX.show()            time.sleep_ms(50)            MAX.fill(0)            if __name__ == "__main__":    main()
1.3.11 IIC-OLED

Soft/Hard-IIC

from machine import SoftI2C,Pin,I2Cfrom ssd1306 import SSD1306_I2Cimport timeclass chinese:    chinese = [            # 晓(0) 小(1) 謏(2)            0x00,0xFC,0x84,0x84,0xFC,0x00,0x88,0x88,0x4F,0x58,0x24,0x54,0x84,0xE4,0x00,0x00,            0x00,0x3F,0x10,0x10,0x3F,0x80,0x42,0x32,0x0E,0x02,0x02,0x3E,0x42,0x42,0x72,0x00,            0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x20,0x40,0x80,0x00,0x00,            0x08,0x04,0x03,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x00,0x01,0x0E,0x00,            0x08,0xA8,0xA9,0xAE,0xA8,0xA8,0x00,0xFE,0x91,0x80,0xFF,0x80,0x92,0xFE,0x00,0x00,            0x00,0x7E,0x22,0x22,0x22,0x7E,0x80,0x82,0x46,0x2A,0x13,0x2A,0x46,0x82,0x80,0x00,            ]i2c = SoftI2C(scl = Pin(0),sda = Pin(2),freq = 100000)#软件IICI2C = I2C(0,scl = Pin(22),sda =Pin(21),freq = 400000)#硬件IICaddr = 0x3coled = SSD1306_I2C(128,64,I2C,addr)#显示中文def ByteOpera(num,dat):    byte = [0x01,0x02,0x04,0x8,0x10,0x20,0x40,0x80]    if dat&byte[num]:        return 1    else:        return 0def LcdShowCh_16x16(n,x_axis,y_axis):    for i in range(2):        for a in range(16):            for b in range(8):                if(ByteOpera(b,chinese.chinese[n*32+i*16+a])):                    oled.pixel(x_axis+a,y_axis+i*8+b,1)                else:                    oled.pixel(x_axis+a,y_axis+i*8+b,0)def main():    oled.fill(0)    for i in range (100):        oled.text("littleone:%d"%i,24,28,1)        LcdShowCh_16x16(0,16,0)        LcdShowCh_16x16(1,2*16,0)        LcdShowCh_16x16(2,3*16,0)    #         oled.text("little one",24,28)    #         oled.text("{}".format(i),110,28)        oled.show()        time.sleep_ms(50);        oled.fill(0)    while True:        passif __name__ == "__main__":    main()
1.3.12 GY-30光照传感器
from machine import Pin,I2Cfrom ssd1306 import SSD1306_I2Cimport timei2c = I2C(0,scl = Pin(22),sda = Pin(21),freq =4_00_000)gy20_addr = int(i2c.scan()[0])oled_addr = int(i2c.scan()[1])oled = SSD1306_I2C(128,64,i2c,oled_addr)# print(hex(i2c.scan()[0]),hex(i2c.scan()[1]))def Gy_30_Init():    i2c.writeto(gy20_addr,b'\x01')#通电运行    i2c.writeto(gy20_addr,b'\x07')#复位    i2c.writeto(gy20_addr,b'\x10')#高分辨率连续读取 1lx(1流明分辨率) 120ms(测量间隔)  def Gy_30_Show():    gy = i2c.readfrom(gy20_addr,2)#读两个字节16位对应GY30的分辨率    gy30 = float(gy[0] << 8 | gy[1])/1.2#对读回的两个列表项进行合并    time.sleep_ms(200)    return gy30def main():    Gy_30_Init()    oled.contrast(255)    while True:        oled.fill(0)        oled.text("gy-30 = %.2fLx"%Gy_30_Show(),0,28)        oled.show()        print("%.2fLx"%Gy_30_Show())if __name__ == "__main__":    main()
1.3.13 AHT10

库下载链接

import timefrom machine import Pin, I2Cimport ahtx0I2C = I2C(0,scl = Pin(22),sda =Pin(21),freq = 400000)#硬件IICaddr = int(I2C.scan()[0])sensor = ahtx0.AHT10(I2C,addr)# Create the sensor object using I2C# sensor = ahtx0.AHT10(I2C)while True:    print("\nTemperature: %0.2f C" % sensor.temperature)    print("Humidity: %0.2f %%" % sensor.relative_humidity)    time.sleep_ms(500)
1.3.13 DHT11
from machine import Pinimport dhtimport timedef DHT11():    dht11 = dht.DHT11(Pin(4))    dht11.measure()    print("temp:%.1f"% dht11.temperature())    print("hum:%.1f"% dht11.humidity())    print("\n")    def main():    while True:        DHT11()        time.sleep_ms(10)if __name__ == "__main__":    main()
1.3.14 HCSR04
1.3.15 获取网络时间

编写ntpTime库

from machine import Pin,I2C,RTCfrom ssd1306 import SSD1306_I2Cimport ntptime,time,networkI2C = I2C(0,scl = Pin(22),sda =Pin(21),freq = 400000)#硬件IICaddr = 0x3coled = SSD1306_I2C(128,64,I2C,addr)           def do_connect():    wlan = network.WLAN(network.STA_IF)    wlan.active(True)    if not wlan.isconnected():        oled.text("connect net...",0,0,1)        oled.show()        wlan.connect('HIKVISION_6CA780','yhnokn..123')        while not wlan.isconnected():            pass    oled.fill(0)    oled.text("connect succeed",0,0,1)    oled.text("ip:%s"%wlan.ifconfig()[0],0,16,1)    oled.text("MSK:%s"%wlan.ifconfig()[1],0,32,1)    oled.text("GW:%s"%wlan.ifconfig()[2],0,48,1)    oled.text("DNS:%s"%wlan.ifconfig()[3],0,64,1)    oled.show()    print('network config:', wlan.ifconfig())    def syne_ntp():    week = ['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']    rtc = RTC()    ntptime.NTP_DELTA = 3155644800    ntptime.host = "ntp.aliyun.com"    #ntptime.host = "pool.ntp.org"    #time.sleep(1)    oled.fill(0)    try:  #异常处理模块        rtc.datetime() #获取本地时间        ntptime.settime() #同步本地时间        oled.text("succeed",0,0,1)    except : #出现异常处理       oled.text("erro   ",0,0,1)    times =  rtc.datetime()    oled.text("%d-%.2d-%.2d"%(times[0],times[1],times[2]),0,16,1)    oled.text("%.2d-%.2d-%.2d"%(times[4],times[5],times[6]),0,32,1)    oled.text("%s"%(week[times[3]]),0,48,1)    oled.show()    #time.sleep(1)    def main():    do_connect()    while True:        syne_ntp()        if __name__ == "__main__":    main()

main中调用

from ntpTime import  do_connect,syne_ntpimport timedef main():    do_connect()    time.sleep(1)    while True:        syne_ntp()        if __name__ == "__main__":    main()

1.3.16 获取心知天气

①:注册心知天气获取秘钥

②:导入urequests库 库地址

③:心知的接口免费用户每分钟限制获取20次信息超过就或获取失败所以要加合适的延迟时间

import ntptime,time,network,urequestsimport uJSONdef get_weather():    get = urequests.get("https://api.seniverse.com/v3/weather/now.json?key=S0uI5uodKzB8Ytdqk&location=fujianfuzhou&language=zh-Hans&unit=c")    decode = ujson.loads(get.text)    Cit_Name = decode["results"][0]["location"]["name"]    Cit_weather = decode["results"][0]["now"]["text"]    Cit_Temp = decode["results"][0]["now"]["temperature"]    #最近一次更新的时间    Cit_time = decode["results"][0]["last_update"]    print(Cit_Name,Cit_weather,Cit_Temp,Cit_time)def main():    while True:        get_weather()        time.sleep(20)        if __name__ == "__main__":    main()

decode = ujson.loads(get.text) 的解释

Cit_Name = decode["results"][0]["location"]["name"] 的理解
decode = ujson.loads(get.text) 是将原本的Response类转换成dict字典

数据原本是这样的
{"results":[{"location":{"id":"WSSU6EXX52RE","name":"福州","country":"CN","path":"福州,福州,福建,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"多云","code":"4","temperature":"27"},"last_update":"2023-05-31T21:52:49+08:00"}]}

转化完了就是一个字典嵌套一个列表(这个列表只有一个元素(对应[0])这个元素是一个嵌套了字典的字典)列表里面有嵌套字典的结构
["results"][0]["location"]["name"] 就是说获取字典中"results"对应的列表中的第一个元素中字典"location"中的字典"name"对应的内容
1.3.17 I2S播放WAV

使用Micropython开发ESP32开发板之通过MAX98357 I2S音频模块播放音乐_魔都飘雪的博客-CSDN博客

本地文件的读写操作只能打开下载到板子中的文件。

1.4 参考资料

Python 教程

MicroPython Esp32物联网微控制器开发

(66条消息) 1.2 ESP32-MicroPython基础操作_micropython查看内存大小_向往生的博客-CSDN博客

快速上手ESP32 — 使用MicroPython编程

让程序在ESP32上电时自动运行

二 、 Pyhon

1.1 语法

1.1.0

【Python】input()函数用法小结_python input_Darknight: :的博客-CSDN博客

Python中a和a[:]有什么区别?

剑指offer--二进制中1的个数

Python 二进制中1的个数 &0xffffffff是什么意思

C语言,\t的用法-CSDN博客

Python format 格式化函数

在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的:
eg:
a=[1,2,3] a="Runoob"
以上代码中, [1,2,3] 是 List 类型, "Runoob" 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。

可更改(mutable)与不可更改(immutable)对象
在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。
不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。
可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
python 函数的参数传递:
不可变类型:类似 c++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。
可变类型:类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响
python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象

匿名函数
Python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。
lambda 只是一个表达式,函数体比 def 简单很多。
lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
虽然 lambda 函数看起来只能写一行,却不等同于 C 或 C++ 的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
1.1.1 语法糖

语法糖是编程中的某些特殊写法

①:交换量变量的值
a=1; b=2; a,b = b,a(实现交换)

②:判断变量是否落在某个范围内
if 90<=a<=100 print("优秀") 判断啊是否在90-100的范围内

③:快速构造字符串
print('-'*20) 打印出20个-

④:列表拼接
a = [1,2,3] b = [4,5,6] c= a+b

⑤:列表切片
a = [1,2,3,4,5,6,7,8,9] b = a[3:-2] = [4,5,6,7]

⑥:打包与解包
a = (1,2,3) x,y,z = a python会把a解包然后按左边变量的顺序分别赋值给x,y,z
b = (x,y,z) 把xyz的值打包给b

⑦:with语句
正常读取文件分三步
打开文件 f = open('test.txt','r') 读取文件 data = f.read( ) 关闭文件 f.colse() 最后一步关闭文件相当于‘擦屁股’的操作如果不小心忘了或者忽略可能会导致很多麻烦,pyhton用with语句很好的解决了这个问题

用with 没有用关闭文件的语句,但是他能够自动的关闭打开的文件对象自动处理异常
with oprn('test.txt','r') as f:
data = f.read()

⑧:列表推导式
eg:给列表中的元素每个加233
普通的做法:a = [1,2,3] b[] for e in a: b.append(e+233)
推导式: a = [1,2,3] b = [e+233 for e in a]

⑨:数字分割符
a = 10_0000_0000

1.2 例子

1.2.0 Python爬取Bing图片

引例:(6条消息) Python3爬取Bing每日图片,并设置为电脑桌面_python爬取bing每日一图保存_非常的硬朗的博客-CSDN博客

(6条消息) Python实用案例,Python脚本,Python实现每日更换“必应图片”为“桌面壁纸”_千寻编程的博客-CSDN博客

安装各种库的方法:(6条消息) python中import requests报错:No module named ‘requests’_Nancy-sn的博客-CSDN博客

(6条消息) Python3安装Pillow与PIL的方法_pillow资源-CSDN文库

(6条消息) 关于文件路径中/ \ // \\的使用以及绝对相对路径的问题_路径\\_csdndg的博客-CSDN博客

1.2.1 批量修改文件名

用到的是 os 模块中的 listdir 方法和 rename 方法

import ospath = "c:\\Users\\Heone\\Desktop\\python\\TEST\\"fileList = os.listdir(path)n = 0 for i in fileList:    old = path+ os.sep + fileList[n]  # os.sep添加系统分隔符    new = path+ os.sep + 'B' + str(n+1) +'.txt'    os.rename(old,new)    n +=1

来源地址:https://blog.csdn.net/qq_45803449/article/details/129763368

--结束END--

本文标题: ESP32+Python

本文链接: https://lsjlt.com/news/421623.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作