想学习web框架,又想熟悉python,问题来了,有没有极简的数据来支撑快速开发,特来研究
不能去研究几十个,没时间,研究主流的即可
Django、Tornado、Flask、Twisted。
在目前Python语言的几十个开发框架中,几乎所有的全栈网络框架都强制或引导开发者使用MVC架构开发Web应用。所谓全栈网络框架,是指除了封装网络和线程操作,还提供HTTP栈、数据库读写管理、HTML模板引擎等一系列功能的网络框架。本文重点讲解的Django、Tornado和Flask是全栈网络框架的典型标杆;而Twisted更专注于网络底层的高性能封装而不提供HTML模板引擎等界面功能,所以不能称之为全栈框架。
MVC(Model-View-Controller)模式最早由Trygve Reenskaug在1978年提出,在20世纪80年代是程序语言Smalltalk的一种内部架构。后来MVC被其他语言所借鉴,成为了软件工程中的一种软件架构模式。MVC把Web应用系统分为3个基本部分。
模型(Model):用于封装与应用程序的业务逻辑相关的数据及对数据的处理方法,是Web应用程序中用于处理应用程序的数据逻辑的部分,Model只提供功能性的接口,通过这些接口可以获取Model的所有功能。Model不依赖于View和Controller,它们可以在任何时候调用Model访问数据。有些Model还提供了事件通知机制,为在其上注册过的View或Controller提供实时的数据更新。
视图(View):负责数据的显示和呈现,View是对用户的直接输出。MVC中的一个Model通常为多个View提供服务。为了获取Model的实时更新数据,View应该尽早地注册到Model中。
控制器(Controller):负责从用户端收集用户的输入,可以看成提供View的反向功能。当用户的输入导致View发生变化时,这种变化必须是通过Model反映给View的。在MVC架构下,Controller一般不能与View直接通信,这样提高了业务数据的一致性,即以Model作为数据中心。
这3个基本部分互相分离,使得在改进和升级界面及用户交互流程时,不需要重写业务逻辑及数据访问代码。MVC架构如图1所示。
-----------------------------------------1、Django 企业级开发框架
Django于2003年诞生于美国堪萨斯(Kansas)州,最初用来制作在线新闻Web站点,于2005年加入了BSD许可证家族,成为开源网络框架。Django根据比利时的爵士音乐家Django Reinhardt命名,作者这样命名Django意味着Django能优雅地演奏(开发)功能丰富的乐曲(Web应用)。
它是当前Python世界里最负盛名且最成熟的网络框架。最初用来制作在线新闻的Web站点,目前已发展为应用最广泛的Python网络框架。Django的各模块之间结合得比较紧密,所以在功能强大的同时又是一个相对封闭的系统,但是其健全的在线文档及开发社区,使开发者在遇到问题时能找到解决方法。
相对于Python的其他Web框架,Django的功能是最完整的,Django定义了服务发布、路由映射、模板编程、数据处理的一整套功能。这也意味着Django模块之间紧密耦合,开发者需要学习Django自己定义的这一整套技术。Django的主要特点如下。
完善的文档:经过10多年的发展和完善,Django有广泛的应用和完善的在线文档,开发者遇到问题时可以搜索在线文档寻求解决方案。
集成数据访问组件:Django的Model层自带数据库ORM组件,使开发者无须学习其他数据库访问技术(dbi、SQLAlchemy等)。
强大的URL映射技术:Django使用正则表达式管理URL映射,因此给开发者带来了极高的灵活性。
后台管理系统自动生成:开发者只需通过简单的几行配置和代码就可以实现完整的后台数据管理Web控制台。
错误信息非常完整:在开发调试过程中如果出现运行异常,则Django可以提供非常完整的错误信息帮助开发者定位问题,比如缺少xxx组件的配置引用等,这样可以使开发者马上改正错误。
Django的组成结构
Django是遵循MVC架构的Web开发框架,其主要由以下几部分组成。
管理工具(Management):一套内置的创建站点、迁移数据、维护静态文件的命令工具。
模型(Model):提供数据访问接口和模块,包括数据字段、元数据、数据关系等的定义及操作。
视图(View):Django的视图层封装了HTTP Request和Response的一系列操作和数据流,其主要功能包括URL映射机制、绑定模板等。
模板(Template):是一套Django自己的页面渲染模板语言,用若干内置的tags和filters定义页面的生成方式。
表单(Form):通过内置的数据类型和控件生成HTML表单。
管理站(Admin):通过声明需要管理的Model,快速生成后台数据管理网站。
是一个全能型框架。目前 Django 的使用面还是很广的,有学习的价值,但是不建议初学者学习,因为要学习的东西太多了,一下子难以吸收会失去兴趣。当然,Django 的目的是为了让开发者能够 快速 地开发一个网站,它提供了很多模块,其中我最喜欢的就是 admin 模块,http://your.site.com/admin 就进入了网站的后台(内置的哦~)方便地对数据进行操作,等等。。。。因此,如果对 Django 熟悉的话,papapa 一下子就写好一个网站的原型了。
-----------------------------------------2、Tornado 高并发处理框架
Tornado是使用Python编写的一个强大的可扩展的Web服务器。它在处理高网络流量时表现得足够强健,却在创建和编写时有着足够的轻量级,并能够被用在大量的应用和工具中。Tornado作为FriendFeed网站的基础框架,于2009年9月10日发布,目前已经获得了很多社区的支持,并且在一系列不同的场合中得到应用。除FriendFeed和Facebook外,还有很多公司在生产上转向Tornado,包括Quora、Turntable.fm、Bit.ly、Hipmunk及MyYearbook等。
相对于其他Python网络框架,Tornado有如下特点。
完备的Web框架:与Django、Flask等一样,Tornado也提供了URL路由映射、Request上下文、基于模板的页面渲染技术等开发Web应用的必备工具。
是一个高效的网络库,性能与Twisted、Gevent等底层Python框架相媲美:提供了异步I/O支持、超时事件处理。这使得Tornado除了可以作为Web应用服务器框架,还可以用来做爬虫应用、物联网关、游戏服务器等后台应用。
提供高效HTTPClient:除了服务器端框架,Tornado还提供了基于异步框架的HTTP客户端。
提供高效的内部HTTP服务器:虽然其他Python网络框架(Django、Flask)也提供了内部HTTP服务器,但它们的HTTP服务器由于性能原因只能用于测试环境。而Tornado的HTTP服务器与Tornado异步调用紧密结合,可以直接用于生产环境。
完备的WebSocket支持:WebSocket是HTML5的一种新标准,实现了浏览器与服务器之间的双向实时通信。
因为Tornado的上述特点,Tornado常被用作大型站点的接口服务框架,而不像Django那样着眼于建立完整的大型网站,所以本章着重讲解Tornado的异步及协程编程、身份认证框架、独特的非WSGI部署方式。
传说中性能高高的框架。Tornado 是一个很好的框架,支持异步处理的功能,这是它的特点,其他框架不支持。另外一点是,Tornado 的设计似乎更注重 RESTful URL。但 Tornado 提供了网站基本需要使用的模块外,剩下的则需要开发者自己进行扩展。例如数据库操作,虽然内置了一个 database 的模块(后来独立出去了,现在叫做 torndb,bdarnell/torndb · GitHub)但是不支持 ORM,快速开发起来还是挺吃力的。如果需要 ORM 支持的话,还需要自己写一层将 SQLAlchemy 和 Tornado 联系起来,而且这里还有一个坑。
BTW:知乎就是基础 Tornado 开发的。
-----------------------------------------3、Flask 支持快速建站
Flask是Python Web框架族里比较年轻的一个,于2010年出现,这使得它吸收了其他框架的优点,并且把自己的主要领域定义在了微小项目上。同时,它是可扩展的,Flask让开发者自己选择用什么数据库插件存储他们的数据。很多功能简单但性能卓越的网站就是基于Flask框架而搭建的,比如http://httpbin.org/就是一个功能简单但性能强大的HTTP测试项目。Flask是一个面向简单需求和小型应用的微框架。
相对于其他Python语言的Web框架而言,Flask的特点可以归结如下。
内置开发服务器和调试器
网络程序调试是在将编制好的网站投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。有经验的开发者都知道,这是保证网站系统能够正式应用的必要步骤。
Flask 自带的开发服务器使开发者在调试程序时无须再安装其他任何网络服务器,比如Tomcat、JBoss、Apache等。Flask默认处于调试状态,使得运行中的任何错误会同时向两个目标发送信息:一个是Python Console,即启动Python程序的控制台;另一个是HTTP客户端,即Flask开发服务器将调试信息传递给了客户端。
与Python单元测试功能无缝衔接
单元测试是对最小软件开发单元的测试,其重点测试程序的内部结构,主要采用白盒测试方法,由开发人员负责。单元测试的主要目标是保证函数在给定的输入状态下,能够得到预想的输出,在不符合要求时能够提醒开发人员进行检查。
Flask提供了一个与Python自带的单元测试框架unitest无缝衔接的测试接口,即Flask对象的test_client()函数。通过test_client()函数,测试程序可以模拟进行HTTP访问的客户端来调用Flask路由处理函数,并且获取函数的输出来进行自定义的验证。
使用Jinja2模板
将HTML页面与后台应用程序联系起来一直是网站程序框架的一个重要目标。Flask通过使用Jinja2模板技术解决了这个问题。Jinja2是一个非常灵活的HTML模板技术,它是从Django模板发展而来的,但是比Django模板使用起来更加自由且更加高效。Jinja2模板使用配制的语义系统,提供灵活的模板继承技术,自动抗击XSS跨站攻击并且易于调试。
完全兼容WSGI 1.0标准
WSGI(Web Server Gateway Interface)具有很强的伸缩性且能运行于多线程或多进程环境下,因为Python线程全局锁的存在,使得WSGI的这个特性至关重要。WSGI已经是Python界的一个主要标准,各种大型网路服务器对其都有良好的支持。WSGI位于Web应用程序与Web服务器之间,与WSGI完全兼容使得Flask能够配置到各种大型网络服务器中。
基于Unicode编码
Flask是完全基于Unicode的。这对制作非纯ASCII字符集的网站来说非常方便。HTTP本身是基于字节的,也就是说任何编码格式都可以在HTTP中传输。但是,HTTP要求在HTTP Head中显式地声明在本次传输中所应用的编码格式。在默认情况下,Flask会自动添加一个UTF-8编码格式的HTTP Head,使程序员无须担心编码的问题。
-----------------------------------------4、Twisted 底层自定义协议框架
以上讲到的3个Python Web框架都是围绕着应用层HTTP展开的,而Twisted是一个例外。Twisted是一个用Python语言编写的事件驱动的网络框架,对于追求服务器程序性能的应用,Twisted框架是一个很好的选择。
Twisted是一个有着10多年历史的开源事件驱动框架。Twisted支持很多种协议,包括传输层的UDP、TCP、TLS,以及应用层的HTTP、FTP等。对于所有这些协议,Twisted提供了客户端和服务器方面的开发工具。
Twisted框架的历史悠久,其主要发行版本都以Python 2为基础,最新的版本为基于Python 2.7的Twisted-15.4.0。Twisted社区正在开发基于Python 3的版本,但目前为止尚没有基于Python 3的Twisted稳定发行版。
Twisted是一个高性能的编程框架。在不同的操作系统平台上,Twisted利用不同的底层技术实现了高效能通信。在Windows中,Twisted的实现基于I/O完成端口(IOCP,Input/Output Completion Port)技术,它保证了底层高效地将I/O事件通知给框架及应用程序;在Linux中,Twisted的实现基于epoll技术,epoll是Linux下多路复用I/O接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。
在开发方法上,Twisted引导程序员使用异步编程模型。Twisted提供了丰富的Defer、Threading等特性来支持异步编程。
之所以说这是一款非常独特的框架,主要是因为它的简单性和功能强大的开发能力。你可以用Python语言舒舒服服地编写web应用程序。你会因为它的零局限性和易用性喜欢上web.py。有些程序员可能会发现它对功能的限制比较少,因为它预留了整合的空间,所以你不必一下子加载所有的功能,尤其是那些你并不需要的。
web2py最重要的因素是其外部零依赖,可以创建、复原、管理和修改在浏览器中的应用程序。对于一些简单的web开发任务,大部分都可以自动化快速开发。程序员甚至不需要再准备单一的开发、调试、测试、部署和数据库处理的封装包。内置的Web界面中这些都有,在使用之前也不需要进行安装。
Bottle
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
下面是个大佬对flask和django的对比,
作者:无与童比
链接:https://www.zhihu.com/question/20706333/answer/661072298
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
只推荐 Flask/Django 顺便 从整体设计,路由设计,应用模块化设计,配置等方面比较一下这两个框架
2019 年 4 月 23 日,我来更新一下
请允许我慢慢道来。目录如下
一、整体设计 : section
二、路由设计 : section
三、应用模块化 : section
四、配置 : section
五、文档 : section
六、社区 : section
▼ 七、对 Django 的误解 : section
误解 1. Django 应用比 Flask 应用重 : section
误解 2. Flask 代码比 Django 代码优雅 : section
误解 3. Django 不容易扩展 : section
八、对新手的建议 : section
直观感受是:
Flask 怎么定位自己的?
将自己定位为微框架。啥叫微框架,就是毛坯房的意思。给你个毛胚房,你自己装修去。
Django 怎么定位标榜自己的?
划重点 The web framework for perfectionists with deadlines. 完美主义者的 Deadline 终结框架
定位不同,就会导致设计上和功能上的倾向性。
假如你和我一样是先用 Django 这种给你准备了大量方便工具的框架。当你切换到 Flask 的时候,明显会感觉到的问题是:
不但失去了铠甲,还多了很多根软肋。
Flask 只是一个微框架。要做你自己组装去。
当然,我并不是在否定 Flask, 功能少某种程度上不是框架的缺点,而是使用者的缺点。笑....
如果你是进阶的玩家,你可能更喜欢 DIY 一些
路由设计上,从使用者的角度来说,更喜欢 Flask 一些,因为可以随用随定义。
from flask import Flask
app = Flask(__name__)
@app.route('/') # 不使用蓝图
def hello():
return 'Hello, World!'
bp = CustomBlueprint("user", __name__, url_prefix="/user")
@bp.get('/') # 使用自定义的蓝图
def hello_bp()
return 'Hello bp'
Flask 可以依据蓝图注册不同 errorhandler/beforerequest 等钩子 这确实超级方便
Django 就没那么灵活了。但通过 middleware 也能做
代码组织的好的话,两者差距不是很大。
假设我设计一个应用叫做 shamate, 这个应用可能要对接多方面接口:
使用 flask 的时候,一个这样的应用,文件结构应该是这样的。
shamate
apps # 通过 blueprint 切分模块
company
views.py
user
views.py
admin
views.py
models
service
tasks.py
__init__.py
app.py
db.py
helpers.py
settings.py
worker.py
嗯,被老大 Flask 大牛带了一段时间之后,切分 django 是这么切分的
em..... 非常的 flasky
shamate
core
auth.py
db.py
tasks.py
models.py
company # 通过 django app 切分模块
view.py
urls.py
user
store
__init__.py
celery.py
logging.py
m.py
settings.py
urls.py
wsgi.py
需要注意的是,Django 的在 Models 里面设置的时候务必显式写上 table 名
class Order(Model):
# your fields
class Meta:
db_table = "order"
Django 模块如果涉及到业务的 Model, 一般很难通用,但如果要写通用的 Tag 系统 Attachment 系统,则,一般性能可能不太跟得上。如果不在意性能的话,建议 Folk 一份开源库,方便后期修改。
参考上面的结构,你应该能看出来,配置其实相差不是很大。主要区分 local/stage/test/prod 环境即可。
Django 是看了文档就能撸一个不错的项目出来。在不断学习的过程中,参考社区最佳实践。慢慢的撸一套自己的标准。
Flask 则是...... 需要更多的参考社区最佳实践。
扩展都挺多的。但建议涉及到业务逻辑的扩展,直接 cv 到项目中。这样方便后期定制。
Django 社区里面东西满多的, 举个例子, 我的文章里介绍过
无与童比:这几招,让你快速提升 Python 项目的性能zhuanlan.zhihu.com正在上传…重新上传取消
在使用 Django 项目的时候,我必须要安装的第三方库就是 djangodebugtools
这个工具用起来有多舒服呢?
可以直接 Profile SQL 语句
甚至可以直接 explain sql 以及 查看缓存情况
这方面的话, 推荐两本书, 他们推荐的第三方库都是不错的.
@胡阳
至于 Flask 则推荐官方的链接
Flask (A Python Microframework)flask.pocoo.org
包含了社区质量相对高的包.
比如 Form的处理/Admin的处理/ORM/Alembic/RateLimit/Redis等等.
实际上不然,我接触的 Flask 项目都写成了自己的一套标准。
最后你发现你学的东西一点都没比 Django 少到哪里去。
Django 没那么难扩展。
都学,先 Django, 后 Flask
理由是,通过 Django 可以以最小成本的了解 Web 开发的点点滴滴,然后看工作项目是啥就认真研究啥。
之前觉得Django写起来很快的, 但被TL带了一段时间之后, 发现TL也能把flask app写的很快, 这还是取决于使用者的.
当然,如果有兴趣的话,可以通过我在专栏写的 Django 的文章来做个实战项目了解 Django 开发的点点滴滴
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&77
好的前端
https://www.jianshu.com/p/d062b209b669
flask 资源大全
https://www.liaoxuefeng.com/wiki/1016959663602400/1018138223191520
https://github.com/michaelliao/awesome-python3-webapp
senmantic-ui uikit3 http://www.getuikit.net/
matplotlib pandas numpy
scrapy
Gunicorn + Flask.
FLASK+sqlalchemy+flask scripts +flask migrate +marshmallow
Pyqt
-------------------------------------------------------------------心得篇
我学python web开发,是django -> web.py -> tornado -> bottle -> flask,现在团队内部使用的是基于flask的二次开发框架。
最初学django,因为随手搜一下python web开发框架,满屏都是讲django的,就学学咯。
后来觉得,太tmd重了。逆反心理作用下,就去看web.py了。
web.py其实挺不错的,可惜惊闻作者仙逝无人维护,心里一凉。刚好又听说tornado性能好、像web.py,学学也不坏。其实一直都喜欢这种非阻塞IO的高性能
后来接触到gevent,知道非阻塞IO还有更优雅的实现方式。而tornado确实不满足我内心对“简洁”的苛求,于是又一头栽进bottle这个简单到只有一个文件的库中,相见恨晚
后来朋友推荐flask,原因是极像bottle但对大项目组织支持更好,而且插件更多、生态更好。抱着试试的心态学起来。然后就用到现在了
只想推荐 web2py。
不要说这个框架很冷门,推荐flask 的大部分是没有做过真正项目的玩家而已。
因为真的很爽。
希望喜欢这个框架的人能点个赞。
我完整的把他的home 从头看到了尾,有些东西反复的去看,真的收获良多。
不过看个人爱好吧,和公司要求。
以上就是我的意见
用起来真的很舒服,哈哈。
动手撸框架
https://blog.csdn.net/Senssic/article/details/8724155
https://www.liaoxuefeng.com/wiki/897692888725344/955511252339904
http://www.bottlepy.org/docs/dev/index.html
学习,抄,自创
自己都试试呗,反正文档都很全,用了Django和Flask觉得Flask就是python版的springmvc,用起来不要太顺手!
Django大而全
Flask小而精
tonado性能高
几乎这几个占了市场的90以上吧
Django就像自动挡的汽车,做项目时框架已经帮你搞定了很多功能了
Flask像手动挡的,需要你时不时的配置,装第三方库,给你的支配权更多
tonador就像一个带了高级引擎的车架子,一切都需要自己搞起来
所以我推荐flask,入手难度适中,可支配权比较大,搭配gunicorn会更好哦
由于Python的简洁 易读 强大 高效 现在Python应用在文件处理、网络编程、数据库编程、游戏、Web开发、数据分析、机器学习等各个领域。
就Web开发而言,为了提高开发效率,应运而生了很多框架,如Django、Flask、Tornado、Web2py等。
框架很多,根据业务需求、选择适合的框架。
1、Django
最早接触Django,在我心中的形象是:Web框架界的变形金刚
Django的MVT架构、自带ORM、强大的Admin后台管理、自带数据库、还自带开发测试用的服务器、不得不说服务周到。
如此大而全,重量级的Django给开发者提供了超高的开发效率。
淌着Python血液
MVT三大轮子 连接浏览器 数据库开跑
一身装备 可变形 可扩展
多领域 跨平台 协调作战
自我测试 自我管理 自我保护
友好 开放 国际化
装备很多:
用户认证 缓存 日志 邮件 组织 分页 消息 序列化 会话 网站地图 静态文件处理 数据验证
Django支持第三方扩展:
比如:富文本编辑器 缓存 全文检索 celery等
Django项目布署 用nginx做静态资源代理、负载均衡 可以提高高并发能力。
一些Web项目开发 无论用户量、服务群体、上来总谈高并发。没用户 天天愁高并发问题 还没解决也许项目已经黄了。
项目有了、业务有了、用户有了、性能优化、高并发顺势解决嘛。
当然一些大型网站,在高性能的要求下,框架的各个部分往往都需要自己定制,这样用Django也就没有太大优势。
2、Falsk
相较于Django ,Falsk属于轻量级Web框架,也称‘microframework’。
Flask一个简单的核心,基于Werkzeug WSGI工具箱和Jinja2 模板引擎。其他功能开发者根据业务需求 与喜好 添加。
如此 Falsk 自由、灵活、可扩展性很强。很适用于开发小型应用、开发大型网站也没有压力,自己设计架构、选择合适第三方扩展,各方面性能完全不输Django。
常用拓展包:wtf、sqlalchemy、login、script、migrate、mail
3、Tornado
传说中实现高并发、高性能的框架。Tornado的全称是Torado Web Server,可用作Web服务器,同时也是一个Python Web的开发框架。
Tornado两大核心模块:
iostream :对非阻塞式的 socket 的简单封装,用来处理 socket 的异步读写
ioloop :核心的 I/O 循环。基于 epoll,可以高效的响应网络事
其作为Web框架的主要模块
web:包含了 Tornado 的大多数重要的功能
escape :XHTML, JSON, URL 的编码/解码方法
template :基于 Python 的 web 模板系统
httpserver : 非阻塞 HTTP server
httpclient : 异步 HTTP client 用来和web 及 httpserver 协同工作
auth :第三方认证的实现
locale:针对本地化和翻译的支持
等等
Tornado 走的少而精的路子,除了Web开发需要的基本模块,剩下的则都需要开发者自己扩展。比如需要ORM支持,那自己来扩展
Python web框架很多,在于精通。选择适合自己的,开始搞起来。
我做项目用的多的还是Django,不自己重复造车轮子嘛。
***关于框架选择的误区
1. 哪个框架最好——世上没有最好的框架,只有最适合你自己、最适合你的团队的框架。编程语言选择也是一个道理,你的团队Python最熟就用Python好了,如果最熟悉的是Ruby那就用Ruby好了,编程语言、框架都只是工具,能多、快、好、省的干完活就是好东西。
2. 过分关注性能——其实大部分人是没必要太关心框架的性能的,因为你开发的网站根本就是个小站,能上1万的IP的网站已经不多了,上10万的更是很少很少。在没有一定的访问量前谈性能其实是没有多大意义的,因为你的CPU和内存一直就闲着呢。而且语言和框架一般也不会是性能瓶颈,性能问题最常出现在数据库访问和文件读写上。 PHP的Zend Framework是出了名的慢,但是Zend Framework一样有大站,如:digg.com;常被人说有性能问题的Ruby和Rails,不是照样可以开发出twitter吗?再者现在的硬 件、带宽成本其实是很低的,特别有了云计算平台后,人力成本才是最贵的,没有上万的IP根本就不用太在意性能问题,流量上去了花点钱买点服务器空间好了, 简单快速的解决性能问题。
下面是在逛CSDN每天都被灌的鸡汤,总结一下缺养时可以补补:
编程之久除了算法和数据结构,什么也不属于我们。
编程就是算法和数据结构,算法和数据结构是编程的灵魂。
编程中最没用的东西是源代码,最有用的东西是算法和数据结构。
算法和数据结构是程序的第一秘诀,缺之算法和数据结构是编程的最大原因。
算法和数据结构就是编程的一个重要部分,你若失掉了算法和数据结构,你就把一切都失掉了。
尽管少写那么多代码,但省下来的时间又在哪里呢?
代码是程序员的朋友,虽然没有热情,但是非常忠实。
当你还不能写出自己满意的程序时,你就不要去睡觉。
有些代码不应该被忘记,也没有源代码不应该被记住。
对代码不满足,是任何真正有天才的程序员的根本特征。
有编过程的人的代码,比那些无知的人使用的软件更有价值。
编程是一种美德,是促使一个人不断向上发展的一种原动力。
程序员的一生时间90%是用在编程上,而剩余的10%是活在世界上。
程序员之所以犯错误,不是因为他们不懂,而是因为他们自以为什么都懂。
调试的错误就是编程给你最好的东西,因为在每个错误上面都标志着前进的一步。
假如编程易懂得,那么程序员就不会热情地写出注释,也不会有得到编程的快乐。
代码是最为耐心、最能忍耐和最令人愉快的伙伴,在任何艰难困苦的时刻,它都不会抛弃你
# -*- coding: utf-8 -*-
import itertools
from functools import lru_cache
# 列表实现。生成一个斐波那契数列列表
def fibo(num):
fibo_list = []
if num <= 0:
return fibo_list
else:
x, y = 0, 1
for i in range(num):
fibo_list.append(y)
x, y = y, x + y
return fibo_list
# 生成器实现。迭代时一次生成一个值
def fibo_genetator():
x, y = 0, 1
while True:
yield y
x, y = y, x + y
# 递归实现。[添加缓存装饰器,提高效率]
@lru_cache(maxsize=None)
def fibo_recursive(num):
if num < 0:
return 0
if num <= 1:
return num
return fibo_recursive(num - 1) + fibo_recursive(num - 2)
print(fibo(10))
print(list(itertools.islice(fibo_genetator(), 10)))
print([fibo_recursive(i) for i in range(1, 11)])
递归实现 使用缓存后 效率便会极大提升