Python学习--IO编程

因为对更多内容的渴望,已经想迫切地学完Python基础知识,进到Flask框架的学习中,测试就先跳过了,等以后碰到了再回头看,这边正式进到IO编程中。定义IO再计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留的,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据
分类: 其他 发布时间: 01-27 23:36 阅读次数: 0

Python学习--文件读写

读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的。现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。读文件要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标识符:(简单,学过Unix环境程序设计)
分类: 其他 发布时间: 01-27 23:36 阅读次数: 0

Python学习--StringIO和BytesIO

StringIO很多时候,数据读写不一定是文件,也可以在内存中读写。StringIO顾名思义就是在内存中读写str。要把str写入StringIO,我们需要先创建一个StringIO,然后,像文件一样写入即可:>>>from io import StringIO>>>f = StringIO()>>>f.write('hello')>5>>>f.write(' ')>1>>>f.writ
分类: 其他 发布时间: 01-27 23:36 阅读次数: 0

Python学习--操作文件和目录

如果我们要操作文件、目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如dir、cp等命令。如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。打开Python交互式命令行,我们来看看如何使用os模块的基本功能:>>> import os>>> os.name # 操作系统类型'posix'如果是posix,说明系统是L
分类: 其他 发布时间: 01-27 23:36 阅读次数: 0

Python学习--序列化

在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:d = dict(name='Bob', age=20, score=88)可以随时修改变量,比如把name改成’Bill’,但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的’Bill’存储到磁盘上,下次重新运行程序,变量又被初始化为’Bob’。我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,
分类: 其他 发布时间: 01-27 23:35 阅读次数: 0

Python学习--进场和线程

很多同学都听说过,现代操作系统比如Mac OS X, UNIX,Linux,Windows等,都是支持“多任务”的操作系统。什么叫“多任务”呢?简单地说,就是操作系统可以同事运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的
分类: 其他 发布时间: 01-27 23:35 阅读次数: 0

Python学习--正则表达式

字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。正则表达式是一种用来匹配字符串的强有力的武器。他的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。所以我们判断一个字符串是否是合法的Email的方法是:创建一个匹配Email的正则表达式;用该正则表达式去匹
分类: 其他 发布时间: 01-27 23:35 阅读次数: 0

Python学习--访问限制

在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性:>>> bart = Student('Bart Simpson', 59)>>> bart.score59>>> bart.score = 99>>> bart.score99如果要让内部属性不被外部
分类: 其他 发布时间: 01-27 23:35 阅读次数: 0

Python学习--单元测试

如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。比如对函数abs(),我们可以编写以下几个测试用例:输入正数,比如1、1.2、0.99,期待返回值与输入相同;输入负数,比如-1、-1.2、-0.99,期待返回值与输入相反;输入0,期待返回0;输入非数值类型,比如None、[]、{},期待抛出TypeError。把上面的测试用例放到一个测试模块里,就是一个完整的单
分类: 其他 发布时间: 01-27 23:34 阅读次数: 0

Python学习--多进程

要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。Unix/Linux操作系统提供了一个fork()系统调用,(亲切!!),它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用ge
分类: 其他 发布时间: 01-27 23:34 阅读次数: 0

Python学习--多线程

多任务可以由多进程完成,也可以由一个进程内的多线程完成。我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高
分类: 其他 发布时间: 01-27 23:34 阅读次数: 0

Python学习--ThreadLocal

在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。但是局部变量也有问题,就是在函数调用的时候,传递起来很麻烦:def process_student(name): std = Student(name) # std是局部变量,但是每个函数都要用它,因此必须传进去: do_task_1(std) do_task_2(std)def do_task_1(std): do_subtask
分类: 其他 发布时间: 01-27 23:33 阅读次数: 0

Python学习--进程 vs 线程

我们介绍了多进程和多线程,这是实现多任务最常用的两种方式。现在,我们来讨论一下这两种方式的优缺点。首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker。如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。如果用多线程实现Master-Worker,主线程就是Master,其他线程就是Worker。多进程模式最大的优点就是稳定性高,因为
分类: 其他 发布时间: 01-27 23:33 阅读次数: 0

Python学习--分布式进程

在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。举个例子:如果我们已经有一个通过Queue
分类: 其他 发布时间: 01-27 23:33 阅读次数: 0

Python学习-WSGI接口

了解了HTTP协议和HTML文档,我们其实明白了一个Web应用的本质就是:浏览器发送一个HTTP请求;服务器收到请求,生成一个HTML文档;服务器把HTML文档作为HTTP响应的Body发送给浏览器;浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。所以,最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。如果要动态生成HT
分类: 其他 发布时间: 01-27 23:33 阅读次数: 0

Python学习--使用Web框架

了解了WSGI框架,我们发现:其实一个Web App,就是写一个WSGI的处理函数,针对每一个HTTP请求进行响应。但是如何处理HTTP请求不是问题,问题是如何处理100个不同的URL。每一个URL可以对应GET和POST请求,当然还有PUT、DELETE等请求,但是我们通常只考虑最常见的GET和POST请求。一个最简单的想法是从environ变量里提取出HTTP请求的信息,如何逐个判断:def application(environ, start_response): method = e
分类: 其他 发布时间: 01-27 23:33 阅读次数: 0

Python学习--aiohttp

asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。我们先安装aiohttp:pip install aiohttp然后编写一个HTTP服务器,分别处理以下URL:/ - 首页返回b'<h1>Index</h1
分类: 其他 发布时间: 01-27 23:32 阅读次数: 0

Python学习--使用模板

Web框架把我们从WSGI中拯救出来了。现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了。但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要。在函数中返回一个包含HTML的字符串,简单的页面还可以,但是,想想新浪首页的6000多行的HTML,你确信能在Python的字符串中正确地写出来吗?反正我是做不到。(哈哈哈,引出了模板的必要性)俗话说得好,不懂前端的Python工程师不是好的产品经理。有Web开发的经验的同学都明白,Web App最复杂的部分就在HTML页
分类: 其他 发布时间: 01-27 23:32 阅读次数: 0

Python学习--异步IO

在IO编程一节中,我们已经知道,CPU的速度远远快于磁盘、网络等IO。在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件、发送网络数据时**,就需要等待IO操作完成,才能继续进行下一步操作。这种情况称为同步IO**。在IO操作的过程中,当前线程被挂起,而其他需要CPU执行的代码就无法被当前线程执行了。因为一个IO操作就阻塞了当前线程,导致其他代码无法执行,所以我们必须使用多线程或者多进程来并发执行代码,为多个用户服务。每个用户都会分配一个线程,如果遇到IO导致线程被挂起,其他用户
分类: 其他 发布时间: 01-27 23:32 阅读次数: 0

Python学习--协程

协程,又称微线程,纤程。英文名Coroutine。协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回
分类: 其他 发布时间: 01-27 23:31 阅读次数: 0