Python 物联网入门指南(二)(1)

简介: Python 物联网入门指南(二)

第三章:使用 Python 进行自动化和提高生产力

在本章中,我们将涵盖以下主题:

  • 使用 Tkinter 创建图形用户界面
  • 创建一个图形启动菜单应用程序
  • 在应用程序中显示照片信息
  • 自动整理您的照片

介绍

到目前为止,我们只专注于命令行应用程序;然而,树莓派不仅仅是命令行。通过使用图形用户界面GUI),通常更容易从用户那里获取输入并以更简单的方式提供反馈。毕竟,我们一直在不断处理多个输入和输出,所以为什么在不必要的情况下限制自己只使用命令行的程序格式呢?

幸运的是,Python 可以支持这一点。与其他编程语言(如 Visual Basic 和 C/C++/C#)类似,这可以通过使用提供标准控件的预构建对象来实现。我们将使用一个名为Tkinter的模块,它提供了一系列良好的控件(也称为小部件)和工具,用于创建图形应用程序。

首先,我们将以encryptdecrypt.py为例,演示可以编写和在各种方式中重复使用的有用模块。这是良好编码实践的一个例子。我们应该致力于编写可以进行彻底测试,然后在许多地方重复使用的代码。

接下来,我们将通过创建一个小型图形启动菜单应用程序来扩展我们之前的示例,以运行我们喜爱的应用程序。

然后,我们将探索在我们的应用程序中使用来显示,然后

整理照片。

使用 Tkinter 创建图形用户界面

我们将创建一个基本的 GUI,允许用户输入信息,然后程序可以用来加密和解密它。

准备工作

您必须确保该文件放置在相同的目录中。

由于我们使用了 Tkinter(Python 的许多可用附加组件之一),我们需要确保它已安装。它应该默认安装在标准的 Raspbian 镜像上。我们可以通过从 Python 提示符导入它来确认它已安装,如下所示:

Python3

>>> import tkinter

如果未安装,将引发ImportError异常,在这种情况下,您可以使用以下命令进行安装(使用Ctrl + Z退出 Python 提示符):

sudo apt-get install python3-tk

如果模块加载了,您可以使用以下命令来阅读有关模块的更多信息(完成阅读后使用Q退出):

>>>help(tkinter)

您还可以使用以下命令获取有关模块内所有类、函数和方法的信息:

>>>help(tkinter.Button)

以下dir命令将列出在module范围内的任何有效命令或变量:

>>>dir(tkinter.Button)

您将看到我们自己的模块将包含由三个引号标记的函数的信息;如果我们使用help命令,这将显示出来。

命令行将无法显示本章中创建的图形显示,因此您将需要启动树莓派桌面(使用startx命令),或者如果您是远程使用它。

确保您已启用X11 转发并且运行着X 服务器(参见第一章,使用树莓派 3 计算机入门)。

如何做…

我们将使用tkinter模块为encryptdecrypt.py脚本生成 GUI。

为了生成 GUI,我们将创建以下tkencryptdecrypt.py脚本:

#!/usr/bin/python3 
#tkencryptdecrypt.py 
import encryptdecrypt as ENC 
import tkinter as TK 
def encryptButton(): 
    encryptvalue.set(ENC.encryptText(encryptvalue.get(), 
                                     keyvalue.get())) 
def decryptButton(): 
    encryptvalue.set(ENC.encryptText(encryptvalue.get(), 
                                     -keyvalue.get())) 
#Define Tkinter application 
root=TK.Tk() 
root.title("Encrypt/Decrypt GUI") 
#Set control & test value 
encryptvalue = TK.StringVar() 
encryptvalue.set("My Message")  
keyvalue = TK.IntVar() 
keyvalue.set(20) 
prompt="Enter message to encrypt:" 
key="Key:" 
label1=TK.Label(root,text=prompt,width=len(prompt),bg='green') 
textEnter=TK.Entry(root,textvariable=encryptvalue, 
                   width=len(prompt)) 
encryptButton=TK.Button(root,text="Encrypt",command=encryptButton) 
decryptButton=TK.Button(root,text="Decrypt",command=decryptButton) 
label2=TK.Label(root,text=key,width=len(key)) 
keyEnter=TK.Entry(root,textvariable=keyvalue,width=8) 
#Set layout 
label1.grid(row=0,columnspan=2,sticky=TK.E+TK.W) 
textEnter.grid(row=1,columnspan=2,sticky=TK.E+TK.W) 
encryptButton.grid(row=2,column=0,sticky=TK.E) 
decryptButton.grid(row=2,column=1,sticky=TK.W) 
label2.grid(row=3,column=0,sticky=TK.E) 
keyEnter.grid(row=3,column=1,sticky=TK.W) 
TK.mainloop() 
#End 

使用以下命令运行脚本:

python3 tkencryptdecrypt

它是如何工作的…

我们首先导入两个模块;第一个是我们自己的encryptdecrypt模块,第二个是tkinter模块。为了更容易看到哪些项目来自哪里,我们使用ENC/TK。如果您想避免额外的引用,您可以使用from  import *直接引用模块项目。

当我们点击加密和解密按钮时,将调用encryptButton()decryptButton()函数;它们将在以下部分中解释。

使用Tk()命令创建主 Tkinter 窗口,该命令返回所有小部件/控件可以放置的主窗口。

我们将定义六个控件如下:

  • Label:这显示了加密消息的提示输入信息:
  • Entry:这提供了一个文本框来接收用户要加密的消息
  • Button:这是一个加密按钮,用于触发要加密的消息
  • Button:这是一个解密按钮,用于反转加密
  • Label:这显示了密钥:字段以提示用户输入加密密钥值
  • Entry:这提供了第二个文本框来接收加密密钥的值

这些控件将产生一个类似于以下截图所示的 GUI:

加密/解密消息的 GUI

让我们来看一下第一个label1的定义:

label1=TK.Label(root,text=prompt,width=len(prompt),bg='green') 

所有控件必须链接到应用程序窗口;因此,我们必须指定我们的 Tkinter 窗口root。标签使用的文本由text设置;在这种情况下,我们将其设置为一个名为prompt的字符串,该字符串已经在之前定义了我们需要的文本。我们还设置width以匹配消息的字符数(虽然不是必需的,但如果我们稍后向标签添加更多文本,它会提供更整洁的结果),最后,我们使用bg='green'设置背景颜色。

接下来,我们为我们的消息定义文本Entry框:

textEnter=TK.Entry(root,textvariable=encryptvalue, 
                   width=len(prompt)) 

我们将定义textvariable——将一个变量链接到框的内容的一种有用的方式,这是一个特殊的字符串变量。我们可以直接使用textEnter.get()访问text,但我们将使用一个Tkinter StringVar()对象来间接访问它。如果需要,这将允许我们将正在处理的数据与处理 GUI 布局的代码分开。enycrptvalue变量在使用.set()命令时会自动更新它所链接到的Entry小部件(并且.get()命令会从Entry小部件获取最新的值)。

接下来,我们有两个Button小部件,加密和解密,如下所示:

encryptButton=TK.Button(root,text="Encrypt",command=encryptButton) 
decryptButton=TK.Button(root,text="Decrypt",command=decryptButton) 

在这种情况下,我们可以设置一个函数,当点击Button小部件时调用该函数,方法是设置command属性。我们可以定义两个函数,当每个按钮被点击时将被调用。在以下代码片段中,我们有encryptButton()函数,它将设置控制第一个Entry框内容的encryptvalue StringVar。这个字符串被设置为我们通过调用ENC.encryptText()得到的结果,我们要加密的消息(encryptvalue的当前值)和keyvalue变量。decrypt()函数完全相同,只是我们将keyvalue变量设置为负数以解密消息:

def encryptButton(): 
    encryptvalue.set(ENC.encryptText(encryptvalue.get(), 
                                     keyvalue.get())) 

然后我们以类似的方式设置最终的LabelEntry小部件。请注意,如果需要,textvariable也可以是整数(数值),但没有内置检查来确保只能输入数字。当使用.get()命令时,会遇到ValueError异常。

在我们定义了 Tkinter 窗口中要使用的所有小部件之后,我们必须设置布局。在 Tkinter 中有三种定义布局的方法:placepackgrid

place 布局允许我们使用精确的像素位置指定位置和大小。pack 布局按照它们被添加的顺序将项目放置在窗口中。grid 布局允许我们以特定的布局放置项目。建议尽量避免使用 place 布局,因为对一个项目进行任何小的更改都可能对窗口中所有其他项目的位置和大小产生连锁效应;其他布局通过确定它们相对于窗口中其他项目的位置来解决这个问题。

我们将按照以下截图中的布局放置这些项目:

加密/解密 GUI 的网格布局

使用以下代码设置 GUI 中前两个项目的位置:

label1.grid(row=0,columnspan=2,sticky= TK.E+TK.W) 
textEnter.grid(row=1,columnspan=2,sticky= TK.E+TK.W) 

我们可以指定第一个LabelEntry框将跨越两列(columnspan=2),并且我们可以设置粘性值以确保它们跨越整个宽度。这是通过设置TK.E表示东边和TK.W表示西边来实现的。如果需要在垂直方向上做同样的操作,我们会使用TK.N表示北边和TK.S表示南边。如果未指定column值,grid函数会默认为column=0。其他项目也是类似定义的。

最后一步是调用TK.mainloop(),这允许 Tkinter 运行;这允许监视按钮点击并调用与它们链接的函数。

创建图形应用程序-开始菜单

本示例显示了如何定义我们自己的 Tkinter 对象的变体,以生成自定义控件并动态构建菜单。我们还将简要介绍使用线程来允许其他任务继续运行,同时执行特定任务。

准备工作

要查看 GUI 显示,您需要一个显示树莓派桌面的显示器,或者您需要连接到另一台运行 X 服务器的计算机。

如何做…

  1. 要创建图形开始菜单应用程序,请创建以下graphicmenu.py脚本:
#!/usr/bin/python3 
# graphicmenu.py 
import tkinter as tk 
from subprocess import call 
import threading 
#Define applications ["Display name","command"] 
leafpad = ["Leafpad","leafpad"] 
scratch = ["Scratch","scratch"] 
pistore = ["Pi Store","pistore"] 
app_list = [leafpad,scratch,pistore] 
APP_NAME = 0 
APP_CMD  = 1 
class runApplictionThread(threading.Thread): 
    def __init__(self,app_cmd): 
        threading.Thread.__init__(self) 
        self.cmd = app_cmd 
    def run(self): 
        #Run the command, if valid 
        try: 
            call(self.cmd) 
        except: 
            print ("Unable to run: %s" % self.cmd) 
class appButtons: 
    def __init__(self,gui,app_index): 
        #Add the buttons to window 
        btn = tk.Button(gui, text=app_list[app_index][APP_NAME], 
                        width=30, command=self.startApp) 
        btn.pack() 
        self.app_cmd=app_list[app_index][APP_CMD] 
    def startApp(self): 
        print ("APP_CMD: %s" % self.app_cmd) 
        runApplictionThread(self.app_cmd).start()        
root = tk.Tk() 
root.title("App Menu") 
prompt = '      Select an application      ' 
label1 = tk.Label(root, text=prompt, width=len(prompt), bg='green') 
label1.pack() 
#Create menu buttons from app_list 
for index, app in enumerate(app_list): 
    appButtons(root,index) 
#Run the tk window 
root.mainloop() 
#End
  1. 上面的代码产生了以下应用程序:

应用程序菜单 GUI

它是如何工作的…

我们创建 Tkinter 窗口与之前一样;但是,我们不是单独定义所有项目,而是为应用程序按钮创建一个特殊的类。

我们创建的类充当了appButtons项目要包含的蓝图或规范。每个项目将包括一个app_cmd的字符串值,一个名为startApp()的函数和一个__init__()函数。__init__()函数是一个特殊函数(称为构造函数),当我们创建一个appButtons项目时会调用它;它将允许我们创建任何所需的设置。

在这种情况下,__init__()函数允许我们创建一个新的 Tkinter 按钮,其中文本设置为app_list中的一个项目,当点击按钮时调用startApp()函数。使用self关键字是为了调用属于该项目的命令;这意味着每个按钮将调用一个具有访问该项目的本地数据的本地定义函数。

我们将self.app_cmd的值设置为app_list中的命令,并通过startApp()函数准备好使用。现在我们创建startApp()函数。如果我们直接在这里运行应用程序命令,Tkinter 窗口将会冻结,直到我们打开的应用程序再次关闭。为了避免这种情况,我们可以使用 Python 线程模块,它允许我们同时执行多个操作。

runApplicationThread()类是使用threading.Thread类作为模板创建的——这个类继承了threading.Thread类的所有特性。和之前的类一样,我们也为这个类提供了__init__()函数。我们首先调用继承类的__init__()函数以确保它被正确设置,然后我们将app_cmd的值存储在self.cmd中。创建并初始化runApplicationThread()函数后,调用start()函数。这个函数是threading.Thread的一部分,我们的类可以使用它。当调用start()函数时,它将创建一个单独的应用程序线程(也就是说,模拟同时运行两个任务),允许 Tkinter 在执行类中的run()函数时继续监视按钮点击。

因此,我们可以将代码放在run()函数中来运行所需的应用程序(使用call(self.cmd))。

还有更多…

使 Python 特别强大的一个方面是它支持面向对象设计OOD)中使用的编程技术。这是现代编程语言常用的一种技术,用来帮助将我们希望程序执行的任务转化为代码中有意义的构造和结构。OOD 的原则在于,我们认为大多数问题都由几个对象(GUI 窗口、按钮等)组成,它们相互交互以产生期望的结果。

