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的时候会询问你是否导入已有软件配置. 选第二个选项即可. 


    test


    接着会问你喜欢什么样的主题, 建议把3个下拉框选成如我的配置. 这样的配置保护视力  :-)

test


    然后会问你是否需要重启, 选择ok即可. 

test


    接下来IDE就会变成黑乎乎的了. 如下图, 选择"Create New Project " 

test


    Location 设置我们想把代码摆哪. 我是摆在C盘, 你们要设成其他值也可以.  第二个选择框 "Interpreter"  PyCharm会自动识别你本机的 Python 配置. windows 只有1个选项, Linux/Mac 通常有2个, 选择 2.x 版本即可. 


test


    接着大功告成. 会看到这样的界面:


test


    去掉 "Show Tips on Startup" , 点击 Close  设置完成. 


认识Pycharm 

    我们将要和PyCharm 并肩作战一段时间, 当然要好好认识这位伙伴.  PyCharm 的界面布局和说明如下图: 


    test



  • 左上方文件导航区:  可以在这里增加文件夹和文件. 和大家平时在 操作系统的 文件夹界面操作差不多. 增加文件的时候一般选 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 语句

test

控制台输入之 raw_input 语句

test

加减乘除整除等数学运算

test

布尔类型与条件判断

test

循环语句 while

Python 里可以用 while 和 for 来完成循环操作.  这里先介绍 while 语句. for语句 和数据类型的结合很紧密, 在稍后的例子介绍. 

test

continue 和 break

test

Python 的字符串

字符串定义

test

中文的处理

前面说过 Python 的中文处理稍微麻烦, 首先, 你的文件都要加上字符编码, 我建议用 UTF-8编码, 如上面的例子: 

#! /usr/bin/python# -*- coding: UTF-8 -*-


如果不加这句, 在 py 源文件里根本写不了中文. 来再看看下面的例子: 
test

看到没, 你必须用 unicode 函数进行转码, 才能得到正确的结果. 那么问题来了, 你怎么知道输入的字符串是什么编码呢? 很遗憾告诉你, 程序本身很难检测出来, 你只能通过一些方法观察而来.  在后面的爬虫例子我们会实际看到中文的处理技巧. 


字符串和数字

有趣的是,在javascript里我们会理想当然的将字符串和数字连接,因为是动态语言嘛.但在Python里有点诡异,下面这段程序会报错: 

test

用上内置函数 int 和 str , 结果就正确了: 

test

Python 新手会经常犯这个错误. 习惯了就好. 

索引访问字符串

当年纠结在Java 字符串 indexOf, substring .. 等方法里的云师兄, 看到 Python 索引访问字符串的方式后, 心头涌起巨大的感动... 

test

字符串的方法

下面列出一些最常用的方法, 如果需要更多, 请 google 之... 

test

列表和字典

列表与索引访问

Python 把动态数组叫做列表( List), 定义方式和 js 相同. 访问方式和字符串完全一样: 
test

列表与循环

test

字典的应用

字典类似于 java 的 map 类型, 是存储 key-value 的数据类型. (翻译为键-值总感觉怪怪的, 还不如用英文). 用法如下: 

test

例子中的(key_name, key_value) 叫做 tuple(元组), 是 Python 一种新的数据类型. 在函数里我会介绍它的主要用法. 

函数

定义

test

元组与返回值

我们再来看看 Python 的 tuple( 元组)概念. 元组最常用的功能, 就是提供多个函数的返回值. 这个功能非常好用. 

test

以上元组的玩具语法只会让你知道怎么用, 但不了解究竟有什么威力. 嗯, 现在想象一下你要写一个程序, 返回 /home 下( windows 系统不妨用 c 盘作为根路径) 所有的文件名和文件路径, 用 java 究竟要写多长呢?  ( 我写过这个程序! ) 

而用 python 的系统函数 os.walk , 它会返回一个元组, 通过元组, 你能得到所有的信息. 来看看这个程序吧

test

仅仅一行代码! 

异常处理 Exception

test

文件读写

test

面向对象

其实吧, 个人写的Python 程序一般都很简单, 不用强调 OO. 但毕竟很多类库以 OO 的方式组织, 了解用法还是必要的. 这里先介绍最常用的知识

