Q&A丨关于 Python 入门的一些问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Q&A丨关于 Python 入门的一些问题相关的知识,希望对你有一定的参考价值。

技术分享图片
Q:用 python 能够做什么?解决什么问题?

A1:理论上来说,计算机能做什么,python 语言就能让它做什么,也即 python能做什么。

数值计算、机器学习、爬虫、云相关开发、自动化测试、运维自动化、web开发、poc脚本、网络编程等

A2:根据TIOBE的公开资料,Python 作为世界上第五大编程语言,应用十分广泛。 从Web后台开发到大数据处理;从自动化测试到运维开发Python都是兵器谱的前三名。

Web开发:国内著名的豆瓣、知乎都是用 Python 作为主力语言编写的网站,在很多公司内部,很多 Web 化的工具也都是Powered by Flask、Django

大数据处理:从编写 MapReduce 到各种统计工作,从 PySpark 到 Notebook,不会 Python,你很难踏入大数据的殿堂半步。

自动化测试:从各种 Test case 的编写,到测试自动化系统的构建。拥有几乎所有的测试库(Selenium、UT)支持的Python,一直是测试大神的首选。

运维开发:Bash功能太弱、Perl又那么晦涩,几乎所有的Linux发行版都把 Python作为默认安装。无论是 OpenStack 这样的巨无霸、还是各种运维自动化小系统、小工具。

Q:应该学习最新版本的 Python 3 还是旧版本的Python 2.7?

A1:似乎每个学 python 的初学者都喜欢问这个问题,我当初也一样。反过来想想,为什么问这个问题的都是初学者呢?没见过玩 python 很资深的人问版本的问题。总结下我理解的原因

(1):对学习 python 没有安全感,担心学错了版本,用不上白学了。 这点焦虑大可不必。python2,3 确实有区别,但作为初学者,打好基础才是最重要的,还没到考虑区别的阶段

(2):关于 python2.7 和 python3.0 的使用范围的担心。目前是有一些公司生产环境用 python3,但 python2.7 目前仍然是主流。不用担心学了2.7找不到工作

抛开上面的焦虑,如果要学习就选择资料最多,最容易上手的版本来学,坦白讲目前能找到的资料。python2.7是最多的,遇到问题搜到的答案也最多。

A2:自己玩或者学习,可以选择 Python3.X,毕竟新东西是趋势。

如果是公司重要项目,选择 Python2.7 稳重,如果是不太重要的可以选择用新版本

注意:

语言是人和机器的沟通工具,目的也是表达你的意思给计算机,不管是 Python2.X 还是Python3.X 都行,需要重点了解人如何让机器按照自己的意识去工作(思路、想法)

A3:先强调一点,Python2 和Python3 的差别,大概俩小时就可以完全掌握,所以版本并不是重要问题。

如果一定要选一个版本,看你现在或者以后要去的公司,用的什么版本,你就学什么版本。

如果没有明确的目标,现在开始学的话,建议从 Python3 开始学,虽然我也一直用2.7,但是以后的潮流还是 Python3 的世界。

举个例子,就像刚开始学打dota的时候,不要纠结于你的电脑CPU是i5还是i7的,都是好东西,而且之间的差别对新手并没有影响。

最怕的就是纠结于选择i5还是i7,纠结了一个月,还没有开始启动dota,最终只能看别人超神,自己继续纠结。

Q:怎么理解Python中的filter?应用于什么场景?

A1:Python 内建的 filter()函数用于过滤序列。

和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

例如,在一个list中,删掉偶数,只保留奇数,可以这么写:

def is_odd(n):
   return n % 2 == 1

filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
# 结果: [1, 5, 9, 15]

把一个序列中的空字符串删掉,可以这么写:

def not_empty(s):
   return s and s.strip()

filter(not_empty, [‘A‘, ‘‘, ‘B‘, None, ‘C‘, ‘  ‘])
# 结果: [‘A‘, ‘B‘, ‘C‘]

可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。

A2:没事多 help 和dir

根据定义的函数的返回值过滤掉(return Fal;se)代元素(list, tuple等)中的元素

定义函数模板

def filter_callback(x):

return True/False

比如我要过滤出range(0, 10)中所有偶数的元素
技术分享图片

Q:能不能详细解答下flask和django的区别?

A1:这种问题搜一搜到处都是,就推荐一个关于两者区别的总结吧:

( 1 ) Flask

Flask 确实很“轻”,不愧是 Micro Framework ,从 Django 转向 Flask 的开发者一定会如此感慨,除非二者均为深入使用过
Flask 自由、灵活,可扩展性强,第三方库的选择面广,开发时可以结合自己最喜欢用的轮子,也能结合最流行最强大的 Python 库
入门简单,即便没有多少 web 开发经验,也能很快做出网站
非常适用于小型网站
非常适用于开发 web 服务的 API
开发大型网站无压力,但代码架构需要自己设计,开发成本取决于开发者的能力和经验
各方面性能均等于或优于 Django
Django 自带的或第三方的好评如潮的功能, Flask 上总会找到与之类似第三方库
Flask 灵活开发, Python 高手基本都会喜欢 Flask ,但对 Django 却可能褒贬不一
Flask 与关系型数据库的配合使用不弱于 Django ,而其与 NoSQL 数据库的配合远远优于 Django
Flask 比 Django 更加 Pythonic ,与 Python 的 philosophy 更加吻合

( 2 ) Django