在前一节中,我们发现可以使用类来创建可以多次重复使用的唯一对象。我们创建了一个appButton类,它生成了一个具有该类所有功能的对象,包括其自己的app_cmd版本,该版本将被startApp()函数使用。appButton类型的另一个对象将有其自己不相关的[app_cmd]数据,其startApp()函数将使用它。

你可以看到,类对于将一组相关的变量和函数集中在一个对象中非常有用,而且类将在一个地方保存它自己的数据。拥有同一类型(类)的多个对象,每个对象内部都有自己的函数和数据,会导致更好的程序结构。传统的方法是将所有信息保存在一个地方,然后来回发送每个项目以供各种函数处理;然而,在大型系统中,这可能变得繁琐。

下图显示了相关函数和数据的组织结构:

数据和函数

到目前为止,我们已经使用 Python 模块将程序的不同部分分开。

文件;这使我们能够在概念上将程序的不同部分分开(界面、编码器/解码器或类库,比如 Tkinter)。模块可以提供控制特定硬件的代码,定义互联网接口,或提供常用功能的类库;然而,它最重要的功能是控制接口(在导入项目时可用的函数、变量和类的集合)。一个良好实现的模块应该有一个清晰的接口,其重点是围绕它的使用方式,而不是它的实现方式。这使你能够创建多个可以轻松交换和更改的模块,因为它们共享相同的接口。在我们之前的例子中,想象一下,通过支持encryptText(input_text,key),要将encryptdecrypt模块更改为另一个模块是多么容易。复杂的功能可以分解成更小、可管理的块,可以在多个应用程序中重复使用。

