Python学习
文章平均质量分 67
深海大大
这个作者很懒,什么都没留下…
展开
-
Leetcode刷题--654. 最大二叉树
题解参考链接:https://labuladong.gitbook.io/algo/shu-ju-jie-gou-xi-lie/shou-ba-shou-shua-er-cha-shu-xun-lian-di-gui-si-wei/er-cha-shu-xi-lie-2这边用Python的话,可以取巧很多。给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:二叉树的根是数组 nums 中的最大元素。左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树原创 2021-02-05 16:09:33 · 233 阅读 · 1 评论 -
Python学习--二叉树
先进入到git学习,然后开始Flask学习先。https://www.cnblogs.com/sfencs-hcy/p/10341449.html转载 2021-01-16 18:17:23 · 75 阅读 · 0 评论 -
Python学习--快排
def partition(arr, low, high): # 移动值设置 i = low - 1 # 参考值设置 pivot = arr[high] for j in range(low, high): # 这里的判断比基准值小就交换i和j if arr[j] <= pivot: i = i + 1 arr[i], arr[j] = arr[j], arr[i] # 最后还有基准值没有判断,i + 1对应的值一定比基准值大 arr[i + 1], arr[high]原创 2021-01-15 21:29:07 · 138 阅读 · 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转载 2021-01-15 00:04:02 · 124 阅读 · 0 评论 -
Python学习--async/await
用asyncio提供的@asyncio.coroutine可以把一个generator标记为coroutine类型,然后在coroutine内部用yield from调用另一个coroutine实现异步操作。为了简化并更好地标识异步IO,从Python 3.5开始引入了新的语法async和await,可以让coroutine的代码更简洁易读。请注意,async和awit是针对coroutine的新语法,要使用新的语法,只需要做两步简单的替换:把@asyncio.coroutine替换为async;转载 2021-01-15 00:04:39 · 129 阅读 · 0 评论 -
Python学习--asyncio
asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持。asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。用asyncio实现Hello world代码如下:import asyncio@asyncio.coroutinedef hello(): print('Hello world!') # 异步调用asyncio.sleep(1): r转载 2021-01-15 00:04:34 · 128 阅读 · 0 评论 -
Python学习--协程
协程,又称微线程,纤程。英文名Coroutine。协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回转载 2021-01-15 00:04:29 · 162 阅读 · 1 评论 -
Python学习--异步IO
在IO编程一节中,我们已经知道,CPU的速度远远快于磁盘、网络等IO。在一个线程中,CPU执行代码的速度极快,然而,一旦遇到IO操作,如读写文件、发送网络数据时**,就需要等待IO操作完成,才能继续进行下一步操作。这种情况称为同步IO**。在IO操作的过程中,当前线程被挂起,而其他需要CPU执行的代码就无法被当前线程执行了。因为一个IO操作就阻塞了当前线程,导致其他代码无法执行,所以我们必须使用多线程或者多进程来并发执行代码,为多个用户服务。每个用户都会分配一个线程,如果遇到IO导致线程被挂起,其他用户转载 2021-01-15 00:04:24 · 227 阅读 · 0 评论 -
Python学习--使用模板
Web框架把我们从WSGI中拯救出来了。现在,我们只需要不断地编写函数,带上URL,就可以继续Web App的开发了。但是,Web App不仅仅是处理逻辑,展示给用户的页面也非常重要。在函数中返回一个包含HTML的字符串,简单的页面还可以,但是,想想新浪首页的6000多行的HTML,你确信能在Python的字符串中正确地写出来吗?反正我是做不到。(哈哈哈,引出了模板的必要性)俗话说得好,不懂前端的Python工程师不是好的产品经理。有Web开发的经验的同学都明白,Web App最复杂的部分就在HTML页转载 2021-01-15 00:04:17 · 262 阅读 · 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转载 2021-01-14 21:17:24 · 116 阅读 · 0 评论 -
Python学习-WSGI接口
了解了HTTP协议和HTML文档,我们其实明白了一个Web应用的本质就是:浏览器发送一个HTTP请求;服务器收到请求,生成一个HTML文档;服务器把HTML文档作为HTTP响应的Body发送给浏览器;浏览器收到HTTP响应,从HTTP Body取出HTML文档并显示。所以,最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。Apache、Nginx、Lighttpd等这些常见的静态服务器就是干这件事情的。如果要动态生成HT转载 2021-01-14 17:20:20 · 1481 阅读 · 0 评论 -
Python学习--单元测试
如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。比如对函数abs(),我们可以编写以下几个测试用例:输入正数,比如1、1.2、0.99,期待返回值与输入相同;输入负数,比如-1、-1.2、-0.99,期待返回值与输入相反;输入0,期待返回0;输入非数值类型,比如None、[]、{},期待抛出TypeError。把上面的测试用例放到一个测试模块里,就是一个完整的单转载 2021-01-14 16:36:11 · 244 阅读 · 0 评论 -
Python学习--正则表达式
字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用。正则表达式是一种用来匹配字符串的强有力的武器。他的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。所以我们判断一个字符串是否是合法的Email的方法是:创建一个匹配Email的正则表达式;用该正则表达式去匹转载 2021-01-14 16:35:06 · 130 阅读 · 0 评论 -
Python学习--分布式进程
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。举个例子:如果我们已经有一个通过Queue转载 2021-01-14 16:36:50 · 121 阅读 · 0 评论 -
Python学习--进程 vs 线程
我们介绍了多进程和多线程,这是实现多任务最常用的两种方式。现在,我们来讨论一下这两种方式的优缺点。首先,要实现多任务,通常我们会设计Master-Worker模式,Master负责分配任务,Worker负责执行任务,因此,多任务环境下,通常是一个Master,多个Worker。如果用多进程实现Master-Worker,主进程就是Master,其他进程就是Worker。如果用多线程实现Master-Worker,主线程就是Master,其他线程就是Worker。多进程模式最大的优点就是稳定性高,因为转载 2021-01-14 16:36:45 · 122 阅读 · 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转载 2021-01-14 16:36:41 · 177 阅读 · 0 评论 -
Python学习--多线程
多任务可以由多进程完成,也可以由一个进程内的多线程完成。我们前面提到了进程是由若干线程组成的,一个进程至少有一个线程。由于线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数情况下,我们只需要使用threading这个高转载 2021-01-14 16:36:34 · 208 阅读 · 0 评论 -
Python学习--多进程
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识。Unix/Linux操作系统提供了一个fork()系统调用,(亲切!!),它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用ge转载 2021-01-14 16:36:28 · 106 阅读 · 0 评论 -
Python学习--进场和线程
很多同学都听说过,现代操作系统比如Mac OS X, UNIX,Linux,Windows等,都是支持“多任务”的操作系统。什么叫“多任务”呢?简单地说,就是操作系统可以同事运行多个任务。打个比方,你一边在用浏览器上网,一边在听MP3,一边在用Word赶作业,这就是多任务,至少同时有3个任务正在运行。还有很多任务悄悄地在后台同时运行着,只是桌面上没有显示而已。现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的转载 2021-01-13 19:53:10 · 96 阅读 · 0 评论 -
Python学习--序列化
在程序运行的过程中,所有的变量都是在内存中,比如,定义一个dict:d = dict(name='Bob', age=20, score=88)可以随时修改变量,比如把name改成’Bill’,但是一旦程序结束,变量所占用的内存就被操作系统全部回收。如果没有把修改后的’Bill’存储到磁盘上,下次重新运行程序,变量又被初始化为’Bob’。我们把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,转载 2021-01-13 19:43:23 · 148 阅读 · 0 评论 -
Python学习--操作文件和目录
如果我们要操作文件、目录,可以在命令行下面输入操作系统提供的各种命令来完成。比如dir、cp等命令。如果要在Python程序中执行这些目录和文件的操作怎么办?其实操作系统提供的命令只是简单地调用了操作系统提供的接口函数,Python内置的os模块也可以直接调用操作系统提供的接口函数。打开Python交互式命令行,我们来看看如何使用os模块的基本功能:>>> import os>>> os.name # 操作系统类型'posix'如果是posix,说明系统是L转载 2021-01-13 17:04:02 · 195 阅读 · 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转载 2021-01-13 16:41:55 · 121 阅读 · 0 评论 -
Python学习--文件读写
读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都是由操作系统提供的。现代操作系统不允许普通的程序直接操作磁盘,所以,读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文件对象中读取数据(读文件),或者把数据写入这个文件对象(写文件)。读文件要以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标识符:(简单,学过Unix环境程序设计)转载 2021-01-13 16:34:23 · 107 阅读 · 0 评论 -
Python学习--IO编程
因为对更多内容的渴望,已经想迫切地学完Python基础知识,进到Flask框架的学习中,测试就先跳过了,等以后碰到了再回头看,这边正式进到IO编程中。定义IO再计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留的,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据转载 2021-01-13 16:14:30 · 76 阅读 · 0 评论 -
Python学习--调试
程序能一次写完并正常运行的概率很小,基本不超过1%。总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。第一种方法简单直接粗暴有效,就是用print()把可能有问题的变量打印出来看看:def foo(s): n = int(s) print('>>>n = %d' % n) return 10 / ndef main(): foo(转载 2021-01-13 15:52:17 · 91 阅读 · 1 评论 -
Python学习--错误处理
在程序运行的过程中,如果发生了错误。可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因。在操作系统提供的调用中,返回错误码非常常见。比如打开文件的函数open(),成功时返回文件描述符(就是一个整数),出错时返回-1。用错误码来表示是否出错十分不便,因为函数本身应该返回的正常结果和错误码混在一起,造成调用者必须用大量的代码来判断是否出错:(写过c,深有感知)def foo(): r = some_function() if r == -1: return -1 return转载 2021-01-13 15:22:09 · 165 阅读 · 0 评论 -
Python学习--错误、调试和测试
作为引导页在程序运行过程中,总会遇到各种各样的错误。有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的。有的错误是用户输入造成的,比如让用户输入email地址,结果得到一个空字符串,这种错误可以通过检查用户输入来做相应的处理。还有一类错误是完全无法在程序运行过程中预测的,比如写入文件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络突然断掉了。这类错误也称为异常,在程序中通常是必须处理的,否则,程序会因为各种问题终止并退出。P转载 2021-01-13 14:14:11 · 77 阅读 · 0 评论 -
Python学习--使用元类
type()动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的。比方说我们要定义一个Hello的class,就写一个hello.py模块:class Hello(object): def hello(self, name='world'): print('Hello, %s.' % name)当Python解释器载入hello模块时,就会依次执行该模块的所有语句,执行结果就是动态创建出一个Hello的class对象,测试如下:>>>转载 2021-01-13 01:33:39 · 106 阅读 · 1 评论 -
Python学习--使用枚举类
当我们需要定义常量,一个办法是用大写变量通过整数来定义,例如月份:JAN = 1FEB = 2MAR = 3...NOV = 11DEC = 12好处是简单,缺点是类型是int,并且仍然是变量。更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python提供了Enum类来实现这个功能:from enum import EnumMonth = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May'转载 2021-01-12 21:41:07 · 174 阅读 · 0 评论 -
Python学习--定制类
看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。__slots__我们已经知道怎么用了,len()方法我们也知道是为了能让class作用于len()函数。除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类。str我们先定义一个Student类,打印一个实例:class Student(object): def __init__(self, name): self.name = name>&转载 2021-01-12 21:07:55 · 167 阅读 · 0 评论 -
Python学习--多重继承
继承是面向对象编程的一个重要方式,因为通过继承,子类就可以扩展父类的功能。回忆以下Animal类层次的设计,假设我们要实现以下4中动物:Dog - 狗狗;Bat - 蝙蝠;Parrot - 鹦鹉;Ostrich - 鸵鸟。如果按照哺乳动物和鸟类归类,我们可以设计出这样的类的层次: ┌───────────────┐ │ Animal │ └───────────────┘转载 2021-01-12 17:55:07 · 114 阅读 · 0 评论 -
Python学习--使用@property
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:s = student()s.score = 9999这显然不符合逻辑。为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,再set_score()方法里,就可以检查参数:class Student(object): def get_score(self): return self._score def se转载 2021-01-12 17:29:37 · 121 阅读 · 1 评论 -
Python学习--使用__slots__
正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性。先定义classclass Student(object): pass然后,尝试给实例绑定一个属性:>>> s = Student()>>> s.name = 'Michael' # 动态给实例绑定一个属性>>> print(s.name)Michael还可以尝试给实例绑定一个方法:>>&g转载 2021-01-12 17:04:43 · 86 阅读 · 0 评论 -
Python学习--实例属性和类属性
由于Python是动态语言,根据类创建的实例可以任意绑定属性。给实例绑定属性的方法是通过实例变量,或者通过self变量:class Student(object): def __init__(self, name): self.name = names = Student('Bob')s.score = 90但是,如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类素有class Student(object): name转载 2021-01-12 16:51:33 · 123 阅读 · 0 评论 -
Python学习--获取对象信息
当我们拿到一个对象的引用时,如果想知道这个对象时什么类型、有哪些方法呢?使用type()首先,我们来判断对象类型,使用type()函数:基本类型都可以用type()判断:>>> type(123)<class 'int'>>>> type('str')<class 'str'>>>> type(None)<type(None) 'NoneType'>如果一个变量指向函数或者类,也可以用type()转载 2021-01-12 16:30:57 · 86 阅读 · 0 评论 -
Python学习--继承和多态
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(subclass),而被继承的class称为基类,父类或超类(Base class、Super class)。比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印:class Animal(object): def run(self): print('Animal is running...')当我们需要编写Dog和Cat类时,就可以直接从Animal类转载 2021-01-12 16:08:19 · 106 阅读 · 0 评论 -
Python学习--访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑。但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的name、score属性:>>> bart = Student('Bart Simpson', 59)>>> bart.score59>>> bart.score = 99>>> bart.score99如果要让内部属性不被外部转载 2021-01-14 16:35:26 · 265 阅读 · 0 评论 -
Python学习--类和实例
定义面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例时根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。仍以Student类为例,在Python中,定义类时通过class关键字:class Student(object): passclass后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是**(object), 表示该类是从哪个类继承下来的。通常,如果没有合适的继承类转载 2021-01-12 15:48:39 · 95 阅读 · 0 评论 -
Python学习--面向对象编程
定义面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来减低系统的复杂度。而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传转载 2021-01-11 23:01:02 · 60 阅读 · 0 评论 -
Python学习--安装第三方模块
在Python中,安装第三方模块,是通过包管理工具pip完成的。如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了。如果你正在使用Windows,请参考安装Python一节的内容,确保安装时勾选了pip和Add python.exe to Path。在命令提示符窗口下尝试运行pip,如果Windows提示未找到命令,可以重新运行安装程序添加pip。注意:Mac或Linux上有可能并存Python 3.x和Python 2.x,因此对应的pip命令是pip3。例如,我们要安装一个第转载 2021-01-11 22:37:51 · 89 阅读 · 0 评论