Django 太重了,除了 web 框架,自带 ORM 和模板引擎,灵活和自由度不够高
Django 能开发小应用,但总会有“杀鸡焉用牛刀”的感觉
Django 的自带 ORM 非常优秀,综合评价略强与 SQLAlchemy
Django 自带的模板引擎简单好用,但其强大程度和综合评价略低于 Jinja
Django 自带 ORM 也使 Django 与关系型数据库耦合度过高,如果想使用 MongoDB 等 NoSQL 数据,需要选取合适的第三方库,且总感觉 Django+SQL 才是天生一对的搭配, Django+NoSQL 砍掉了 Django 的半壁江山
Django 目前支持 Jinja 等非官方模板引擎
Django 自带的数据库管理 app 好评如潮
Django 非常适合企业级网站的开发:快速、靠谱、稳定
Django 成熟、稳定、完善,但相比于 Flask , Django 的整体生态相对封闭
Django 是 Python web 框架的先驱,用户多,第三方库最丰富,最好的 Python 库,如果不能直接用到 Django 中,也一定能找到与之对应的移植
Django 上手也比较容易,开发文档详细、完善,相关资料丰富
简单来说,Flask 和 Dj?ango 都是很优秀的框架。基础功能来说,二者都支持。Flask更轻量级,Django 则比较重。

二者的区别,其实在很多框架里面都存在这种情况。一种风格是走极简,只保留核心部分;一种是大而全,啥都有。

从理解一个框架上来说,flask 更容易理解。毕竟只有核心的内容在。理解了一个之后,再去看其它的也很方便。

从实际应用说,只能说看个人喜好。一般的项目,这俩框架都ok。但无疑 Django 功能插件更丰富。

A2:Python 在国内应该是除了PHP以外最流行的开发语言了(在国外的或许ROR能竞争,但在国内估计用的人没多少)。在 PHP 的世界里面,有一堆开发框架,有国产的 ThinkPHP、YII、CI,稍微新一点的Larvel5,每个都有不少的用户而且项目的活跃度都不错。相对来说Python就会略微逊色,名义上是有 Django、Flask、Bottle、Pyramid、Web2Py等,但实际真正活跃的却不多。阵营来说划分还是比较明确:以 Django 为首的重量级框架和以 Bottle、Flask 为首的轻量级框架,因此在这里我选择两个社区相对活跃的两个典型作为比较。

Django

Django 是基于中间件的一个大型框架。框架本身的内容相当丰富,基础部分:模版引擎、ORM、表单、路由分发这些标配,还有不少的中间件:登陆、后台管理,这些还是官方中间件,另外还有不少的第三方中间件。关于第三方的我没有详细研究过,质量不太好评论。还有由 ROR 带起的基于命令的 Web 开发方式和扩展、还有内建的数据库迁移,基本上你呢想到的 Django 都有。可以说 Django 和 Python 相当匹配,前者是 Web 开发的万金油,后者是开发领域的万金油。

另外 Django 这个框架本身还有一个专门的基金会,这个基金会是由 Django 的母公司成立的,估计有不少用这个框架的公司也对期捐助过。框架本身相当活跃,每隔大概8个月就有一个大版本。

社区也是相当活跃,官方的 Community、非官方(StackOverflow)和IRC(据说IRC是比任何一个开源项目都要活跃)基本上你碰到的问题大家都会有解决或者Workout方案。

Flask

Flask 框架本身只包含路由分发,请求和响应的封装和插件系统,在加上作者自己的Werkzeug (处理WSGI)、jinja2(模板引擎)和Flask-SQLAlchemy扩展(Model层),这几个同一个作者的项目构成一个完整的MVC框架。

对于 Flask 本身,一个微框架,这已经足够了,而且它也只能提供这么多。

如果你需要表单处理,请安装 Flask-WTF;如果你需要基于命令的开发模式,请安装 Flask-Script 和 Flask-CLI (这是一个Flask1.0的backport模块);如果你要登陆验证,请装 Flask-Login;如果你要后台管理,请装 Flask-Admin。什么?!你全部都要?请装 Django。

对 Flask 就是这么一个框架。这是一个典型的社区项目,作者在实现了一个牛X的核心以后,就撒手交给社区。各个插件的文档分散(虽然Flask曾经出了一本书,试图打通各个插件和 Flask 关系,但是当需要真正使用的时候,查文档还是需要在不同的Chrome Tab 里面切换),而且社区插件的质量、支持和活跃度也需要话很大的力气去确认。

Flask 这个项目毫无疑问是优秀的:完善的官方文档,详细的教程(还有一个牛X的作者作为光环加持)。但是和 Django 完全不在一个应用层面,我会在下一段作出比较和说明。而且 Flask 这个项目基本已经处于沉睡期,最新的版本0.10.1是2013年发布的,项目的代码仓库也是比较低的活跃度(大概是一个月10次左右的Commit和PR),1.0的发布从2014年到2016年一直说要发布,一直没有出来。各个插件更新也是停留在2015年中。和 Django 比较活跃度确实令人捉急。

Flask 和 Django 的应用场景

鉴于 Flask 和 Django 的特点,如果你是开发一个 REST API 的系统,没有复杂的分层和逻辑的话,Flask 会是一个不错的选择,因为框架内建的功能已经足够你完成这个任务;又或者,你是打算实现一个大型的系统,需要自己重新实现大部分插件的内容,Flask 也还是不错,因为它足够的简单,能让你快速的读懂和扩展。

其他的情况我还是推荐你用回 Django。尤其是当你需要安装大量的 Flask 插件,去实现 Django 本来就有的功能时,你就应该意识到你需要放弃 Flask。

当然这只是个人的看法,也没有绝对这一说,主要还是看你想在框架上花费多少的时间。

以上是关于Q&A丨关于 Python 入门的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

数据科学入门丨选Python还是R

python丨组成部分以及重要内容

Python & 机器学习入门指导

Python数据库查询之组合条件查询-F&Q查询

Lua入门 —— 一些常用的琐碎

[Python]小白入门时遇到的各种问题