1小时学会 Python- 老手篇
来源:互联网 发布:库克体育 淘宝 编辑:程序博客网 时间:2024/05/16 07:30
序言-致编程老手
Python 很容易入门系列有若干篇章, 这篇是专门给老手--有熟练编程经验-- 看的文章,希望你看完这篇文章就能实际做点东西出来.
作为一个曾经的 Java 拥趸, 为什么我现在会更喜欢 Python 呢?
1. 写同样业务的程序, Python能节省 60% 左右的代码, 和 1/3 左右的时间. (这个数据来源于个人工作经验)
2. 语言层面上, Python 真的比 Java 慢, 但是在互联网应用开发里, 程序员的开发效率和网络带宽才是应用的生死线. (在应用开发领域, 当年 Java 靠这招战胜了 C++). 有些评测文章说 Java 比 Python 快10倍, 但相信我, 在应用开发领域假设我们要实现同样的业务代码, J 语言只需要运行 0.000001 秒, P 语言需要运行 0.00001 秒, J 比 P 快10倍, 但这毫无意义!
3. 曾几何时, Java 的 Jar 包管理方式非常有利于工程代码组织, 该组织方式比起 C++ 项目是个进步, 而现在 Python 更进一步. 只需要安装 pip 这类的 Python 依赖库管理工具, 仅需要网络就可以自动安装相关的库, 简直是极速的方便!
4. Java 的严谨带来的另一个问题就是分层过多, 需要学习的相关知识太多. 在 Python 这并不存在, 不需要搞一个硕大的工程才能开始做点事情, 相反, 一个文本编辑器敲几行代码, 想要的业务就有了. (在最后我用一个爬虫程序说明了这点)
5. 云计算产品如 OpenStack, 都用 Python 作为第一开发语言...
废话结束, 下面开始干货.
选择 Python2还是 Python3
Python新手会很惊讶地发现, Python居然有两个2.x 和 3.x 两个版本, 并且两个版本并不能完全兼容。 (当然别问我为什么,这是Python决策者的意思,网上你能搜到一堆回答/解释/争吵) 那么选择哪个版本呢? 几年前我告诉别人选2.x,有两个比较充分的理由:
第一:一些好用的库只能跑在2.x上。
第二:如果你用类linux系统如ubuntu/mac, 默认的Python解释器都是2.x 。
2.x足够你玩许多年了,所以不用纠结。
安装开发环境和IDE
需要安装Python本身和Pycharm。 Pycharm是一个开源的最好用的开发工具。
如果你用windows系统
我已经把2个开发工具放到云盘, 请戳这里下载: http://pan.baidu.com/s/1sj0U3rn 这2个工具都是32位, 你如果是64位系统应该也可以运行.
如果你用Linux/Mac系统
系统默认自带Python。
linux 版本的 PyCharm 在这里下载: http://pan.baidu.com/s/1c0tTwys 解压缩之后有个bin目录, 双击 bin/pycharm.sh 即可启动
mac 版本的 PyCharm 在这里下载: http://pan.baidu.com/s/1o6yYHZ0 安装之后打开 pycharm 即可启动
Pycharm 的配置
你需要做一些配置, 在你初次启动PyCharm的时候会询问你是否导入已有软件配置. 选第二个选项即可.
接着会问你喜欢什么样的主题, 建议把3个下拉框选成如我的配置. 这样的配置保护视力 :-)
然后会问你是否需要重启, 选择ok即可.
接下来IDE就会变成黑乎乎的了. 如下图, 选择"Create New Project "
Location 设置我们想把代码摆哪. 我是摆在C盘, 你们要设成其他值也可以. 第二个选择框 "Interpreter" PyCharm会自动识别你本机的 Python 配置. windows 只有1个选项, Linux/Mac 通常有2个, 选择 2.x 版本即可.
接着大功告成. 会看到这样的界面:
去掉 "Show Tips on Startup" , 点击 Close 设置完成.
认识Pycharm
我们将要和PyCharm 并肩作战一段时间, 当然要好好认识这位伙伴. PyCharm 的界面布局和说明如下图:
左上方文件导航区: 可以在这里增加文件夹和文件. 和大家平时在 操作系统的 文件夹界面操作差不多. 增加文件的时候一般选 Python 源文件.
右方的源文件编辑区: 在左边双击文件之后, 文件的内容就会展示在源文件编辑区.
下方的控制台: 程序运行之后就会显示结果. 这些结果通常都是一些字符, 它们就会显示在这个区域.
其他操作,随着使用的过程慢慢熟悉吧.
来个 Hello world
新手学习怎能不向 K&R 致敬. 新建一个 Python 文件, 文件名无所谓, 输入:
#! /usr/bin/python# -*- coding: UTF-8 -*-""" 来自博客:云师兄写字的地方(blog.yunshichen.cn) 你可以自由转载此文章, 但请注明出处. """print 'Hello, world'
在代码文件里右键, 选择 run xx(xx 是你的文件名), 你就能在控制台看到大名鼎鼎的 hello world 了.
Python 独有特性
以前我的文章是用idle( 安装 Python 之后自带的文本型编辑器) 来进行教学. 那时候还没有 Pycharm 呢! 现在建议大家一开始学习就用 IDE. 为什么呢? 在 Python 里有两个特性: 缩进问题和中文问题, IDE 能够帮助新手很好解决这两个问题.
缩进问题: 表示层级关系的语句, 要以4个空格( tab) 作为缩进. 这是什么意思呢? 我们来看看传统的 c/java/js 程序的写法:
if (test) { //do xxx}else{ // do else}
Python 的作者觉得大括号之争很无聊, 他认为 Python 的哲学是简单, 而规则的统一属于简单化特性之一, 所以在 Python 的语言中, 他规定必须有缩进, 所有程序都统一美观, 如下:
# Python 的独特个性if test: do_something() # 前面必须有4个缩进!! if inner_test: do_inner() # 前面必须有8个缩进!!
如果你不按缩进来写程序, 程序会运行不了!! 假设你从网上 copy 了点程序来使用, 如果没有 Pycharm 帮你重整格式缩进, 估计你连用这段程序的心情都没了.
这是 Python 的特色(qi pa)之一. 但说实在的, 写了这么多年 Python 程序, 我开始喜欢上这个特色, 它让我从一开始就注意程序的美观和可维护性, 不滥用多重 if 嵌套. 看, 这是这个博客程序的源码, 工整, 嵌套合理, 一眼看过去就知道程序从哪来开始分支:
draft_dto = param_to_article_dto(self)return_data = comm_utils.dict_to_object({'flag': 'create', 'aid': ''})if draft_dto.id: succ, resp = back_dgates.update_article_by_owner(login_account_id, draft_dto) return_data.flag = 'update'else: succ, resp = back_dgates.create_article_by_owner(login_account_id, draft_dto)
先别埋怨, 慢慢习惯吧.
另一个问题是处理中文问题, 3.x 解决了这个问题. 2.x 需要比较熟悉 Python 语言和字符编码的知识. 光说知识很干巴巴, 我会在实例中提示.
好了, 到这里你的 Python 开发环境应该 ok 了. 接下来我们通过一系列程序进行快速语法入门.
基础中的基础
控制台输出之 print 语句
控制台输入之 raw_input 语句
加减乘除整除等数学运算
布尔类型与条件判断
循环语句 while
Python 里可以用 while 和 for 来完成循环操作. 这里先介绍 while 语句. for语句 和数据类型的结合很紧密, 在稍后的例子介绍.
continue 和 break
Python 的字符串
字符串定义
中文的处理
前面说过 Python 的中文处理稍微麻烦, 首先, 你的文件都要加上字符编码, 我建议用 UTF-8编码, 如上面的例子:
#! /usr/bin/python# -*- coding: UTF-8 -*-
如果不加这句, 在 py 源文件里根本写不了中文. 来再看看下面的例子:
看到没, 你必须用 unicode 函数进行转码, 才能得到正确的结果. 那么问题来了, 你怎么知道输入的字符串是什么编码呢? 很遗憾告诉你, 程序本身很难检测出来, 你只能通过一些方法观察而来. 在后面的爬虫例子我们会实际看到中文的处理技巧.
字符串和数字
有趣的是,在javascript里我们会理想当然的将字符串和数字连接,因为是动态语言嘛.但在Python里有点诡异,下面这段程序会报错:
用上内置函数 int 和 str , 结果就正确了:
Python 新手会经常犯这个错误. 习惯了就好.
索引访问字符串
当年纠结在Java 字符串 indexOf, substring .. 等方法里的云师兄, 看到 Python 索引访问字符串的方式后, 心头涌起巨大的感动...
字符串的方法
下面列出一些最常用的方法, 如果需要更多, 请 google 之...
列表和字典
列表与索引访问
Python 把动态数组叫做列表( List), 定义方式和 js 相同. 访问方式和字符串完全一样:
列表与循环
字典的应用
字典类似于 java 的 map 类型, 是存储 key-value 的数据类型. (翻译为键-值总感觉怪怪的, 还不如用英文). 用法如下:
例子中的(key_name, key_value) 叫做 tuple(元组), 是 Python 一种新的数据类型. 在函数里我会介绍它的主要用法.
函数
定义
元组与返回值
我们再来看看 Python 的 tuple( 元组)概念. 元组最常用的功能, 就是提供多个函数的返回值. 这个功能非常好用.
以上元组的玩具语法只会让你知道怎么用, 但不了解究竟有什么威力. 嗯, 现在想象一下你要写一个程序, 返回 /home 下( windows 系统不妨用 c 盘作为根路径) 所有的文件名和文件路径, 用 java 究竟要写多长呢? ( 我写过这个程序! )
而用 python 的系统函数 os.walk , 它会返回一个元组, 通过元组, 你能得到所有的信息. 来看看这个程序吧
仅仅一行代码!
异常处理 Exception
文件读写
面向对象
其实吧, 个人写的Python 程序一般都很简单, 不用强调 OO. 但毕竟很多类库以 OO 的方式组织, 了解用法还是必要的. 这里先介绍最常用的知识
类和继承
复写基类方法
类变量与类方法
真简单, 是不?
python 的包机制(package)
模块(module)和包(package)的概念
模块就是一个个 .py 文件, 包 就是文件夹, 这个概念够清楚没? Python 的库都是以这种方式进行组织的. 这其中, from 表示从哪个目录查找, import 表示实际的引入类或者方法. 看下面这个例子
我们来实际体会下如何用这种方式组织代码. 用 Pycharm 新建一个 "python package", 取名为 package_sample, 你会看到这个图
每个 package 下面都必须有1个__init__.py 文件(上面例子里 pycharm 给你自动生成了), 要有这个文件, python 才会把这个目录识别为 package.
然后, 假设你积累了一些有用的方法, 保存在一个名为 my_utils.py 文件里:
文件目录结构如下
我们用2种情况显示如何用 import. 首先在 my_utils 的同级目录新建 test1. py 文件, 如下:
很简单吧.
现在, 在 package_sample 的父目录新建 test2.py , 如下:
看到没? 要把自己代码组织起来是很轻松的.
源代码组织
但是, python 怎么知道去哪里搜索你的 py 文件呢? 这就要你理解 py 的源码搜索方式了. 然而如果你用 pycharm 进行开发, 你不用关心这个问题. pycharm 已经帮你解决了一切. 我们来看看:
先在 pycharm 里建立source_search 这个目录(其他目录是我的教学资源, 你不用建):
然后, 在 source_search 目录右键点鼠标, 在弹出菜单最下面, 发现一个叫 Mark Directory As .. 的选项, 点了它之后会弹出 "Source Root" 选项. 选它, 然后发现这个目录的颜色变了:
好了, 按照下图新建一堆文件, 输入相关内容, 你会发现互相引用 文件 是很简单的事情.
等你 python 入门了, 再去了解 python 如何找到你的源码吧.
Do it : 爬虫例子
看到这里, 相信你应该掌握大多数 python 的基础知识了. 然而掌握这些知识能否帮助你做出一些实际的例子? 我们来学以致用一番, 看看怎么用 python 做出一个爬虫例子.
检查安装 pip
首先要安装类库. Python 本身自然有网络编程的接口, 但是有些类库特别好用, 用它们省时省力. Python 安装类库的命令很简单, 如下:
sudo pip install BeautifulSoup4
pip 是 Python 用于管理/安装类库的工具, 它会自动从网上寻找类库并下载到你本机. 如果你发现这个命令提示 pip 不存在, 那么你要先安装 pip:
如果是 debian/ubuntu
sudo apt-get install python-setuptools
如果是 mac
pip已经预装好了.
如果是 windows
稍微要多做点工作... 先到这里下载 pip 源码: 下载 pip 源码
然后解压, 运行 cmd 到解压的目录下, 运行命令:
python setup.py install
然后就好了也.
安装BeautifulSoup
好了, 这次运行命令应该没问题了:
sudo pip install BeautifulSoup4
爬虫需求简述
这是我电脑上跑的一个实际例子. 我想看新闻但又不想装太多 app, 于是自己写了一些爬虫程序从互联网找新闻, 存到数据库 ,然后再通过我自己做的安卓 app 阅读这些新闻. 因此, 这个例子是挺实用的非玩具程序.
我会把你当初学者, 一步步写&分析程序. 如果你没啥耐心, 你可以直接翻到最后看程序.
第一步: 从url得到网络数据,转换,并查找。
熟手都应该知道网络编程是咋回事。 根据URL打开一个链接, 处理返回结果。 你需要知道的就是Python的网络api到底是什么。
Python的原生api是 urlopen , 并且有个更好用的第三方包 requests ( sudo pip install requests ) . 但因为我们主要展示爬虫和 BeautifulSoup4 的用法, 所以还是用原声api。 程序如下:
第20行是某体育门户的访问地址
第23 行用原生api打开地址并读取返回值(是的, 就一句话这么简单), 第24行打印结果看是否正确。 你应该在第24行看到一大堆html
第26 行显示了 BeautifulSoup的作用, 它将一大堆字符串转变成 dom 结构对象, 然后你可以用 jquery的查询语法, 对里面的元素进行查询。 (别问我jquery是什么, 这是一篇给熟手看的文章。。。 )
掌握了该页面的结构规律之后, 第28行到35行对其进行解析, 并打印结果。 运行这个程序, 你应该能够看到如下结果:
多么短小精悍的程序啊。
第二步: 将数据转换为自己的数据结构
写过爬虫的程序员都知道, 数据整下来之后, 通常会按照自己的格式再重新组织一遍, 这样方便程序进行维护。 下面这个程序演示了这点,并让大家复习类的用法:
第37 行将数据变为自己的结构。 程序相当简单, 不再赘述
第三步: 查找新闻的详细内容
当然, 我并不满足新闻只能看到个标题, 我还要看详细内容。 怎么找到文章的详细内容? 观察返回页面的dom, 找到文章详细页的链接, 然后对这个链接再爬一遍呗。 如下:
上述程序除了挖掘更多的文章属性, 还对文章链接再爬了一遍。 第95 行用打印看看是否找到了内容。
第四步: 解析新闻, 收工
基本上, 爬虫程序的难度在于发现有规律的文档结构。 当规律找到之后, 后面都是苦力活。 完整的程序如下:
写一个爬虫程序是很容易的, 难的是怎么做出一个“满足业务需求”的爬虫, 例如一天挖掘几十亿条数据。。。 上述程序没有考虑内存占用, 性能速度, 仅仅让你熟悉Python的用法。 如果你掌握了这个程序, Python就算入门了。
结语
行文至此, 相信你已经初步学会Python了。 精通一门技艺很难, 但要熟悉上手是很快的。 Python就是这么可爱的一门语言, 很快就能用它做出东西。 希望你以后也会喜欢上这门语言。
如果要掌握更多语法, 更多API, 更多高级用法。。。 请看云师兄博客的更多文章吧。
- 1小时学会 Python- 老手篇
- 1 小时学会Python
- 1小时学会Python
- 1小时学会python
- 1小时学会python
- 1小时学会Python
- [转载] 1小时学会Python
- 实例教程:1小时学会Python
- 实例教程1小时学会Python
- 实例教程:1小时学会Python
- Python入门教程 超详细1小时学会Python
- Python入门教程 超详细1小时学会Python
- Python入门教程 超详细1小时学会Python
- Python入门教程 超详细1小时学会Python
- Python入门教程 超详细1小时学会Python
- Python入门教程 超详细1小时学会Python
- Python入门教程 超详细1小时学会Python
- Python入门教程 超详细1小时学会Python
- Auto Layout 使用心得
- redis启用持久化
- 英文版ubuntu12.04安装中文输入法ibus
- 认识Java虚拟机的基本结构
- Python中的sorted函数以及operator.itemgetter函数
- 1小时学会 Python- 老手篇
- 02-线性结构1 一元多项式的乘法与加法运算 (20分)
- poj1731(next_permutation+sort进行全排列)
- 判断应用是否第一次启动(第一次启动出现新手指导页)
- 空间坐标变换与投影
- 软件产品架构师手记
- window下搭建Nginx
- 基数排序
- json的API链接