Python 一直在使用类和模块。每次你导入一个库,比如sys或 Tkinter,或者使用value.str()转换一个值,或者使用for...in遍历一个列表,你都可以在不用担心细节的情况下使用它们。你不必在你写的每一行代码中都使用类或模块,但它们是你程序员工具箱中有用的工具,适合你正在做的事情时使用。

通过在本书的示例中使用类和模块,我们将了解它们如何使我们能够生成结构良好、易于测试和维护的代码。

在应用程序中显示照片信息

在这个例子中,我们将创建一个实用类来处理照片,其他应用程序(作为模块)可以使用它来访问照片元数据并轻松显示预览图像。

准备就绪

以下脚本使用了Python Image LibraryPIL);Python 3 的兼容版本是Pillow

Pillow 没有包含在 Raspbian 仓库中(由apt-get使用);因此,我们需要使用名为PIPPython 包管理器来安装 Pillow。

要为 Python 3 安装包,我们将使用 Python 3 版本的 PIP(这需要 50MB 的可用空间)。

以下命令可用于安装 PIP:

sudo apt-get update
sudo apt-get install python3-pip 

在使用 PIP 之前,请确保已安装libjpeg-dev以允许 Pillow 处理 JPEG 文件。您可以使用以下命令执行此操作:

sudo apt-get install libjpeg-dev

