第一章 为什么要学习Python

那些最好的程序员不是为了得到更高的薪水或者得到公众的仰慕而编程,他们只是觉得这是-件有 趣的事情。
——Linux 之父 Linus TorvaIds

作为-个实用主义的学习者,最关心的问题-定是「我为什么要选择学 Python, 学会之后我可以用来做什么?(
首先,对于初学者来说,比起其他编程语言,Python 更容易上手。
Python 的设计哲学是优雅、明确、简单。在官方的 The Zen of Python)Python 之禅)中,有这样-句话,

There should be one-- and preferably onIy one --obvious way to do it.

Python 追求的是找到最好的解决方案。相比之下,其他语言追求的是多种解决方案。
如果你试着读-段写的不错的 Python 代码,会发现像是在读英语-样。这也是Python 的最大优点,它使你能够专注于解决问题而不是去搞明白语言本身。

其次,Python 功能强大,很多你本来应该操心的事情,Python 都替你考虑到了。当你用 Python 语言编写程序的时候,你不需要考虑如何管理你的程序使用的内存之类的底层细节。并且,Python 有很丰富的库,其中有官方的,也有第三方开发的,你想做的功能模块很有可能已经有人写好了,你只需要调用,不需要重新发明轮子。这就像是拥有了智能手机,可以任意安装需要的 app。


这幅漫画形容了 Python 的库有多强大,导入—个反重力库就可以飞起来了。

第三,Python 能做的事情有许多。
在职场中,使用 Python 工作的主要是这样几类人:
网站后端程序员:使用 Python 搭建网站、后台服务会比较容易维护,当需要增加新功能,用 Python 可以比较容易的实现。但如果使用 php ,往往需要重写代码。不少知名网站都使用了 Python 开发,比如:

自动化运维:越来越多的运维开始倾向于自动化,批量处理大量的运维任务。
Python 在系统管理上的优势在于强大的开发能力和完整的工具链。
数据分析师:Python 能快速开发的特性可以让你迅速验证你的想法,而不是把时间浪费在程序本身上,并且有丰富的第三方库的支持,也能帮你节省时间。
游戏开发者:—般是作为游戏脚本内嵌在游戏中,这样做的好处是即可以利用游戏引擎的高性能,又可以受益于脚本化开发的优点。只需要修改脚本内容就可以调整游戏内容,不需要重新编译游戏,特别方便。
自动化测试:对于测试来说,要掌握 Script 的特性,会在设计脚本中,有更好的效果。Python 是目前比较流行的 Script。

如果你是一名业余开发者,只是想在资源少的情况下快速做出自己想要的东西、自动化的解决生活中的问题,那么 Python 可以帮你做到这几类事情

网站的开发
借助功能丰富的框架 django,fask,丰富的设计模板 bootstrap ,你可以快速搭建自己的网站,还可以做到移动端自适应。

用爬虫实现数据挖掘、批量处理
爬虫的本质是模仿人去获取网页数据,当你需要获取大批量数据或是不停地获取的时候,Python 可以快速做到,节省你的重复劳动时间。比如:微博私信机器人、批量下载美剧、运行投资策略、刷便宜机票、爬合适房源、系统管理员的脚本任务等等。

再包装其他语言的程序
Python 又叫做胶水语言,因为它可以用混合编译的方式使用c/c++/java等等语言的库。 另外,树莓派作为微型电脑,也使用了 Python 作为主要开发语言。

最后,附一张选择编程语言的小测试,你可以根据你的需要,选择学习哪种语言。

第二章 现在开始

2.1安装 Python 环境

在你开始学习 Python 之前最重要的是——对,你要安装 Python 环境。许多初学者会纠结应该选择 2.x 版本还是 3.x 版本的问题,在我看来,世界变化的速度在变得更快,语言的更新速度速度亦然。没有什么理由让我们只停留在过去而不往前看。对于越来越普及、同时拥有诸多炫酷新特性的 Python 3.x,我们真的没有什么理由的拒绝它。如果你理解了 life is short,you need Python 的苦衷,就更应该去选择这种
「面向未来」的开发模式。
所以,我们的教材将以最新的 Python 3.x 版本为基础,请确保电脑上有对应版本。

2.1.1在 Windows 上安装 Python

第一步
根据你的 Windows 版本(64位还是32位)从 Python 的官方网站下载对应的Python 3.5, 另外,Windows 8.1 需要选择 Python 3.4,地址如下:
Python 3.5 64位安装程序 https://www.Python.org/ftp/Python/3.5.0/ Python_3.5.0_amd64.exe
Python 3.5 32位安装程序 https://www.Python.org/ftp/Python/3.5.0/ Python_3.5.0.exe
Python 3.4 64位安装程序 https://www.Python.org/ftp/Python/3.4.3/ Python_3.4.3.amd64.msi
Python 3.4 32位安装程序 https://www.Python.org/ftp/Python/3.4.3/ Python_3.4.3.msi
网速慢的同学请移步国内镜像 http://pan.baidu.com/s/1bnmdlZx 然后,运行下载的EXE安装包:

特别要注意勾上Add Python 3.5 to PATH,然后点"Install Now"即可完成安装。默认会安装到C:\Python35目录下。
第二步