类和继承

test

复写基类方法

test

类变量与类方法

test

真简单, 是不?

python 的包机制(package)

模块(module)和包(package)的概念

模块就是一个个 .py 文件, 包 就是文件夹, 这个概念够清楚没? Python 的库都是以这种方式进行组织的. 这其中, from 表示从哪个目录查找, import 表示实际的引入类或者方法. 看下面这个例子

test

我们来实际体会下如何用这种方式组织代码.  用 Pycharm 新建一个 "python package", 取名为 package_sample, 你会看到这个图
 test

每个 package 下面都必须有1个__init__.py 文件(上面例子里 pycharm 给你自动生成了), 要有这个文件, python 才会把这个目录识别为 package. 

然后, 假设你积累了一些有用的方法, 保存在一个名为 my_utils.py 文件里: 
test

文件目录结构如下
 test

我们用2种情况显示如何用 import. 首先在 my_utils 的同级目录新建 test1. py 文件, 如下: 

test
test

很简单吧. 

现在, 在 package_sample 的父目录新建 test2.py , 如下: 
test
test

看到没? 要把自己代码组织起来是很轻松的. 

源代码组织

但是, python 怎么知道去哪里搜索你的 py 文件呢? 这就要你理解 py 的源码搜索方式了. 然而如果你用 pycharm 进行开发, 你不用关心这个问题.  pycharm 已经帮你解决了一切. 我们来看看:

先在 pycharm 里建立source_search 这个目录(其他目录是我的教学资源, 你不用建):
test

然后, 在 source_search 目录右键点鼠标, 在弹出菜单最下面, 发现一个叫 Mark Directory As .. 的选项, 点了它之后会弹出 "Source Root" 选项. 选它, 然后发现这个目录的颜色变了: 
test

好了, 按照下图新建一堆文件, 输入相关内容, 你会发现互相引用 文件 是很简单的事情. 
test
test
test

等你 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。 程序如下: 

test


第20行是某体育门户的访问地址
第23 行用原生api打开地址并读取返回值(是的, 就一句话这么简单), 第24行打印结果看是否正确。 你应该在第24行看到一大堆html

第26 行显示了 BeautifulSoup的作用, 它将一大堆字符串转变成 dom 结构对象, 然后你可以用 jquery的查询语法, 对里面的元素进行查询。 (别问我jquery是什么, 这是一篇给熟手看的文章。。。 )

掌握了该页面的结构规律之后, 第28行到35行对其进行解析, 并打印结果。 运行这个程序, 你应该能够看到如下结果: 
test

多么短小精悍的程序啊。

第二步: 将数据转换为自己的数据结构

写过爬虫的程序员都知道, 数据整下来之后, 通常会按照自己的格式再重新组织一遍, 这样方便程序进行维护。 下面这个程序演示了这点,并让大家复习类的用法: 

test
test

第37 行将数据变为自己的结构。 程序相当简单, 不再赘述

第三步: 查找新闻的详细内容

当然, 我并不满足新闻只能看到个标题, 我还要看详细内容。 怎么找到文章的详细内容? 观察返回页面的dom, 找到文章详细页的链接, 然后对这个链接再爬一遍呗。  如下: 
test
test

test

上述程序除了挖掘更多的文章属性, 还对文章链接再爬了一遍。  第95 行用打印看看是否找到了内容。 

第四步: 解析新闻, 收工

基本上, 爬虫程序的难度在于发现有规律的文档结构。 当规律找到之后, 后面都是苦力活。 完整的程序如下: 

test

test
test

写一个爬虫程序是很容易的, 难的是怎么做出一个“满足业务需求”的爬虫, 例如一天挖掘几十亿条数据。。。 上述程序没有考虑内存占用, 性能速度, 仅仅让你熟悉Python的用法。 如果你掌握了这个程序, Python就算入门了。

结语

行文至此, 相信你已经初步学会Python了。 精通一门技艺很难, 但要熟悉上手是很快的。 Python就是这么可爱的一门语言, 很快就能用它做出东西。 希望你以后也会喜欢上这门语言。 

如果要掌握更多语法, 更多API, 更多高级用法。。。 请看云师兄博客的更多文章吧。 

 




0 0
原创粉丝点击