现在您可以使用以下 PIP 命令安装 Pillow:

sudo pip-3.2 install pillow  

PIP 还可以通过使用uninstall而不是install来轻松卸载软件包。

最后,您可以通过运行python3来确认它已成功安装:

>>>import PIL
>>>help(PIL)  

您不应该收到任何错误,并且应该看到有关 PIL 及其用途的大量信息(按Q键完成)。按照以下方式检查安装的版本:

>>PIL.PILLOW_VERSION

您应该看到2.7.0(或类似)。

通过使用以下命令安装 pip-2.x,PIP 也可以与 Python 2 一起使用:

sudo apt-get install python-pip

使用sudo pip install安装的任何软件包都将仅为 Python 2 安装。

如何做…

要在应用程序中显示照片信息,请创建以下photohandler.py脚本:

##!/usr/bin/python3 
#photohandler.py 
from PIL import Image 
from PIL import ExifTags 
import datetime 
import os 
#set module values 
previewsize=240,240 
defaultimagepreview="./preview.ppm" 
filedate_to_use="Exif DateTime" 
#Define expected inputs 
ARG_IMAGEFILE=1 
ARG_LENGTH=2 
class Photo: 
    def __init__(self,filename): 
        """Class constructor""" 
        self.filename=filename 
        self.filevalid=False 
        self.exifvalid=False 
        img=self.initImage() 
        if self.filevalid==True: 
            self.initExif(img) 
            self.initDates() 
    def initImage(self): 
        """opens the image and confirms if valid, returns Image""" 
        try: 
            img=Image.open(self.filename) 
            self.filevalid=True 
        except IOError: 
            print ("Target image not found/valid %s" % 
                   (self.filename)) 
            img=None 
            self.filevalid=False 
        return img 
    def initExif(self,image): 
        """gets any Exif data from the photo""" 
        try: 
            self.exif_info={ 
                ExifTags.TAGS[x]:y 
                for x,y in image._getexif().items() 
                if x in ExifTags.TAGS 
            } 
            self.exifvalid=True 
        except AttributeError: 
            print ("Image has no Exif Tags") 
            self.exifvalid=False 
    def initDates(self): 
        """determines the date the photo was taken""" 
        #Gather all the times available into YYYY-MM-DD format 
        self.filedates={} 
        if self.exifvalid: 
            #Get the date info from Exif info 
            exif_ids=["DateTime","DateTimeOriginal", 
                      "DateTimeDigitized"] 
            for id in exif_ids: 
                dateraw=self.exif_info[id] 
                self.filedates["Exif "+id]= 
                                dateraw[:10].replace(":","-") 
        modtimeraw = os.path.getmtime(self.filename) 
        self.filedates["File ModTime"]="%s" % 
            datetime.datetime.fromtimestamp(modtimeraw).date() 
        createtimeraw = os.path.getctime(self.filename) 
        self.filedates["File CreateTime"]="%s" % 
            datetime.datetime.fromtimestamp(createtimeraw).date() 
    def getDate(self): 
        """returns the date the image was taken""" 
        try: 
            date = self.filedates[filedate_to_use] 
        except KeyError: 
            print ("Exif Date not found") 
            date = self.filedates["File ModTime"] 
        return date 
    def previewPhoto(self): 
        """creates a thumbnail image suitable for tk to display""" 
        imageview=self.initImage() 
        imageview=imageview.convert('RGB') 
        imageview.thumbnail(previewsize,Image.ANTIALIAS) 
        imageview.save(defaultimagepreview,format='ppm') 
        return defaultimagepreview