打开命令提示符窗口(方法是点击y开始"-y运行"-输入:ycmd"),敲入Pxthon 后,会出现两种情况:

  • 情况一:


看到上面的画面,就说明 Pxthon 安装成功!
你看到提示符>>>就表示我们已经在 Pxthon 交互式环境中了,可以输入任何
Pxthon 代码,回车后会立刻得到执行结果。现在,输入eⅩit((并回车,就可以退出
Pxthon 交互式环境(直接关掉命令行窗口,或者使用快捷键yCtrl)C"也可以)。

  • 情况二:得到一个错误:

:Python’ 不是内部或外部命令,也不是可运行的程序或批处理文件。


这是因为Windows会根据一个Path的环境变量设定的路径去查找Python.exe, 如果没找到,就会报错。如果在安装时漏掉了勾选Add Python 3.5 to PATH,那就要手动把Python.exe所在的路径添加到Path中。
如果你不知道怎么修改环境变量,建议把Python安装程序重新运行一遍,务必记得勾上Add Python 3.5 to PATH。

2.1.2 在 Mac 上安装 Python

如果你正在使用 Mac,系统是OS X 10.8-10.10,那么系统自带的Python版本是 2.7,需要安装最新的 Python 3.5。

第一步:

  • 方法一:

从 Python 官网下载 Python 3.5 安装程序
链接:https://www.Python.org/ftp/Python/3.5.0/Python-3.5.0- macosx10.6.pkg
网速慢的同学请移步国内镜像:http://pan.baidu.com/s/1sjqOkFF

Mac 的安装比 windows 要简单,只需要一直点击继续就可以安装成功了。

  • 方法二:
    如果安装了 Homebrew,直接通过命令brew install Python3安装即可。
    第二步
    如果不放心,可以再检查—下。操作方法是打开终端,输入3ython,(不是输 入 3ython ,也不是 3ython)

    得到这样的结果,就说明安装成功了。

2.1.3 在 Linux 上安装 Python

一个好消息是,大多数 Linux 系统都内置了 Python 环境,比如 Ubuntu 从13.04 版本之后,已经内置了 Python 2和 Python 3两个环境,完全够用,你不需要再折腾安装了。
如果你想检查一下 Python 版本,打开终端,输入:

python3 --version

就可以查看 Python 3 是什么版本的了。
如果你需要安装某个特定版本的 Python,在终端输入这一行就可以:

sudo apt-get install python3.5

其中的3.5可以换成你需要的版本,目前 Python 最新是 3.5 版。

2.2 使用 IDE 工具

安装好环境之后,还需要配置一个程序员专属工具。正如设计师使用 Photoshop 做图、产品经理使用 Axure 做原型,程序员也有编程的工具,叫做:IDE
在这里推荐公认最智能最好用的 Python IDE,叫做 PyCharm,同时支持windows 和mac 用户,本教程使用的版本是目前最新的3.4版本。官网下载链接是:https://www.jetbrains.com/PyCharm/
社区版是免费的,专业版是付费的。对于初学者来说,两者的差异微乎其微,使用社区版就够用了。

到这里,Python 开发的环境和工具就搭建好了,由于 PyCharm 的使用极其简单,几乎不需要学习额外的教程,我们可以开始安心编程了。
可能有些同学会有疑问,在这里解答一下。

  • 为什么不需要安装 Python 解释器?
    因为在 Python 官方网站下载了 Python 3.5之后,就自带了官方版本的解释器,所以不需要再次安装。
  • 为什么不使用文本编辑器,比如 Sublime ?
    因为文本编辑器是相对轻量级的,和 lDE 相比功能太弱了,尤其在 debug 的时候会遇到很多问题。
  • 能不能不安装 lDE,直接在命令行或者终端里编程?
    可以。但是在命令行中保存完整代码很麻烦,最重要的是编辑器是交互式的,不小心手滑写错的代码无法修改,要重新敲一遍。珍惜时间,善用工具。
  • PyCharm 默认的主题颜色是白色,怎么换成黑色的?
    windows 用户
    第一步:选择 “fle" 菜单下的 “Settings"选项:

    第二步:选择"IDE Settings"下的 “Appearance"选项:

    第三步:点击右侧"Theme"的下拉框,选择相应的主题:

    选择"Darcula”,点击"0K",主题即被设置为黑色。

mac 用户

在菜单的 appearance 里把 theme 换成 darcula

然后就可以拥有黑色皮肤了

另外,如果想更换文字颜色的话,在“Colors & Fonts"里面更换就可以,教程使用的是“Monokai" 这个主题

第三章 基础中的基础变量与字符串

3.1 开始学习编程

初学者经常会遇到的困惑是,看书上或是听课都懂,但还是不明白要怎么编程。这是因为缺乏足够多的实践。
正如我们在婴儿时期学习说话的时候,最初是模仿父母的发音,逐渐才能学会表达自己的想法。学习编程也是一样,在你阅读这本教程的时候,需要模仿着示例敲一遍代码,不要怕麻烦、不要嫌简单,当你动手敲代码的时候,就会发现很多眼睛会忽略的细节:小到中文标点还是英文标点、大到语句之间的逻辑关系。当然,在你发现亲手写出的程序运行成功之后,你也会感受到无比的喜悦,你能用程序计算数学题了!你能实现小功能了!我会带着你循序渐进地完成一个个实践,直到你有能力脱离模仿、开始创造。
所以,你需要在阅读时打开lDE,边看边敲代码。如果安装环境这一步遇到了问题, 请回到上一章阅读。
如果你准备好了,跟我走吧。

3.2 变量

简单地说,变量就是编程中最基本的存储单位,变量会暂时性地储存你放进去的东西。
《银河系漫游指南》里面说r生命、宇宙以及任何事情的终极答案是421,如果 用编程语言来表达的话,就是如下等式,一个叫做“answer"的变量被赋值为42。正如每个人都有姓名一样,变量的名字叫做标识符。

现在我们来试着给变量赋值。为了最简单的完成这一步,Windows用户请打开命令行输入 Python 并回车,Mac 用户打开终端输入 Python3 并回车,然后输入下图红框部分的代码,分别给4个变量赋值。再试着输入a并回车,你会看到赋值的结果,再 输入 b 、c 、d 也能看到相应值。 需要注意的是,Python 对大小写的敏感,“ a" 和“ A" 会是两个不同的变量, 而不是同一个。
这样,你就学会给变量起名字了,并且他们随叫随到。


打印是 Python 中最常用的功能,顾名思义,我们现在就简单把 print() 这个功能理解为展示打印的结果。使用方法是把你要打印查看结果的对象塞进括号中,这样就可以了。(如果你的 print 不用括号也能使用,请检查你的 Python 版本,为了方便快速理解编程概念和少走弯路,后面的所有例子都会用 Python 3.x 实现)
如果你使用命令行或终端直接输入 print(a),你会得到下图的结果。这是因为你漏掉了变量的赋值,Python 是无法打印不存在的对象的。

在今后的学习中我们还有很多很多的东西要进行“打印”,我们需要知道将会打印 出来的东西是什么。即便变量是最容易理解的基础知识,也不要因为简单而就随意命名, 一定要保持的 Python 的可读性。
看看下面这段代码,即便你现在不知道其中一些细节,但是读了一遍之后,你也能大概猜到这段代码做了什么事情吧?

file = open('/Users/yourname/Desktop/file.txt','w') file.write('hello world!')

由于这是你敲的第一段代码,所以在这里多说几句。首先需要注意语法问题,使用英文标点符号、大小写不要出错、空格不能少。其次要注意文件路径问题,你的桌面上不需要有 巾le.txt这个文件,但你需要知道你的电脑上桌面文件的路径是什么,然后把/Users/yourname/Desktop/替换掉。查看文件路径的方法是,windows 用户用资源管理器打开桌面上的一个文件,查看路径。Mac 用户打开终端 terminal,然后把桌面上的某个文件拖拽进去就可以查看到路径。
这段代码打开了桌面上的巾le.txt 文件,并写入了 Hello World↓w代表着如果桌面上有巾le.txt这个文件就直接写入 hello world,如果没有巾le.txt这个文件就创建一个这样的文件。
互联网上有着诸多的代码和教程,但如果你没能一眼看懂这段代码是什么意思, 其中有一多半是变量命名不清楚造成的困惑。因此在随后的教程中,哪怕很啰嗦,我也会使用清晰的命名方式,从而来保证即便是没有计算机基础的人,也能够理解代码。
要保持良好的命名习惯应该尽量使用英文命名,学编程的同时还能背单词,岂不一举两得,过一阵子你就会发现英文教程也会阅读得很顺畅。
在这里先了解这么多,更深入的会在之后介绍。

扩展阅读:
驼峰式命名法 https://zh.wikipedia.org/wiki/酡峰式大小窝帕斯
卡命名法 https://zh.wikipedia.org/wiki/帕斯卡命名法

3.3 字符串

字符串是什么

在上面我们已经初步接触到了字符串,很简单地说,字符串就是…

3.3.1 字符串的基本用法

现在我们来试着了解一些字符串的基本用法——合并。请在你的 GCD(也就是前面推荐的 Ky:harm) 中输入如下代码,在 GCD 中代码并不能自动运行,所以我们需要手动点击运行,方法是点击右键,选择"Run‘文件名’ "来运行代码。

what_he_does = ' plays ' his_instrument = 'guitar' his_name = 'Robert Johnson'
artist_intro = his_name + what_he_does + his_instrumentprint(artist_intro)

你会发现输出了这样的结果:

也许你会觉得无聊,但实际上这段代码加上界面之后是下图这样的,类似于你在音乐播放器里面经常看到的样子。Robert Johnson是著名的美国蓝调吉他手,被称为与魔鬼交换灵魂的人。
也许你已经注意到了,上面我们说到变量的时候,有些变量被进行不同形式的赋值。我们现在试着在 lDE 中这样做:

num = 1
string = '1'print(num + string)

你一定会得到如下的结果,原因是字符串(string) 只是Python中的一种数据类型,另一种数据类型则称之为整数(integer),而不同的数据类型是不能够进行合并 的,但是通过一些方法可以得到转换。

插一句,如果你不知道变量是什么类型, 可以通过type() 函数来查看类型。如下演示。另外, 由于中文注释会导致报错, 所以需要在文件开头加一行魔法注释#coding:utf-8,也可以在设置里面找到“File Encodings"设置为 UTF-8。

print(type(word)) #IDE中

接下来,我们来转化数据数据类型。我们需要将转化后的字符串储存在另一个变量中,试着输入这些:


num = 1
string = '1'
num2 = int(string)print(num + num2)

这样被转换成了同种类型之后,就可以合并这两个变量了。
我们来做-些更有意思的事情,既然字符串可以相加,那么字符串之间能不能相乘2当然可以!输入代码:

words = 'words' * 3 print(words)wordswordswords

好,现在我们试着解决-个更复杂的问题:

word = 'a loooooong word' num = 12
string = 'bang!'
total = string * (len(word) - num) #等价于字符串'bang!'*4 print(total)

到这里,你就掌握了字符串最基本的用法了,Bang!

3.3.2 字符串的分片与索引

字符串可以通过 string[x] 的方式进行索引、分片,也就是加一个 []。字符串的分片(slice)实际上可以看作是从字符串中找出来你要截取的东西,复制出来一小段你要的 长度,储存在另一个地方,而不会对字符串这个源文件改动。分片获得的每个字符串可以看作是原字符串的一个副本。
先来看下面这段代码。如果你对字符串变量后面一些莫名其妙的的数字感到困惑和没有头绪的话,不妨对照着代码下面的这个表格来分析。

好,现在我们试着解决一个更复杂的问题,来做一个文字小游戏叫做——“找出你朋友中的魔鬼"。输入代码:

word = 'friends' find_the_evil_in_your_friends = \
word[0]+word[2:4]+word[-3:-1] print(find_the_evil_in_your_friends)

注:过长的代码段可以使用('来进行换行,属于一行的代码同时会有一个缩进代表是一行的, 如果是在lDE中只要按"enter"就能自动换行,很方便吧!

3.3.3 字符串的方法

Pvthon 是面向对象进行编程的语言,而对象拥有各种功能、特性,专业术语称之为
yy方法(Method)。为了方便理解,我们假定日常生活中的车是"对象",即
car。然后众所周知,汽车有着很多特性和功能,其中—开’就是汽车一个重要功能,于是汽车这个对象使用—开’这个功能,我们在Pvthon 编程中就可以表述成这样: car.driⅤe()


在理解了对象的方法后,我们来看这样一个场景。很多时候你使用手机号在网站注册账户信息,为了保证用户的信息安全性,通常账户信息只会显示后四位,其余的用"*"来代替,我们试着用字符串的方法来完成这一个功能

输入代码:

phone_number = '1386-666-0006'
hiding_number = phone_number.replace(phone_number[:9],'*' * 9) print(hiding_number)

其中我们使用了一个新的字符串方法 replace()进行"遮挡"。replace方法的括号中,第一个phone_number[:9]代表要被替换掉的部分,后面的'*'*9表示将要替换成什么字符,也就是把乘以9,显示9个
你会得到这样的结果:*********0006
现在我们试着解决一个更复杂的问题,来模拟手机通讯簿中的电话号码联想功能

输入代码:

search = '168'
num_a = '1386-168-0006'
num_b = '1681-222-0006'print(search + ' is at ' + str(num_a.find(search)) + ' to '+ str(num_a.find(search) + len(search)) + ' of num_a') print(search + ' is at ' + str(num_b.find(search)) + ' to '+ str(num_b.find(search) + len(search)) + ' of num_b')

你会得到这样的结果,代表了包含168的所有手机号码

3.3.4 字符串格式化符


这样的填空题会让我们印象深刻,当字符串中有多个这样的"空"需要填写的时候,我们可以使用.format()进行批处理,它的基本使用方法有如下几种,输入代码:

print('{} a word she can get what she {} for.'.format('With','came'))
print('{preposition} a word she can get what she {verb} for'.format(preposition = 'With',verb = 'came')) print('{0} a word she can get what she {1} for.'.format('With','came'))

这种字符串填空的方式使用很广泛,例如下面这段代码可以填充网址中空缺的城市数据:

city = input("write down the name of city:")
url = "http://apistore.baidu.com/microservice/weather?citypinyin={}".format(city)

注:这是利用百度提供的天气api实现客户端天气插件的开发的代码片段

好了,到这里你就掌握了变量和字符串的基本概念和常用方法。下一步,我们会继续学习更深一步的循环与函数。

第四章 最基本的魔法函数

4.1 重新认识函数

我们先不谈 Python 中的函数定义,因为将定义放在章节的首要位置,这明显就是懒得把事情讲明白的做法,相信你在阅读其他教材时对这点也深有体会。所以我要说的是,经过第一章的阅读与训练,其实你早已掌握了函数的用法:


通过观察规律其实不难发现,Python 中所谓的使用函数就是把你要处理的对象放到一个名字后面的括号里就可以了。简单的来说,函数就是这么使用,可以往里面塞东西就得到处理结果。这样的函数在 Python 中还有这些:

以最新的3.50 版本为例, 一共存在68 个这样的函数, 它们被统称为内建函数(Built_in Functions)。之所以被称之为内建函数,并不是因为还有“外建函数"这个概念,内建的意思是这些函数在3.50版本安装完成后你就可以使用它们,是“自带"的而已。千万不要为这些术语搞晕了头,随着往后学习,我们还能看见更多这样的术语, 其实都只是很简单的概念,毕竟在一个专业领域内为了表达准确和高效往往会使用专业术语。
现在你并不必急着把这些函数是怎么用的都搞明白,其中一些内建函数很实用, 但是另外一些就不常用,比如涉及字符编码的函数ascii(),bin(),chr()等等,这些都 是相对底层的编程设计中才会使用到的函数,在你深入到一定程度的时候才会派的上用场。
附上 Python官网中各个函数介绍的链接:https://docs.Python.org/3/library/
functions.html,有兴趣深入了解的话可以看一眼。

4.2 开始创建函数

我们需要学会使用已有的函数,更需要学会创建新的函数。自带的函数数量是有限的,想要让 Python 帮助我们做更多的事情,就要自己设计符合使用需求的函数。创建函数也很简单,其实我们在多年前的初中课堂上早已掌握了其原理。
先试着在命令行/终端中进入 Python 环境,输入这样的公式:

看着有点眼熟吧,第一个是数学的梯形计算公式,而第二个是物理的摄氏度与华氏度的转换公式。

函数是编程中最基本的魔法,但同时一切的复杂又都被隐含其中。它的原理和我们学习的数学公式相似,但是并不完全一样,等到后面一点你就知道我为什么这么说了。这里面先介绍几个常见的词:

  • def(即 de’ne,定义)的含义是创建函数,也就是定义一个函数。
  • arg 数即 argument,参数(有时你还能见到这种写法:parameter,二者都是参数的意思但是稍有不同,这里不展开说了。
  • return 即返回结果。
    好,现在我们读一遍咒语:De’ne a function named ‘function· which has two arguments : arg1 and arg2,returns the result——‘Something· 是不是很易读很顺畅?代码的表达比英文句子更简洁一点:

    需要注意的是:
  • def 和 return 是关键字(keyword),Python
    就是靠识别这些特定的关键字来明白用户的意图,实现更为复杂的编程。像这样的关键字还有一些,在后面的章节中我们会细致讲解;
  • 在闭合括号后面的冒号必不可少,而且非常值得注意的是你要使用英文输入法进行输入,否则就是错误的语法,如果你在lDE中输入中文的冒号和括号,会有这样的错误提示:
  • 如果在lDE中冒号后面回车(换行)你会自动地得到一个缩进。函数缩进后面的语句被称作是语句块(block),缩进是为了表明语句和逻辑的从属关系,是 Python 最显著的特征之一,有些语言会用花括号表示从属关系,这大大降低了代码的可读性, 因此珍爱生命从缩进开始。

现在我们看一下之前提到的摄氏度转化公式,按照上面定义函数的方法来实现一遍。我们把摄氏度转化定义为函数e_grcngcit Convcrtcr(),那么将输入进去的必然是摄氏度(CcIsius)的数值,我们把 C设为参数,最后返回的是华氏度(e_grcngcit)的数值,我们用下面的函数来表达,输入代码:

def fahrenheit_converter(C):
fahrenheit = C * 9/5 + 32
return str(fahrenheit) + '˚F'

注:计算的结果类型是int,不能与字符串"oF"相合并,所以需要先用str()函数进行转换

输入完以上代码后,函数定义完成,那么我们开始使用它。我们把使用函数这种行为叫做"调用"(a_II),你可以简单地理解成你请求 Pytgon 给你帮忙去做一件事情,就像是我们之前学习到的函数 Icn()一样:“请帮我测量这个(对象)的长度,并将结果打印出来。”

lyric_length = len('I Cry Out For Magic!')
print(lyric_length)

就像我们使用Icn()函数一样,下面这段代码意味着——"请使用摄氏度转换器将35 摄氏度转换成华氏度,将结果储存在名为C2F的变量并打印出来。"这样我们就完成了函数的调用同时打印了结果。

C2F = fahrenheit_converter(35)
print(C2F)

对应的结果应该是95.0oF,你可以找一个摄氏度转换器计算一下,下面是我使用M_a 自带的SpotIifgt 的计算结果

好,到了这里函数的定义和基本用法你就已经了解,在很长一段时间内你知道上面所讲的这些内容就基本够用了,但为了让你在深入使用函数的时候不产生困惑和挣扎,接下来我们试着解决一个更复杂的问题。
我们把刚才的函数按照如下进行修改:

def fahrenheit_converter(C):
fahrenheit = C * 9/5 + 32
print(str(fahrenheit) + '˚F')

怎么样?看上去很相似吧?没错,我们仅仅就是把最后一行的 return 换成了print 函数,一个很小的改动,而且似乎 IDE 也并没有对语法进行报错预警,那么我们来试一下调用函数会是什么情况吧:

C2F = fahrenheit_converter(35)
print(C2F)

运行起来的结果是这样的:

为什么会这样?
其实,得到这样的结果是因为 print 是一个函数,并非关键字(如果你的print不是函数那说明你的版本还停留在2.x系列,现在就赶紧安装3.0以上的版本!)。如果你足够细心的话可以发现,在我的IDE中,虽说 print 与 return 它们都是蓝色,但实际是有区分的:一个是正常体,一个是斜体。return作为关键字在函数中起到了返回值的作用,而 print 顾名思义,只是在函数中展示给我们打印的结果,是为人类设计的函数。因此上面的 95.0oF 实际上是调用函数后产生的数值,而下面的 None 正是此时变量 C2F 中所被返回到的数值——什么都没有,就因为没有关键字 return 。这就好比你对着一个人喊了一声他的名字(call),他只是“哎"地回应你一声,这是因为你并没有告诉他该做什么(return)。
没有 return 也没关系,不代表没有用,在 Python 中 return 是可选的(optional),这意味着你可以不用写 return 也可以顺利地定义一个函数并使用, 只不过返回值是‘None’罢了。在后面我们还能见到不同使用方式的函数,这里只需要记住函数的基本设定即可。
在前面我们提到过,定义一个函数使用 def(de"ne),同时我们还能在各种教材不同版本的翻译中看到声明(declare)这个词,我们不难推测,从表达的目的上来 说他们是一样的,而对于有其他语言基础的人来说这两个词意味着两种不同的行为。其实没关系,在 Python 中de"nition 和declaration 是一体的,在这里说明仅仅是为了解答有此困惑的人,深究则无意。

4.3 传递参数与参数类型

前面大刀阔斧地说了关于函数定义和使用,在这—节我们谈论—些细节但是重要的问题一一参数。对于在—开始就设定了必要参数的函数来说,我们打出函数的的名称并向括号中传递参数实现对函数的调用(b_II), 只要把参数放进函数的括号中即可,就像是这样:

fahrenheit_converter(35)
fahrenheit_converter(15)
fahrenheit_converter(0)
fahrenheit_converter(-3)

事实上,传递参数的方式有两种:

现在从似乎被我们遗忘的梯形的数学公式开始入手,首先还是创建函数。
我们把函数的名称定为tr_ pd zo ic _ rd _, 也就是梯形面积, 设定参数为a_sd up(上底),a_sd cown(下底),hdieht(高)每—个都用英文输入法的逗号隔开。梯形的面积需要知道这三个值才能求得,因此对于构造梯形面积函数来说, 这三个参数缺—不可。


def trapezoid_area(base_up, base_down, height):
return 1/2 * (base_up + base_down) * height

接下来我们开始调用函数。


trapezoid_area(1,2,3)

不难看出,填入的参数l,2,3分别对应着参数a_sd up,a_sd cown和hdieht。这种传入参数的方式被称作为位置参数
接着是第二种传入方式:


trapezoid_area(base_up=1, base_down=2,    height=3)

更直观地,在调用函数的时候,我们将每个参数名称后面赋予—个我们想要传入的值。这种以名称作为——对应的参数传入方式被称作是关键词参数
想—想去餐厅预约与就餐的流程,找到你预约的座位—般是用你留下的姓名,你就是—个参数,你会被按照姓名的方式传入你预定的座位,这个就是关键词参数传入;接下来是上菜,菜品按照你的座位号的方式来传入你的桌子,而这就相当于是位置传入参数。
也许你现在想不太明白这种传入的方式有何作用,没有关系,在后面我们会和其他知识再—并进行讲解的,到那时你就会对参数的传入方式有更高层次的认识。
避免混乱的最好方法就是先制造混乱,我们试着解决—个更复杂的问题,按照下面几种方式调用函数并打印结果

  • 第—行的函数参数按照反序传入,因为是关键词参数,所以并不影响函数正常运作;
  • 第二行的函数参数反序传入,但是到了第三个却变成了位置参数,遗憾的是这种方式是错误的语法,因为如果按照位置来传入,最后—个应该是参数height的位置。但是前面height已经按照名称传入了值3,所以是冲突的。
  • 第三行的函数参数正序传入,前两个是以关键词的方式传入,最后—个以位置参数传入,这个函数是可以正常运行的;
  • 第四行的函数参数正序传入,前两个是以位置的方式传入,最后—个以关键词参数传入,这个函数是可以正常运行的。

注:正确运行的结果应该是4.5,也就是这个梯形的面积。

我们现在给一组变量赋值,然后再调用函数:

base_up = 1
base_down = 2
height = 3trapezoid_area(height, base_down, base_up)

然而这次函数调用的结果应该是2.5,为什么是2?
如果你有这样的困惑,说明你已经被参数的命名和变量的命名搞晕,我们来把这两者区分清晰。首先,我们在定义函数的时候会定义参数的名称,其主要作用就是方便我们在使用函数时指导我们将传入什么参数,它们从哪里来,是什么类型等,提供与使用函数使用相关的上下文。下面这段代码也许能够帮助你理解函数来自参数名称的困扰:

def flashlight (battery1, battery2):
return 'Light!'

我们定义一个叫做手电筒(nashlight)的函数,它需要两个参数battery1和battery2意为电池。这时候你去商店买电池 买回了两节600毫安时的南孚电池于是:

nanfu1 = 600
nanfu2 = 600flashlight(nanfu1, nanfu2)

看明白了吗?南孚是电池的一种,是可以让手电筒发光的东西,将南孚电池放入就意味着我们放入了手电筒所需的电池,换句话说,nanfu1,nanfu2是变量,同时也 是满足能够传入的函数的nashlight 函数的参数, 传入后就代替了原有的battery1 和battery2 且传入方式仍旧是位置参数传入。battery1 和battery2 只是形式上的的占位符,表达的意思是函数所需的参数应该是和电池即battery有关的变量或者是对象。



你看到的这个魔法就是我们将要提到的神奇的默认参数。默认参数是可选的,这意味着即使你上来不给它传入什么东西函数还是可以正常运作。
你只需要这样输入代码:

def trapezoid_area(base_up, base_down, height=3):
return 1/2 * (base_up + base_down) * height

给一个参数设定默认值非常简单,我们只需要在定义参数的时候给参数赋值即可。这个也许跟传入参数的方式有点像,但是千万别记混了!这可是在定义的时候做的事情! 这样一来,我们只需要传入两个参数就可以正常进行了:

trapezoid_area(1, 2)

你肯定会疑惑,如果设定默认值的话,那么所有梯形的高岂不是都固定成3了啊2 然而并没有,默认值的理念就是让使用函数尽可能的简单、省力。正如同我们安装软件都会有默认目录,但是如果你又想安装在其他地方,你可以选择自定义修改。之前看到的print函数的小把戏也正是如此,print的可选参数sep(意为每个打印的结果以.分开)的默认值为‘ '空格,但是我们将其重新传入‘/n’也就是换行的意思,一句话说,也就是将每个打印的数以换行符号进行分割。下面我们来调用自己的参数:

trapezoid_area(1, 2, height=15)

只需要传入我们想要的值就可以了,就是这么简单。
默认值并非是你掌握参数使用的必要知识,却是能帮助我们节省时间的小技巧。在实际项目中也经常会看见这样:

requests.get(url, headers=header)

注:这个是在请求网站时 header,可填可不填

img.save(img_new, img_format, quality=100)

注:这是在给图片加水印的时候默认的水印质量是100

4.4 设计自己的函数

到了这里,我们应该可以十分有自信地设计—个符合自己项目需求的函数了,我们将上面各种所有知识进行整合,来设计—个简易的敏感词过滤器,不过在这之前先来认识—个新的函数一一open。
这个函数使用起来很简单,只需要传入两个参数就可以正常运转了:文件的完整路径和名称,打开的方式。
先在桌面上创建—个名为 text.txt 的文件。Wlndows 用户在桌面点击右键唤出菜单创建即可,Mac 用户则打开 Pages 创建文件后点击导出格式选择 txt 格式即可。现在我们使用 open 函数打开它:

open('/Users/Hou/Desktop/text.txt')

如果是 Windows 用户,应该像这样写你的路径:

open('C://Users/Hou/Desktop/')

如果你照着代码敲入的话其实这时候文件应该已经是打开的了, 但是… 貌似我们看不出来,所以,我们再认识—个新的方法一一write。在第—章我们已经提到过如何使用方法(如果你现在困惑函数和方法到底是什么关系的话,为了顺利地往后进行, 我可以告诉你方法就是函数的—种,只不过在不同的位置而已,使用原理和函数非常相似),在这里我们就照抄第三章的 repIace 用法来学着使用 write 方法:

file = open('/Users/Hou/Desktop/text.txt','w')
file.write('Hello World')

写完后我们运行程序看看效果:

掌握了 opdn 与 writd 的基本用法之后,我们就可以开始着手设计函数了,需求是这样的︰传入参数 n一md 与 mse 就可以控制在桌面写入的文件名称和内容的函数tdⅩt ard一td,并且如果当桌面上没有这个可以写入的文件时,那么就要创建—个之后再写入。现在我们开搞吧↓

1.def text_create(name, msg):
2.desktop_path = '/Users/Hou/Desktop/'
3.full_path = desktop_path + name + '.txt'
4.file = open(full_path,'w')
5.file.write(msg)
6.file.close()
7.print('Done')
8.text_create('hello','hello world') # 调用函数

我们来逐行解释这段代码。
第—行︰定义函数的名称和参数;
第二行︰我们在最开始知道,opdn 函数要打开—个完整的路径,所以首先是桌面路径;
第三行︰我们给文件起什么名字,就是要传入的参数加上桌面路径再加上后缀就是完整的文件路径了;
第四行︰打开文件,'w'参数代表作为写入模式,意思是︰如果没有就在该路径创建—个有该名称文本,有则追加覆盖文本内容;
第五行︰写入传入的参数 mse,即内容; 第六行︰关闭文本。
这样—来敏感词过滤器的第—部分我们就完成了。顺带—提,这个函数就是我们在前面提及到的并不需要 rdtUrn 也能发挥作用的函数,最后的 print 仅仅是为了表明上面的所有语句均已执行,—个提示而已。接下来我们实现第二部分,敏感词过滤, 需求是这样的︰定义—个为函数tdⅩt 巾Itdr的函数,传入参数 worc,adnaordc worc和ah 一nedc worc 实现过滤, 敏感词adnaordc worc 默认为‘ I一md ’, 替换词
ah一nedc worc默认为‘Awdsomd’。现在继续︰

def text_filter(word,censored_word = 'lame',changed_word = 'Awesome'): return word.replace(censored_word, changed_word)
text_filter('Python is lame!')    # 调用函数

这个函数就简单的多了,第—行我们按照设定默认参数的方式来定义函数,第二行直接返回使用rdpI一ad处理后的结果。现在两个函数均已完成,本着低风险的原则, 你可以尝试调用—下函数看看返回结果。
现在我们试着解决一个更复杂的问题, 把两个函数进行合并: 创建一个名为text censored cre一te 的函数,功能是在桌面上创建一个文本可以在其中输入文字, 但是如果信息中含有敏感词的话将会被默认过滤后写入文件。其中文本的文件名参数为 n一me,信息参数为 msg,你可以先试着自己写一下,写完了再对照看下:

def censored_text_create(name, msg): clean_msg = text_filter(msg) text_create(name,clean_msg)
censored_text_create('Try','lame!lame!lame!') # 调用函数

我们使用第一个函数将传入的 msg 进行过滤后储存在名为 cle一n msg 的变量中,再将传入的 n一me 文件名参数和过滤好的文本 cle一n msg 作为参数传入函数 text cre一te 中,结果我们会得到过滤后的文本。
完成之后,你就会得到一个文本过滤器了!
在本章中我只是借助数学阐明了函数的运作方式而已,但是如果你确实需要解决许多数学上的问题,在这里我可以给你一个基本的参考表格,至于怎么用,多尝试就知道了。一定要敢于尝试,毕竟电脑也不会因为你的一行代码而爆炸。

第五章 循环与判断

5.1 逻辑控制与循环

5.1.1 逻辑判断——True& False

逻辑判断是编程语言最有意思的地方,如果要实现一个复杂的功能或程序,逻辑判断必不可少。if-else 结构就是常见的逻辑控制的手段,当你写出这样的语句的时候,就意味着你告诉了计算机什么时候该怎么做,或者什么是不用做的。学完了前面 几章内容之后,现在的你也许早已对逻辑控制摩拳擦掌、跃跃欲试,但是在这之前我 们需要先了解逻辑判断的最基本准则——布尔类型(Boolean Type)。
在开始前,我想强调一点,如果你怀疑自己的逻辑能力,从而对本章的内容感到畏惧的话,我可以负责任地说,没有人是“没有逻辑的",正如我们可以在极其复杂的现实世界中采取各种行动一样,你所需要的只不过是一些判断的知识和技巧而已。
布尔类型(Boolean)的数据只有两种,True 和 False (需要注意的是首字母大写)。人类以真伪来判断事实,而在计算机世界中真伪对应着的则是1和0。
接下来我们打开命令行/终端进入 Python 环境,敲入这些代码,或者直接在PyCharm 中选择 Python Console ,这样会更方便展示结果。True & False 这一小节的内容我们都在命令行/终端环境里输入代码。

1>2
1<2<3
42 != '42'
'Name' == 'name' 'M' in 'Magic'
number = 12
number is 12

我们每输入—行代码就会立即得到结果,这几行代码的表达方式不同,但是返回结果却只有 True 和FaIse 这两种布尔类型,因此我们称但凡能够产生一个布尔值的表达式为布尔表达式(Boolean Expressions)。
可以看到,上面这些能够产生布尔值的方法或者公式不尽相同,那么我们来——讲解这些运算符号的意义和用法。

5.1.2 比较运算(Comparison)

对于比较运算符,顾名思义,如果比较式成立那么则返回 True,不成立则返回FaIse。

除了一些在数学上显而易见的事实之外,比较运算还支持更为复杂的表达方式, 例如:
多条件的比较。先给变量赋值,并在多条件下比较大小:

middle = 5
1 < middle < 10

变量的比较。将两个运算结果储存在不同的变量中,再进行比较:

two = 1 + 1
three = 1 + 3 two < three

字符串的比较。其实就是对比左右两边的字符串是否完全一致,下面的代码就是不一致的,因为在 Python 中有着严格的大小写区分:

'Eddie Van Helen' == 'eddie van helen'

两个函数产生的结果进行比较:比较运算符两边会先行调用函数后再进行比较, 其结果等价于 10 > 19 :

abs(-10) > len('length of this word')

注:abs( )是一个会返回输入参数的绝对值的函数。

5.1.3 比较运算的一些小问题

不同类型的对象不能使用"<,>,<=,>=“进行比较,却可以使用’= =‘和’!=',例如字符串和数字:

需要注意的是,浮点和整数虽是不同类型,但是不影响到比较运算:

你可能会有一个疑问,“为什么 1 = 1 要写作 1 = = 1 2”,前面提及过 Python 中的符号在很多地方都和数学中十分相似,但又不完全一样。”=“在 Python 中代表着赋值,并非我们熟知的"等于”。所以,“1 = 1"这种写法并不成立,并且它也不会给你返回一个布尔值。使用”=="这种表达方式,姑且可以理解成是表达两个对象的值是 相等的, 这是一种约定俗成的语法,记得就可以了。
比较了字符串、浮点、整数.还差一个类型没有进行比较:布尔类型,那么现在实验一下:

True > False
True + False > False + False

这样的结果又怎么理解呢2还记得前面说过的吗,True 和False 对于计算机就像是1和0一样,如果在命令行中敲入True + True + False 查看结果不难发现,True = 1, False = 0 也就是说,上面这段代码实际上等价于:

1 > 0
1 + 0 > 0 + 0

至于为什么是这样的原因,我们不去深究,还是记得即可。
最后一个小的问题,如果在别的教材中看到类似 1<>3 这种表达式也不要大惊小怪,它其实与 1!=3 是等价的,仅仅知道就可以,并不是要让你知道"茴字的四种写法"。

5.1.4 成员运算符与身份运算符(Membership & 1dentify 0perators)

成员运算符和身份运算符的关键词是 in 与 is。把 in 放在两个对象中间的含义是,测试前者是否存在于 in 后面的集合中。说到集合,我们先在这里介绍一个简单易懂的集合类型——列表(List)。
字符串、浮点、整数、布尔类型、变量甚至是另一个列表都可以储存在列表中, 列表是非常实用的数据结构,在后面会花更多篇幅来讲解列表的用法,这里先简单了解一下。
创建—个列表,就像是创建变量—样,要给它起个名字:

album = []

此时的列表是空的,我们随便放点东西进去,这样就创建了—个非空的列表:

album = ['Black Star','David Bowie',25,True]

这个列表中所有的元素是我们—开始放好的,那当列表创建完成后,想再次往里面添加内容怎么办2使用列表的 append 方法可以向列表中添加新的元素,并且使用这种方式添加的元素会自动地排列到列表的尾部:

album.append('new song')

接着就是列表的索引,如果在前面的章节你很好的掌握了字符串的索引,相信理解新的知识应该不难。下面代码的功能是打印列表中第—个和最后—个元素:

print(album[0],album[-1])

接下来我们使用 in 来测试字符串‘Black Star’ 是否在列表 album 中。如果存在则会显示 True,不存在就会显示 False 了:

'Black Star' in album

是不是很简单2正如前面看到的那样,in 后面是—个集合形态的对象,字符串满足这种集合的特性,所以可以使用 in 来进行测试。
接下来再来讲解 is 和is not,它们是表示身份鉴别(Identify Operator)的布尔运算符,in 和 not in 则是表示归属关系的布尔运算符号(Membership Operator)。
在 Python 中任何—个对象都要满足身份(Identity)、类型(Type)、值 (Value)这三个点,缺—不可。is 操作符号就是来进行身份的对比的。试试输入这段代码:

你会发现在两个变量—致时,经过 is 对比后会返回 True。
其实在 Pxthon 中任何对象都可判断其布尔值,除了 )、Fone 和所有空的序列与集合(列表,字典,集合)布尔值为Balse 之外,其它的都为 True ,我们可以使用函数 bool( ( 进行判别:

bool(0)  #False
bool([])    #False
bool('') #False
bool(False) #False
bool(None)  #False

可能有人不明白,为什么一个对象会等于 Fone。还记得在函数那章的敏感词过滤器的例子吗?在定义函数的时候没有写 return 依然可以使用,但如果调用函数,企图把根本就不存在的y返回值" 储存在一个变量中时, 变量实际的赋值结果将是Fone。
当你想设定一个变量,但又没想好它应该等于什么值时,你就可以这样:

a_thing = None

5.1.5 布尔运算符(<oolean Operators)


and 和or 经常用于处理复合条件,类似于 0 3 n 3 1 ,也就是两个条件同时满足。

1 < 3 and  2 < 5   #True
1 < 3 and  2 > 5  #False 1 < 3 or  2 > 5    #True
1 > 3 or  2 > 5   #False

5.2 条件控制

条件控制其实就是 if…else 的使用。先来看下条件控制的基本结构:

第1行:定义函数,并不需要参数; 第2行:使用 input 获得用户输入的字符串并储存在变量 password 中;
第3、4行:设置条件,如果用户输入的字符串和预设的密码12345相等时,就执 行打印文本‘Login success1’;
第5、6行:反之,一切不等于预设密码的输入结果,全部会执行打印错误提示, 并且再次调用函数,让用户再次输入密码; 第7行:运行函数。
第8行:调用函数

值得一提的是,如果 if 后面的布尔表达式过长或者难于理解,可以采取给变量赋值的办法来储存布尔表达式返回的布尔值 Tr.e 或 FaIue。因此上面的代码可以写成这样:

一般情况下,设计程序的时候需要考虑到逻辑的完备性,以及可能会对用户造成困扰的情况进行预防性设计,这时候就会有多条件判断。
多条件判断同样很简单,只需在 if 和eIue 之间增加上 eIif,用法和 if 是一致的。而且条件的判断也是依次进行的,首先看条件是否成立,如果成立那么就运行下面的代码,如果不成立就接着顺次地看下面的条件是否成立.如果都不成立则运行 eIue 对应的语句。

接下来我们使用 elif 语句来给刚才设计的函数增加一个重置密码的功能:

第1行:创建一个列表,用于储存用户的密码、初始密码和其他数据(对实际数据 库的简化模拟);
第2行:定义函数;
第3行:使用 input 获得用户输入的字符串并储存在变量 password 中;
第4行:当用户输入的密码等于密码列表中最后一个元素的时候(即用户最新设定的密码),登录成功;
第5-9 行: 当用户输入的密码等于密码列表中第一个元素的时候( 即重置密码的“口令")触发密码变更,并将变更后的密码储存至列表的最后一个,成为最新的用户密码;
第10行:反之,一切不等于预设密码的输入结果,全部会执行打印错误提示,并且 再次调用函数,让用户再次输入密码;
第11行:调用函数。
在上面的代码中其实可以清晰地看见代码块(Code Block)。代码块的产生是由于缩进,也就是说,具有相同缩进量的代码实际上是在共同完成相同层面的事情,这有点像是编辑文档时不同层级的任务列表。

5.3 循环(Loop)

5.3.1 for 循环

我们先来看一个例子,输入代码:

for every_letter in 'Hello world':
print(every_letter)


为了更深入了解 for 循环,试着思考这个问题,如何打印出这样的结果?

songslist = ['Holy Diver', 'Thunderstruck', 'Rebel Rebel']
for song in songslist:
if song == 'Holy Diver':
print(song,' - Dio')
elif song == 'Thunderstruck':
print(song,' - AC/DC')
elif song == 'Rebel Rebel':
print(song,' - David Bowie')

在上述代码中,将 songslist 列表中的每-个元素依次取出来,并分别与三个条件做比较,如果成立则输出相应的内容。

5.3.2 嵌套循环

在编程中还有—种常见的循环,被称之为嵌套循环(Nested Loop),其实这种循环并不复杂而且还非常实用。我们都学过乘法口诀表,又称"九九表",接下来我们就用嵌套循环实现它:

5.3.3 whiIe 循环

Python 中有两种循环,第一种 for 循环我们已经介绍过了,第二种则是 whiIe 循环。它们的相同点在于都能循环做一件重复的事情,不同点在于 for 循环会在可迭代的序列被穷尽的时候停止,whiIe则是在条件不成立的时候停止,因此 whiIe 的作用概括成一句话就是:只要…条件成立,就一直做…


除此之外,让 while 循环停下来的另外一种方法是:改变使循环成立的条件。为了解释这个例子,我们在前面登录函数的基础上来实现,给登录函数增加一个新功能:输入密码错误超过3次就禁止再次输入密码。

这段代码只有三处与前面的不—样:
第4~5行:增加了whiIe 循环, 如果 tries > 0 这个条件成立,那么便可输入密码,从而执行辨别密码是否正确的逻辑判断;
第20~21行:当密码输入错误时,可尝试的次数 tries 减少 1;
第23~24行:whiIe 循环的条件不成立时,就意味着尝试次数用光,通告用户账户被锁。
在这里 whiIe 可以理解成是 if 循环版,可以使用 whiIe-eIse 结构,而在 whiIe代码块中又存在着第二层的逻辑判断, 这其实构成了嵌套逻辑( N e s t e d Condition)。

5.3.4 综合练习题

我们已经基本学完了逻辑判断和循环的用法,现在开始做—点有意思的事情:设计—个小游戏猜大小,这个在文曲星上的小游戏陪伴我度过了小学时的无聊时光。
在此之前,还是先行补充—些必要知识。
首先,创建—个列表,放入数字,再使用 sum() 函数对列表中的所有整数求和, 然后打印,结果是6,这应该很好理解:



首先,我们先来构造可以摇骰子的函数 roII dice 。这个函数其实并不需要输入任何参数,调用后会返回储存着摇出来三个点数结果的列表。

1● import  random
2● def  roll_dice(numbers=3, points=None): 3● print('<<<<< ROLL THE DICE! >>>>>')
4●  if  points  is  None:
5●  points = []
6●  while  numbers  > 0:
7●  point = random.randrange(1,7)
8●  points.append(point)
9●  numbers = numbers  - 1
10● return  points

第2行:创建函数,设定两个默认参数作为可选,numbers——骰子数量,
points——三个筛子的点数的列表; 第3行:告知用户开始摇骰子;
第4~5行:如果参数中并未指定 points,那么为 points 创建空的列表;
第6~9行:摇三次骰子,每摇—次 numbers 就减 1 ,直至小于等于 0 时,循环停止;
第10行:返回结果的列表。

接着,我们再用—个函数来将点数转化成大小,并使用 if 语句来定义什么是"大",什么是"小":

第1行:创建函数,其中必要的参数是骰子的总点数;
第2~3行:设定"大"与"小"的判断标准;
第4~7行:在不同的条件下返回不同的结果。
最后,创建一个开始游戏的函数,让用户输入猜大小,并且定义什么是猜对, 什么是猜错,并输出对应的输赢结果。

第1行:创建函数,并不需要什么特殊参数;
第2行:告知用户游戏开始;
第3行:规定什么是正确的输入;
第4行:将用户输入的字符串储存在 your _eoh_d中;
第5、13~15行:如果符合输入规范则往下进行,不符合则告知用户并重新开始; 第6行:调用 roii ch_d函数,将返回的列表命名为 pohnts;
第7行:点数求和;
第8行:设定胜利的条件——你所选的结果和计算机生成的结果是一致的;
第9~12行:成立则告知胜利,反之,告知失败;
第16行:调用函数,使程序运行。
完成这个小游戏之后,你就可以试着和自己设计的程序玩猜大小了。同时你也掌握了循环和条件判断混用的方法,初步具备了设计更复杂的程序的能力了。

第六章 数据结构

6.1 数据结构(Data structure)

正如在现实世界中一样,直到我们拥有足够多的东西,才迫切需要一个储存东西的容器,这也是我坚持把数据结构放在最后面的原因——直到你掌握足够多的技能, 可以创造更多的数据,你才会重视数据结构的作用。这些储存大量数据的容器,在Python 称之为内置数据结构(BuiIt-in Data Structure)。
我们日常使用的网站、移动应用,甚至是手机短信都依赖于数据结构来进行存储,其中的数据以一种特定的形式储存在数据结构中,在用户需要的时候被拿出来展现。

Python 有四种数据结构,分别是:列表、字典、元组,集合。每种数据结构都有自己的特点,并且都有着独到的用处。为了避免过早地陷入细枝末节,我们先从整体上来认识一下这四种数据结构:

6.2 列表(list)

首先我们从列表开始,深入地讲解每一种数据结构。列表具有的最显著的特征
是:

1.列表中的每-个元素都是可变的;
2.列表中的元素是有序的,也就是说每-个元素都有一个位置;
3.列表可以容纳 Python 中的任何对象。

列表中的元素是可变的,这意味着我们可以在列表中添加、删除和修改元素。 列表中的每—个元素都对应着—个位置,我们通过输入位置而查询该位置所对应的值,试着输入:

Weekday =['Monday','Tuesday','Wednesday','Thursday','Friday']
print(Weekday[0])

第三个特征是列表可以装入 Python 中所有的对象,看下面的例子就知道了:

6.3 列表的增删改查

对于数据的操作,最常见的是增删改查这四类。从列表的插入方法开始,输入:

fruit = ['pineapple','pear']
fruit.insert(1,'grape')
print(fruit)



接下来我们用元素周期表来试验—下:

periodic_table = ['H','He','Li','Be','B','C','N','O','F','Ne'] print(periodic_table[0])
print(periodic_table[-2])
print(periodic_table[0:3])
print(periodic_table[-10:-7])
print(periodic_table[-10:])
print(periodic_table[:9])

你会发现列表的索引和字符串是—样的,十分简单对吧?但是如果要是反过来, 想要查看某个具体的值所在的位置,就需要用别的方法了,否则就会报错:

6.4 字典

编程世界中其实有很多概念都基于现实生活的原型,字典这种数据结构的特征也正如现实世界中的字典一样,使用名称-内容进行数据的构建,在 Pyteol 中分别对应着键(hay)-值(vPkua),习惯上称之为键值对。
字典的特征总结如下:

想必一次次的报错会让你深深的记住这两个特征: key 和 value 是一一对应的,key 是不可变的。
同时字典中的键值不会有重复,即便你这么做,相同的键值也只能出现一次:

a = {'key':123,'key':123}
print(a)

6.5 字典的增删改查

首先我们按照映射关系创建一个字典,继续使用前面的例子:

NASDAQ_code = {'BIDU':'Baidu','SINA':'Sina'}

6.6 元组

元组其实可以理解成一个稳固版的列表,因为元组是不可修改的,因此在列表中的存在的方法均不可以使用在元组上,但是元组是可以被查看索引的,方式就和列表一样:

letters = ('a','b','c','d','e','f','g')
letter[0]

6.7 集合

集合则更接近数学上集合的概念。每一个集合中的元素是无序的、不重复的任意对象,我们可以通过集合去判断数据的从属关系,有时还可以通过集合把数据结构中重复的元素减掉。
集合不能被切片也不能被索引,除了做集合运算之外,集合元素可以被添加还有删除:

a_set = {1,2,3,4}
a_set.add(5)
a_set.discard(5)

6.8 数据结构的一些技巧

6.8.1 多重循环

有很多函数的用法和数据结构的使用都是息息相关的。前面我们学习了列表的基本用法,而在实际操作中往往会遇到更多的问题。比如,在整理表格或者文件的时候会按照字母或者日期进行排序,在 Python 中也存在类似的功能:

num_list = [6,2,7,4,1,3,5]
print(sorted(num_list))

怎么样,很神奇吧?sorted 函数按照长短、大小、英文字母的顺序给每个列表中的元素进行排序。这个函数会经常在数据的展示中使用,其中有一个非常重要的地方,sorted 函数并不会改变列表本身,你可以把它理解成是先将列表进行复制,然后在进行顺序的整理。
在使用默认参数 reverse 后列表可以被按照逆序整理:

sorted(num_list,reverse=True)

在整理列表的过程中,如果同时需要两个列表应该怎么办2这时候就可以用到zip 函数,比如:

for a,b in zip(num,str):
print(b,'is',a)

6.8.2 推导式

现在我们来看数据结构中的推导式(List comprehension),也许你还看到过它的另一种名称叫做列表的解析式,在这里你只需要知道这两个说的其实是一个东西就可以了。
现在我有l0个元素要装进列表中,普通的写法是这样的:

a = []
for i in range(1,11):
a.append(i)

下面换成列表解析的方式来写:

b    =  [i  for i   in  range(1,11)]

列表解析式不仅非常方便,并且在执行效率上要远远胜过前者,我们把两种不同的列表操作方式所耗费的时间进行对比,就不难发现出其效率的巨大差异:

import timea = []
t0 = time.clock()
for i in range(1,20000): a.append(i)
print(time.clock() - t0, "seconds process time")t0 = time.clock()
b = [i for i in range(1,20000)]
print(time.clock() - t0, "seconds process time")


列表推导式的用法也很好理解,可以简单地看成两部分。红色虚线后面的是我们熟悉的 for 循环的表达式,而虚线前面的可以认为是我们想要放在列表中的元素,在这个例子中放在列表中的元素即是后面循环的元素本身。

list = [item for item in iterable]

为了更好地理解这句话,我们继续看几个例子:

6.8.3 循环列表时获取元素的索引

现在我们有一个字母表,如何能在索引的时候像图中一样得到每个元素的具体位置的展示呢?

6.9 综合项目

为了深入理解列表的使用方法,在本章的最后我们来进行做一个词频统计。需要瓦尔登湖的文本,可以在这里下载:http://pan.baidu.com/s/1o75GKZ4,下载 后用 PyCharm 打开文本重新保存一次,这是为了避免编码的问题。
之前还是提前做一些准备,学习一些必要的知识。

lyric = 'The night begin to shine, the night begin to shine'
words = lyric.split()

现在我们使用 spIit 方法将字符串中的每个单词分开,得到独立的单词:

['The', 'night', 'begin', 'to', 'shine']

接下来是词频统计,我们使用 count 方法来统计重复出现的单词:

path = '/Users/Hou/Desktop/Walden.txt'
with open(path,'r') as text:
words = text.read().split()
print(words)
for word in words:
print('{}-{} times'.format(word,words.count(word)))

结果出来了,但是总感觉有一些奇怪,仔细观察得出结论:

  1. 有一些带标点符号的单词被单独统计了次数;
  2. 有些单词不止一次地展示了出现的次数;
  3. 由于 Python 对大小写敏感,开头大写的单词被单独统计了。
    现在我们根据这些点调整一下我们的统计方法,对单词做一些预处理:
1.import string
2.path = '/Users/Hou/Desktop/Walden.txt' 3.with open(path,'r') as text:
4.words = [raw_word.strip(string.punctuation).lower() for raw_word in text.read().split()]
5.words_index = set(words)
6.counts_dict = {index:words.count(index) for index in words_index}7.for word in sorted(counts_dict,key=lambda x: counts_dict[x],reverse=True):
8.print('{} -- {} times'.format(word,counts_dict[word]))

第七章 开始使用第三方库

7.1 令人惊叹的第三方库

如果用手机来比喻编程语言,那么 Python 是—款智能机。正如海量的手机应用出现在 iOs、Android 平台上,同样有各种各样的第三方库为 Python 开发者提供了极大的便利。
当你想搭建网站时,可以选择功能全面的 Django、轻量的 Flask 等 web 框架; 当你想写—个小游戏的时候,可以使用 PyGame 框架;当你想做—个爬虫时,可以使用 scrapy 框架;当你想做数据统计分析时,可以使用 Pandas 数据框架……这么多丰富的资源可以帮助我们高效快捷地做到想做的事,就不需要再重新造轮子了。那么,如何根据自己的需求找到相应的库呢?
可以在 awesome-python.com 这个网站上按照分类去寻找,上面收录了比较全面的第三方库。比如当我们想找爬虫方面的库时,查看 Web Crawling 这个分类,就能看到相应的第三方库的网站与简介:

可以进入库的网站查看更详细的介绍,并确认这个库支持的是 python 2 还是python 3,不过绝大多数常用库已经都支持了这两者。
另外,还可以直接通过搜索引擎寻找,比如:

如果你能尝试用英文搜索,会发现更大的世界,比如stackoverlow 上的优质讨论。

7.2 安装第三方库

无论你想安装哪一种库,方法基本都是通用的。下面开始介绍安装第三方库的方法。

7.2.1 最简单的方式:在 PyCharm 中安装



7.2.2 最直接的方式:在终端/命令行中安装


7.2.3 最原始的方式:手动安装


7.3 使用第三方库

在 PyCharm 中输入库的名字,就会自动提示补全了:

输入之后你会发现是灰色的状态import pandas,这是因为还没有在程序中使用这个库,而不是因为库还没安装( 想检查库是否安装的话, 可以使用前面提到的PyCharm 或者 pip 的方式来确认)。关于库的使用指南到这里就结束了。

python初级学习相关推荐

  1. Python初级学习教程—从入门开始学习(函数、组合数据类型、文件操作、异常、模块)

    文章目录 入门 一.数据的相关操作 二.continue 和 break的区别(易混点) 三.函数 变量的作用域 三.函数进阶 1.函数多个返回值 2.函数参数种类 3.匿名函数 组合数据类型 一.列 ...

  2. python初级学习笔记

    在线教程: http://docs.python.org/tut/tut.html with open("/home/ghost/had.txt", "w") ...

  3. 1024,一封写给CSDN家园Python初学者的信 | Python初级、中级、高级学习路线

    又是一年1024,祝所有程序员节日快乐,健康开心,祝CSDN越来越好.转眼,已经在CSDN分享了十多年博客,感谢大家的陪伴和祝福,在这里我与许多人成为了朋友,感恩.非常遗憾,这次没能去长沙岳麓书院见很 ...

  4. 1024,一封写给CSDN家园Python初学者的信 Python初级、中级、高级学习路线

    又是一年1024,祝所有程序员节日快乐,健康开心,祝CSDN越来越好.转眼,已经在CSDN分享了十多年博客,感谢大家的陪伴和祝福,在这里我与许多人成为了朋友,感恩.非常遗憾,这次没能去长沙岳麓书院见很 ...

  5. 从入门到入土:Python爬虫学习|实例练手|爬取LOL全英雄信息及技能||异步加载|初级难度反扒处理|寻找消失的API

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  6. 从入门到入土:Python爬虫学习|实例练手|详细讲解|爬取腾讯招聘网|一步一步分析|异步加载|初级难度反扒处理|寻找消失的API来找工作吧

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  7. python语言入门详解-python初级教程:入门详解

    python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...

  8. python入门视频教程推荐-python入门学习哪个书比较好(python视频教程知乎)

    自学python的学习路线是什么?推荐一些python学习资源 第一段 初级,掌握Python的语法和常用库的使用 这里首先推雪锋在网上的书籍,这是Python2.7的,这本书适合于重头开始一直读完, ...

  9. 自学python买什么书比较好-python入门学习哪个书比较好(python视频教程知乎)

    自学python的学习路线是什么?推荐一些python学习资源 第一段 初级,掌握Python的语法和常用库的使用 这里首先推雪锋在网上的书籍,这是Python2.7的,这本书适合于重头开始一直读完, ...

最新文章

  1. druid之监控设置及问题小记
  2. Oracle中start with...connect by子句的用法
  3. 电磁波考试中可以用计算机吗,计算机考试试题库带答案(8页)-原创力文档
  4. JUnit5 Maven 依赖项
  5. python百万并发压测_100W高并发(转载) - 橙子柠檬's Blog
  6. PHP APM 对比评测:OneAPM, New Relic, 听云
  7. 生产线平衡算法matlab,装配生产线任务平衡问题的遗传算法MATLAB源代码
  8. 数字滤波器设计——Matlab(理想低通滤波器、FIR滤波器)
  9. Oxygen XML Editor(XML编辑器)中文版
  10. IOS越狱--修复Cydia闪退(或打不开)的办法
  11. python3模拟键盘输入_python之模拟键盘
  12. 加了阿里云CDN出现504
  13. AutoLeaders控制组——C51单片机学习笔记--定时器串口通信LED点阵屏
  14. 脸上不同位置长痘痘的原因
  15. 利用自识别标记实现复杂场景下相机标定
  16. 常用DOS命令之通俗易懂篇
  17. 【好文】太用力的人跑不远
  18. AutoCAD套合(叠加)卫星影像和矢量路网数据-CAD配准
  19. R语言ggplot2可视化:使用ggpubr包的arrangeGrob函数将多个可视化结果整合为gtable对象、使用as_ggplot函数将gtable对象转化为ggplot对象
  20. 9张超实用甘特图模板,管理工作、学习更高效

热门文章

  1. 想准确识别各地方言?这套15000小时方言语音数据推荐了解一下
  2. Swift-Tips之rounded(_:)
  3. Matplotlib 设置支持中文的默认字体
  4. css 默认显示滚动条,css控制默认滚动条样式
  5. 【微前端开发环境下,加载远程子应用的实战。】
  6. python爬取58同城租房信息
  7. JavaScript点击图片提示
  8. 科普|掀开马甲包的 “神秘面纱”
  9. 实现对mysql增删改查_Java语言实现对MySql数据库中数据的增删改查操作的代码
  10. mysql 8.XXX zip版的安装使用