- 博客(240)
- 收藏
- 关注
原创 Python Web开发-WSGI接口
所以,最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。
2025-04-03 12:25:48
645
原创 Python Web开发-HTTP协议简介
在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。HTML是一种用来定义网页的文本,会HTML,就可以编写网页;HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。在举例子之前,我们需要安装Google的Chrome浏览器。为什么要使用Chrome浏览器而不是IE呢?因为我们需要在浏览器很方便地调试我们的Web应用,而Chrome提供了一套完整地调试工具,非常适合Web开发。Elements显示网页的结构,Network。
2025-04-03 12:23:27
937
原创 SQL 关系模型-索引
在关系数据库中,如果有上万甚至上亿条记录,在查找记录的时候,想要获得非常快的速度,就需要使用索引。索引是关系数据库中对某一列或多个列的值进行预排序的数据结构。通过使用索引,可以让数据库系统不必扫描整个表,而是直接定位到符合条件的记录,这样就大大加快了查询速度。例如,对于students如果要经常根据score列进行查询,就可以对score使用就创建了一个名称为idx_score,使用列score的索引。索引的效率取决于索引列的值是否散列,即该列的值如果越互不相同,那么索引效率越高。
2025-04-01 15:10:23
505
原创 SQL 关系模型-外键
当我们用主键唯一标识记录时,我们就可以在students我们还可以在classes但是我们如何确定students表的一条记录,例如,id=1的小明,属于哪个班级呢?由于一个班级可以有多个学生,在关系模型中,这两个表的关系可以称为“一对多”,即一个classes的记录可以对应多个students表的记录。为了表达这种一对多的关系,我们需要在students表中加入一列class_id,让它的值与classes这样,我们就可以根据class_id这个列直接定位出一个students表的记录应该对应到。
2025-04-01 15:07:00
924
原创 SQL 关系模型-主键
我们已经知道,关系数据库是建立在关系模型上的。而关系模型本质上就是若干个存储数据的二维表,可以把它们看作很多Excel表。表的每一行称为记录(Record),记录是一个逻辑意义上的数据。表的每一列称为字段(Column),同一个表的每一行记录都拥有相同的若干字段。字段定义了数据类型(整型、浮点型、字符串、日期等),以及是否允许为NULL。注意NULL表示字段数据不存在。一个整型字段如果为NULL不表示它的值为0,同样的,一个字符串型字段为NULL也不表示它的值为空串''。
2025-03-31 19:32:11
1054
原创 Python 访问数据库-使用Mysql
程序运行的时候,数据都是在内存中的。当程序终止的时候,通常都需要将数据保存到磁盘上,无论是保存到本地磁盘,还是通过网络保存到服务器上,最终都会将数据写入磁盘文件。而如何定义数据的存储格式就是一个大问题。我们可以用一个文本文件保存,一行保存一个学生,用还可以定义各种保存格式,但是问题来了:存储和读取需要自己实现,JSON还是标准,自己定义的格式就各式各样了;不能做快速查询,只有把数据全部读到内存中才能自己遍历,但有时候数据的大小远远超过了内存,根本无法全部读入内存。
2025-03-31 12:38:23
623
原创 SQL 关系数据库概述
为什么需要数据库?因为应用程序需要保存用户的数据,比如Word需要把用户文档保存起来,以便下次继续编辑或者拷贝到另一台电脑。要保存用户的数据,一个最简单的方法是把用户数据写入文件。如果要保存学校所有班级的信息,可以写入另一个CSV文件。如果每个应用程序都各自写自己的读写数据的代码,一方面效率低,容易出错,另一方面,每个应用程序访问数据的接口都不相同,数据难以复用。所以,数据库作为一种专门管理数据的软件就出现了。应用程序不需要自己管理数据,而是通过数据库软件提供的接口来读写数据。
2025-03-30 18:24:11
596
原创 从零开始:用链表实现循环队列的终极指南
首先,我们需要定义队列中的节点结构。每个节点包含一个数据元素和一个指向下一个节点的指针。在这里,ElemType是数据元素的类型,LNode是链表节点的结构体。
2025-03-30 18:14:52
241
原创 动态数据管理:链表队列的魅力
队列是一种特殊的线性数据结构,元素的插入和删除操作分别在队列的尾部和头部进行。队列的主要特点是遵循先进先出(FIFO)的原则,即最先进入队列的元素最先被移除。通过使用链表实现队列,我们能够灵活地管理数据,避免了固定大小数组的限制。链表队列的设计使得我们可以在队列的两端进行操作,而不必担心空间的浪费。在实际应用中,链表队列可以用于任务调度、缓冲区管理等场景。希望本文能帮助你理解链表队列的实现及其应用。
2025-03-30 18:03:56
1127
原创 数据结构揭秘:如何用数组实现循环队列
循环队列是一种特殊的队列结构,它的尾部连接到头部,形成一个环形结构。这种设计可以有效利用存储空间,避免因队列前端出队而导致的空间浪费。与线性队列相比,循环队列能够更好地利用数组的空间。通过使用数组实现循环队列,我们能够高效地管理数据,避免了固定大小数组的限制。循环队列的设计使得我们可以在队列的两端进行操作,而不必担心空间的浪费。在实际应用中,循环队列可以用于任务调度、缓冲区管理等场景。希望本文能帮助你理解循环队列的实现及其应用。
2025-03-30 17:06:19
598
原创 Python 网络编程-TCP/UDP编程
用TCP协议进行Socket编程在Python中十分简单,对于客户端,要主动连接服务器的IP和指定端口,对于服务器,要首先监听指定端口,然后,对每一个新的连接,创建一个线程或进程来处理。但是服务器还需要同时响应多个客户端的请求,所以,每个连接都需要一个新的进程或者新的线程来处理,否则,服务器一次就只能服务一个客户端了。答案是作为服务器,提供什么样的服务,端口号就必须固定下来。是一个特殊的IP地址,表示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。
2025-03-30 16:47:40
1072
原创 Python 网络编程-TCP/IP简介
虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多。计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM、Apple和Microsoft都有各自的网络协议,互不兼容,这就好比一群人有的说英语,有的说中文,有的说德语,说同一种语言的人可以交流,不同的语言之间就不行了。为了把全世界的所有不同类型的计算机都连接起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Internet Protocol Suite)就是通用协议标准。
2025-03-30 16:33:55
732
原创 Python 图形界面-海龟绘图
从程序代码可以看出,海龟绘图就是指挥海龟前进、转向,海龟移动的轨迹就是绘制的线条。要绘制一个长方形,只需要让海龟前进、右转90度,反复4次。包本身只是一个绘图库,但是配合Python代码,就可以绘制各种复杂的图形。函数,让窗口进入消息循环,等待被关闭。否则,由于Python进程会立刻结束,将导致窗口被立刻关闭。库,基本上100%复制了原始的Turtle Graphics的所有功能。使用递归,可以绘制出非常复杂的图形。,它的特色就是通过编程指挥一个小海龟(turtle)在屏幕上绘图。绘图完成后,记得调用。
2025-03-27 16:48:43
362
原创 Python 图形界面
但是Python自带的库是支持Tk的Tkinter,使用Tkinter,无需安装任何包,就可以直接使用。本章简单介绍如何使用Tkinter进行GUI编程。
2025-03-27 16:46:13
297
原创 Python 常用第三方模块-psutil
用Python来编写脚本简化日常的运维工作是Python的一个重要用途。在Linux下,有许多系统命令可以让我们时刻监控系统运行的状态,如pstopfree等等。要获取这些系统信息,Python可以通过subprocess模块调用并获取结果。但这样做显得很麻烦,尤其是要写很多解析代码。在Python中获取系统信息的另一个好办法是使用psutil这个第三方模块。
2025-03-25 14:28:18
648
原创 Python 常用第三方模块-chardet
字符串编码一直是令人非常头疼的问题,尤其是我们在处理一些不规范的第三方网页的时候。虽然Python提供了Unicode表示的str和bytes两种数据类型,并且可以通过encode()和decode()方法转换,但是,在不知道编码的情况下,对bytes做decode()不好做。对于未知编码的bytes,要把它转换成str,需要先“猜测”编码。猜测的方式是先收集各种编码的特征字符,根据特征字符判断,就能有很大概率“猜对”。当然,我们肯定不能从头自己写这个检测编码的功能,这样做费时费力。chardet。
2025-03-25 14:24:57
436
原创 Python 常用第三方模块-requests
模块,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。如果遇到Permission denied安装失败,请加上sudo重试。它是一个Python第三方库,处理URL资源特别方便。用requests获取URL资源,就是这么简单!需要传入HTTP Header时,我们传入一个。等,就可以以PUT或DELETE方式请求资源。无论响应是文本还是二进制内容,我们都可以用。类似的,上传文件需要更复杂的编码格式,但是。要在请求中传入Cookie,只需准备一个。对于带参数的URL,传入一个。
2025-03-24 19:02:28
422
原创 Python 常用第三方模块-Pillow
除了内建的模块外,Python还有大量的第三方模块。基本上,所有的第三方模块都会在上注册,只要找到对应的模块名字,即可用pip安装。此外,在一节中,我们强烈推荐安装,安装后,数十个常用的第三方模块就已经就绪,不用pip手动安装。本章介绍常用的第三方模块。
2025-03-24 18:58:20
373
原创 Python 常用内建模块-venv
如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的Python 3。在开发Python应用程序的时候,系统安装的Python3只有一个版本:3.x。完全可以针对每个应用创建独立的Python运行环境,这样就可以对每个应用的Python环境进行隔离。为应用提供了隔离的Python运行环境,解决了不同应用间安装多版本的冲突问题。这种情况下,每个应用可能需要各自拥有一套“独立”的Python运行环境。第一步,创建目录,这里把Python虚拟运行环境命名为。
2025-03-23 12:10:43
388
原创 Python 常用内建模块-HTMLParser
如果我们要编写一个搜索引擎,第一步是用爬虫把目标网站的页面抓下来,第二步就是解析该HTML页面,看看里面的内容到底是新闻、图片还是视频。假设第一步已经完成了,第二步应该如何解析HTML呢?HTML本质上是XML的子集,但是HTML的语法没有XML那么严格,所以不能用标准的DOM或SAX来解析HTML。好在Python提供了HTMLParser方法可以多次调用,也就是不一定一次把整个HTML字符串都塞进去,可以一部分一部分塞进去。特殊字符有两种,一种是英文表示的,一种是数字表示的Ӓ。
2025-03-23 12:07:07
417
原创 Python 常用内建模块-XML
XML虽然比JSON复杂,在Web中应用也不如以前多了,不过仍有很多地方在用,所以,有必要了解如何操作XML。
2025-03-22 19:21:12
415
原创 Python 常用内建模块-contextlib
在Python中,读写文件这样的资源要特别注意,必须在使用完毕后正确关闭它们。正确关闭文件资源的一个方法是使用写非常繁琐。Python的with并不是只有open()函数返回的fp对象才能使用with语句。实际上,任何对象,只要正确实现了上下文管理,就可以用于with语句。实现上下文管理是通过__enter__和__exit__这两个方法实现的。这样我们就可以把自己写的资源对象用于with。
2025-03-21 12:54:13
312
原创 Python 常用内建模块-itertools
实际上挑选规则是通过函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key。迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按。模块提供的全部是处理迭代功能的函数,它们的返回值不是list,而是。无限序列虽然可以无限迭代下去,但是通常我们会通过。提供了非常有用的用于操作迭代对象的函数。
2025-03-21 12:43:13
374
原创 Python 常用内建模块-hmac
通过哈希算法,我们可以验证一段数据是否有效,方法就是对比该数据的哈希值,例如,判断用户口令是否正确,我们用保存在数据库中的对比计算的结果,如果一致,用户输入的口令就是正确的。为了防止黑客通过彩虹表根据哈希值反推原始口令,在计算哈希的时候,不能仅针对原始输入计算,需要增加一个salt来使得相同的输入也能得到不同的哈希,这样,大大增加了黑客破解的难度。如果salt是我们自己随机生成的,通常我们计算MD5时采用。
2025-03-20 11:57:08
254
原创 Python 常用内建模块-hashlib
Python的hashlib提供了常见的哈希算法,如MD5,SHA1等等。什么是哈希算法呢?哈希算法又称摘要算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。举个例子,你写了一篇文章,内容是一个字符串,并附上这篇文章的哈希是。如果有人篡改了你的文章,并发表为,你可以一下子指出Bob篡改了你的文章,因为根据计算出的哈希不同于原始文章的哈希。可见,哈希算法就是通过哈希函数hash(data)对任意长度的数据data计算出固定长度的哈希digest。
2025-03-20 11:30:55
658
原创 Python 常用内建模块-struct
一个4字节整数:保留位,始终为0;一个4字节整数:实际图像的偏移量;一个4字节整数:Header的字节数;所以,尽管Python不适合编写底层操作字节流的代码,但在对性能要求不高的地方,利用。在Python中,比方说要把一个32位无符号整数变成字节,也就是4个长度的。说明是Windows位图,位图大小为640x360,颜色数为24。,可以检查任意文件是否是位图文件,如果是,打印出图片大小和颜色数。准确地讲,Python没有专门处理字节的数据类型。可以表示字节,所以,字节数组=二进制。
2025-03-19 21:55:07
347
原创 Python 常用内建模块-base64
这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上。这样我们得到4个数字作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。
2025-03-19 21:51:34
537
原创 Python 常用内建模块-argparse
在命令行程序中,经常需要获取命令行参数。Python内置的sys.argv运行上述copy.py这种方式能应付简单的参数,但参数稍微复杂点,比如可以使用-d复制目录,使用过滤文件名等,解析起来就非常麻烦。为了简化参数解析,我们可以使用内置的库,定义好各个参数类型后,它能直接返回有效的参数。localhost3306False其中,outfile是位置参数,而其他则是类似这样的“关键字”参数。用argparse更神奇的是,如果输入-h我们不必捕获异常,
2025-03-18 22:29:25
344
原创 Python 正则表达式
字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。因为正则表达式也是用字符串表示的,所以,我们要首先了解如何用字符来描述字符。
2025-03-17 19:15:21
915
原创 Python 进程与线程-分布式进程
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。Python的模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。举个例子:如果我们已经有一个通过Queue。
2025-03-13 10:40:46
903
3
原创 Python 进程和线程-进程 vs. 线程
这种计算密集型任务虽然也可以用多任务完成,但是任务越多,花在任务切换的时间就越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行的数量应当等于CPU的核心数。对于IO密集型任务,最合适的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言开发效率最差。假设你打算切换到多任务模型,可以先做1分钟语文,再切换到数学作业,做1分钟,再切换到英语,以此类推,只要切换速度足够快,这种方式就和单核CPU执行多任务是一样的了,以幼儿园小朋友的眼光来看,你就正在同时写5科作业。
2025-03-13 10:38:00
1064
原创 Python 进程和线程-多线程
多任务可以由多进程完成,也可以由一个进程内的多线程完成。我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。_thread和threading_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高级模块。
2025-03-12 09:59:54
609
原创 Python 进程和线程-多进程
很多同学都听说过,现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统。什么叫“多任务”呢?简单地说,就是操作系统可以同时运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。
2025-03-12 09:58:05
898
原创 深入理解栈的实现:C语言中的顺序栈
通过本文的介绍,我们详细探讨了顺序栈的基本实现,包括栈的初始化、判断栈是否为空、入栈、出栈以及获取栈顶元素的操作。顺序栈的实现简单明了,适合初学者理解栈的基本概念和操作。在实际应用中,栈可以用于表达式求值、括号匹配、深度优先搜索等场景。掌握栈的基本操作将为学习更复杂的数据结构和算法打下坚实的基础。希望通过这篇博客,读者能够对顺序栈有更深入的理解,并能够在自己的项目中灵活运用这一数据结构。
2025-03-11 15:38:47
884
原创 Python IO编程-序列化
可以随时修改变量,比如把name改成'Bill',但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的'Bill'存储到磁盘上,下次重新运行程序,变量又被初始化为'Bob'。我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。序列化之后,就可以把序列化后的内容写入磁盘,或者通过网络传输到别的机器上。
2025-03-11 15:14:23
1037
原创 Python IO编程-操作文件和目录
如果我们要操作文件、目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如dircp等命令。如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。打开Python交互式命令行,我们来看看如何使用os如果是posix,说明系统是LinuxUnix或macOS,如果是nt,就是Windows系统。要获取详细的系统信息,可以调用uname()注意uname()
2025-03-11 14:59:46
493
原创 Python IO编程-StringIO和BytesIO
很多时候,数据读写不一定是文件,也可以在内存中读写。的方法,使得和读写文件具有一致的接口。,如果要操作二进制数据,就需要使用。,我们创建一个``Bytes。,而是经过UTF-8编码的。顾名思义就是在内存中读写。,我们需要先创建一个。方法用于获得写入后的。
2025-03-10 17:05:41
282
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人