前面的代码定义了我们的Photo类;在*还有更多…*部分和下一个示例中运行它之前,它对我们没有用处。

它是如何工作的…

我们定义了一个名为Photo的通用类;它包含有关自身的详细信息,并提供

用于访问可交换图像文件格式EXIF)信息并生成的函数

一个预览图像。

__init__()函数中,我们为我们的类变量设置值,并调用self.initImage(),它将使用 PIL 中的Image()函数打开图像。然后我们调用self.initExif()self.initDates(),并设置一个标志来指示文件是否有效。如果无效,Image()函数将引发IOError异常。

initExif()函数使用 PIL 从img对象中读取 EXIF 数据,如下面的代码片段所示:

self.exif_info={ 
                ExifTags.TAGS[id]:y 
                for id,y in image._getexif().items() 
                if id in ExifTags.TAGS 
               } 

前面的代码是一系列复合语句,导致self.exif_info被填充为标签名称及其相关值的字典。

ExifTag.TAGS是一个包含可能的标签名称及其 ID 的列表的字典,如下面的代码片段所示:

ExifTag.TAGS={ 
4096: 'RelatedImageFileFormat', 
513: 'JpegIFOffset', 
514: 'JpegIFByteCount', 
40963: 'ExifImageHeight', 
...etc...}

image._getexif()函数返回一个包含图像相机设置的所有值的字典,每个值都与其相关的 ID 链接,如下面的代码片段所示:

Image._getexif()={ 
256: 3264, 
257: 2448, 
37378: (281, 100), 
36867: '2016:09:28 22:38:08', 
...etc...} 

for循环将遍历图像的 EXIF 值字典中的每个项目,并检查其在ExifTags.TAGS字典中的出现;结果将存储在self.exif_info中。其代码如下:

self.exif_info={ 
'YResolution': (72, 1), 
 'ResolutionUnit': 2, 
 'ExposureMode': 0,  
'Flash': 24, 
...etc...} 

再次,如果没有异常,我们将设置一个标志来指示 EXIF 数据是有效的,或者如果没有 EXIF 数据,我们将引发AttributeError异常。

initDates()函数允许我们收集所有可能的文件日期和来自 EXIF 数据的日期,以便我们可以选择其中一个作为我们希望用于文件的日期。例如,它允许我们将所有图像重命名为标准日期格式的文件名。我们创建一个self.filedates字典,其中包含从 EXIF 信息中提取的三个日期。然后添加文件系统日期(创建和修改),以防没有 EXIF 数据可用。os模块允许我们使用os.path.getctime()os.path.getmtime()来获取文件创建的时期值。它也可以是文件移动时的日期和时间-最后写入的文件修改时间(例如,通常指图片拍摄的日期)。时期值是自 1970 年 1 月 1 日以来的秒数,但我们可以使用datetime.datetime.fromtimestamp()将其转换为年、月、日、小时和秒。添加date()只是将其限制为年、月和日。

现在,如果Photo类被另一个模块使用,并且我们希望知道拍摄的图像的日期,我们可以查看self.dates字典并选择合适的日期。但是,这将要求程序员知道self.dates值的排列方式,如果以后更改了它们的存储方式,将会破坏他们的程序。因此,建议我们通过访问函数访问类中的数据,以便实现独立于接口(这个过程称为封装)。我们提供一个在调用时返回日期的函数;程序员不需要知道它可能是五个可用日期中的一个,甚至不需要知道它们是作为时期值存储的。使用函数,我们可以确保接口保持不变,无论数据的存储或收集方式如何。

最后,我们希望Photo类提供的最后一个函数是previewPhoto()。此函数提供了一种生成小缩略图图像并将其保存为便携式像素图格式(PPM)文件的方法。正如我们将在一会儿发现的那样,Tkinter 允许我们将图像放在其Canvas小部件上,但不幸的是,它不直接支持 JPEG,只支持 GIF 或 PPM。因此,我们只需将要显示的图像的小副本保存为 PPM 格式,然后让 Tkinter 在需要时将其加载到Canvas上。

总之,我们创建的Photo类如下:

操作 描述
__init__(self,filename) 这是对象初始化程序。
initImage(self) 这将返回img,一个 PIL 类型的图像对象。
initExif(self,image) 如果存在,这将提取所有的 EXIF 信息。
initDates(self) 这将创建一个包含文件和照片信息中所有可用日期的字典。
getDate(self) 这将返回照片拍摄/创建的日期的字符串。
previewPhoto(self) 这将返回预览缩略图的文件名的字符串。

属性及其相应的描述如下:

属性 描述
self.filename 照片的文件名。
self.filevalid 如果文件成功打开,则设置为True
self.exifvalid 如果照片包含 EXIF 信息,则设置为True
self.exif_info 这包含照片的 EXIF 信息。
self.filedates 这包含了文件和照片信息中可用日期的字典。

为了测试新类,我们将创建一些测试代码来确认一切是否按我们的预期工作;请参阅以下部分。


Python 物联网入门指南(二)(2)https://developer.aliyun.com/article/1507137

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
2天前
|
数据采集 运维 API
适合所有编程初学者,豆瓣评分8.6的Python入门手册开放下载!
Python是一种跨平台的计算机程序设计语言,它可以用来完成Web开发、数据科学、网络爬虫、自动化运维、嵌入式应用开发、游戏开发和桌面应用开发。 Python上手很容易,基本有其他语言编程经验的人可以在1周内学会Python最基本的内容(PS:没有基础的人也可以直接学习,速度会慢一点) 今天给小伙伴们分享一份Python语言及其应用的手册,这份手册主要介绍 Python 语言的基础知识及其在各个领域的具体应用,基于最新版本 3.x。
|
5天前
|
数据可视化 API Python
Python零基础“圣经”!300W小白从入门到精通首选!
今天分享的这本书在让你尽快学会 Python基础知识的同时,能够编写并正确的运行程序(游戏、数据可视化、Web应用程序) 最大的特色在于,在为初学者构建完整的 Python 语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是 后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽 又面面俱到。相信这本书能够得到更多 Python 初学者的喜爱。
|
6天前
|
Python
小白入门必备!计科教授的Python精要参考PDF开放下载!
随着互联网产业的高速发展,在网络上早已积累了极其丰富的Python学习资料,任何人都可以基于这些资源,自学掌握 Python。 但实际上,网络上充斥的资源太多、太杂且不成体系,在没有足够的编程/工程经验之前,仅靠“看”线上资源自学,的确是一件非常困难的事。
|
6天前
|
数据可视化 API Python
豆瓣评分9.4!堪称经典的Python入门圣经,你还没看过吗?
最理想的新人入门书应该满足两个特点:第一就是内容通俗易懂;第二就是要有实战,能够让读者在学完之后知道具体怎么用。 今天给小伙伴们分享的这份Python入门手册,在为初学者构建完整的Python语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽又面面俱到。
|
8天前
|
数据采集 运维 API
适合所有编程初学者,豆瓣评分8.6的Python入门手册开放下载!
Python是一种跨平台的计算机程序设计语言,它可以用来完成Web开发、数据科学、网络爬虫、自动化运维、嵌入式应用开发、游戏开发和桌面应用开发。 Python上手很容易,基本有其他语言编程经验的人可以在1周内学会Python最基本的内容(PS:没有基础的人也可以直接学习,速度会慢一点)
|
9天前
|
数据采集 SQL 数据可视化
使用Python和Pandas库进行数据分析的入门指南
使用Python和Pandas库进行数据分析的入门指南
72 0
|
9天前
|
Linux iOS开发 MacOS
Python入门指南
Python入门指南
32 0
|
10天前
|
数据采集 前端开发 JavaScript
Python爬虫入门
网络爬虫是自动抓取网页数据的程序,通过URL获取网页源代码并用正则表达式提取所需信息。反爬机制是网站为防止爬取数据设置的障碍,而反反爬是对这些机制的对策。`robots.txt`文件规定了网站可爬取的数据。基础爬虫示例使用Python的`urllib.request`模块。HTTP协议涉及请求和响应,包括状态码、头部和主体。`Requests`模块是Python中常用的HTTP库,能方便地进行GET和POST请求。POST请求常用于隐式提交表单数据,适用于需要发送复杂数据的情况。
16 1
|
13天前
|
机器学习/深度学习 人工智能 数据可视化
Python编程入门:从零开始探索编程的奇妙世界
这篇教程引导初学者入门Python编程,从安装Python开始,逐步讲解基本语法,如`print()`、变量、条件判断、循环以及自定义函数。文章强调了Python在数据处理、数据分析、人工智能和机器学习等领域的重要性,并鼓励学习者探索Python的广泛应用,开启编程之旅。
|
14天前
|
数据可视化 API Python
Python零基础“圣经”!300W小白从入门到精通首选!
今天分享的这本书在让你尽快学会 Python基础知识的同时,能够编写并正确的运行程序(游戏、数据可视化、Web应用程序) 最大的特色在于,在为初学者构建完整的 Python 语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是 后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽 又面面俱到。相信这本书能够得到更多 Python 初学者的喜爱。