Technology and Investing Blog


  • Home

  • About

  • Tags

  • Categories

  • Archives

靠这个简单的投资组合策略你也可以实现财务自由

Posted on 2018-11-21 | In 投资 |

piggy bank

你炒股吗?赚钱了吗?这种问题可能会刺激到你。

根据统计数据,10个炒股的人中一般只有一个是真正赚了钱的,有2个是打平的,没赚也没赔,而有8个是赔钱的。是不是感觉挺惊讶?

为什么大部分人不能从股市赚到钱? 主要因为人性的两个缺点:贪婪和恐惧。怎么讲呢,当有好的投资机会时你往往怕亏钱,所以不敢投,这就是恐惧。而当股市火热大家都情绪高涨时,你往往担心错过赚钱机会就赶紧投钱进股市。其实真正从股市赚钱的人是在大家都害怕的时候勇于进场,大家都狂热的时候要及时退出。

有个说法是说成功的投资是反人性的。你现在能理解为什么大部分人炒股都不赚钱了吧?

那有什么简单的投资策略能让你稳定赚钱吗?

这里要介绍的这个投资组合策略就能做到,而且能帮你避免大部分人都会犯的错误。

把你准备投资的钱平均分为两份,用一半去买股指ETF基金,另一半去买货币基金(余额宝背后就是货币基金),每隔半年调平两边。例如你总共投了1万元,平均分为两份,5000买300ETF基金,5000买余额宝,6个月后股票基金涨到8000,余额宝涨到5100,卖出一部分股票,买进一部分余额宝,使两边都平衡到 6550。

整个策略讲完了,是不是很简单?

你可能怀疑这个策略的可行性,我先从历史数据角度讲讲,国内有专业人士用过去几十年的股市数据做过测试,年化收益率超过10%,虽然经历了多次牛市熊市周期。(想去看测试数据的可以找雪球股票社区出版的《傻瓜式投资》这本书。) 美国股市的历史数据也可以证明这个策略是有效的,年化收益率也在10%左右。其实拉长时间周期来看股市都是逐步上涨的,这个是投资赚钱的一个大前提。

我另外从解决人性那两个问题角度讲讲,这个策略会在股市下跌时让你转移货币基金里的资金到股票里,因为要平衡两边,这是帮助你克服恐惧心理,在股市低位时勇于进场。而在股市火热的时候让你卖出转到货币基金里,及时获利,也是为了平衡两边。长期下来,始终处于占优势的一边,所以好的收益也是可以预期的。

investing life

那怎样靠这个策略实现财务自由呢?

财务自由并非是指大富大贵,而是你的被动收入足够覆盖你的生活开销。这里存在一个平衡,一方面是要有足够的被动收入,另一方面是控制生活开销不要超过被动收入。

假设你经过多年的积累,你的投资资金达到50万以上,按照年化10%的收益率,每年可以有5万元投资被动收入,这应该足以在国内中小城市生活了,这就可以称作是财务自由了。这种状态下你可以选择去做你喜欢的工作,而不是为了生存去工作。

这个策略简单易行,你用支付宝就可以建立这个投资组合,一半资金买300ETF基金,一半资金放在余额宝,每隔半年平衡一下。平衡的频率不要太高,是为了给市场足够的时间,比如牛市时希望股票抓到大部分涨幅后再平衡,熊市时股票跌得差不多后再平衡。

区块链应用场景介绍

Posted on 2018-11-20 | In 技术 |

过去几年区块链在虚拟货币领域应用比较广泛,其实只是说明区块链技术适合于发行虚拟货币,但不能说虚拟货币就是区块链,区块链的应用领域要广泛得多。而虚拟货币用其他技术也能实现,但基于区块链技术能够使很多人愿意加入区块链节点网络,贡献自己的算力和存储资源。

区块链的核心是防篡改防伪造的分布式账本,理论上讲数据是只可以新增,不允许更改,而且新增的时候是按照规则跟已有的区块链接到一起。还有很重要的一点是区块链的数据是分布式存储的,不是传统的中央式架构。

这种技术可以应用在需要信任机制的场景里,例如跟商业合作伙伴对账方面,供应商发货和我方付款信息都可以记录在区块链上,而且记录时有严格地授权机制,也就是说供应商只能记录跟他们相关的数据,我方只能记录跟我方相关的数据。这主要是应用了数字签名技术。再加上智能合约技术可以实现商业流程的自动处理,能大大提高商业协作效率。

还有像常见的会员系统,过去大多是基于传统关系型数据库搭建的,而且是被掌控在商家手里,理论上说数据库里的数据可以任意更改,会员的权益是很难保证的,说得难听点就是商家说你有多少积分你就有多少积分,因此先天就难以得到消费者的信任。而基于区块链技术搭建的会员体系先天就具有被信任的基础,上链的数据不可篡改,而且可以公开数据,积分权益可以得到有效保障。当然积分对应有多少实质性权益还是取决于商家,区块链解决的是一套可靠记账体系。

有了可靠的信任机制,很多涉及多方的行为就比较容易进行了,因为违约行为是公开可查的,为了长远利益,大多数人都不会冒这种风险。

七天学会Python编程 -- 第十章 附录

Posted on 2018-11-19 | In 技术 |

在线 Python 练习环境

https://c.runoob.com/compile/6

http://www.pythontip.com/coding/run

七天学会Python编程 -- 第九章 Web开发

Posted on 2018-11-19 | In 技术 |

9.1 Web 基础

大家都知道上网,不管是通过电脑,还是手机或平板电脑,这里讲讲 Web 的一些基础内容。

首先我们用来上网的设备都会有个软件叫浏览器,浏览器的形式可能是多种多样的,例如常见的 IE 浏览器和 Chrome 谷歌浏览器,属于标准的浏览器软件,还有像在微信中打开一些页面的形式,是属于微信中内嵌的浏览器,还有些 APP 解析一些网页内容后只显示网页的部分内容,这也属于浏览器的一种形式。

然后浏览器访问的服务器叫作 Web 服务器,Web 服务器返回给浏览器网页内容,浏览器解析后显示出来。网页是用一种叫作 HTML 的标记型语言写的,一个简单的网页可以是这样的:

1
2
3
4
5
6
7
8
9
10
<html>
<head>
<h1>这是标题</h1>
</head>

<body>
这里是内容
</body>

</html>

整个过程是这样:浏览器访问一个网址,网址对应到一个 Web 服务器,Web 服务器会把网页内容返回给浏览器,浏览器解析网页内容后显示出来。

网页内容可以是保存在一个扩展名为 .html 的文件,例如 test.html,也可以是一个 Python 程序生成的,我们这一章会讲怎样通过 Python 程序开发网页功能。

9.2 安装一个比较热门的 Web 开发框架

我们会用 Flask,Flask 是一个比较流行的 Python Web 开发框架,优点是简单易懂,可以很快上手,开发网页程序。

这里先要安装这个框架,这个框架可以看作是比较复杂的模块,我们要学习怎么安装它。

如果你使用了树莓派或其他 Linux 环境,安装 Flask 很简单,只需要这个命令

pip install Flask

这个命令会把 Flask 和 Flask 所用到的其他模块都一起安装好。

在 Windows 下安装复杂一些,一般是先安装上 pip 这个 Python 包管理工具,然后也是通过 pip install Flask 命令来安装。

可以参考这篇教程上安装 pip 工具的方法安装好 pip,然后也是通过 pip install Flask 安装 Flask 框架。

windows下面安装Python和pip终极教程

http://www.cnblogs.com/yuanzm/p/4089856.html

这里概要总结一下安装过程,先安装 Python,记得把 Python 的安装目录和下面的 Scripts 目录加到系统路径中,如果你的 Python 安装在 C:\Python27 目录下,就把 C:\Python27 和 C:\Python27\Scripts 这两个目录加到系统路径下。

然后从这个网址下载 pip 安装包

https://pypi.python.org/pypi/pip#downloads

记得下载扩展名为 .tar.gz 的,下载下来后是个压缩包格式,可以用 WinRAR 或其他解压缩工具解压缩到一个目录下,然后从命令行里 cd 这个解压缩后的目录下,执行命令 python setup.py install,就可以安装好 pip 工具。

安装好后在命令行里运行 pip install Flask 就可以顺利安装 Flask 框架。

9.3 做一个简单的页面

现在我们开始学习用 Flask 做一个简单的页面,是在页面上打印 “Hello World!”。

先建一个保存这次程序的目录,保存下面代码为 hello.py:

1
2
3
4
5
6
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return "Hello World!"

逐行解释一下,第一行是指引入 Flask 模块,这个指令跟我们以前章节学过的不太一样,它是从 flask 这个模块包里引入 Flask 模块,模块包的概念我们在模块章节有讲过,是为了进一步对模块做分类,特别是对于一些复杂的模块,有必要再分模块包。

第二行是定义一个 Flask 对象类型,并赋给 app 变量,name 是 Python 内置的一个变量,主要 name 前后分别是两个下划线,这个内置变量的值是当前运行的程序名字,对于主程序来说这个值是 main,如果在一个模块中这个值会是模块的名字。app = Flask(name) 是定义一个对象,name 作为初始参数,对象类型是 Flask,把定义的对象赋给变量 app。

第三行 @app.route(“/“) 是 Flask 框架的一种使用方式,表示定义一个网址路径,“/” 表示是根目录,就像我们访问百度这个网址 http://www.baidu.com/ 时,对应的就是 “/” 这样一个根目录网址路径。

第四行和第五行是定义一个函数,返回一个字符串。

在 Linux 环境下,在命令行里执行这个命令

FLASK_APP=hello.py flask run

如果在 Windows 环境下,要在命令行状态下,执行两条命令,先执行第一条,再执行第二条:

set FLASK_APP=hello.py

flask run

命令行里提示这样的信息

  • Serving Flask app “hello”

  • Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

后表示 Web 服务已经成功运行起来了,同时按 CTRL 键和 C 键会退出服务。

你现在可以用浏览器访问网址 http://127.0.0.1:5000/ 就可以看到打印出来的 “Hello World!”。

解释一个这个命令,FLASK_APP=hello.py 是定义一个环境变量,然后执行 flask run 命令,flask run 命令里会用到 FLASK_APP 环境变量里定义的那个文件名字,就会运行起来。

下面继续完善一下,输出一个真正的网页,我们把前面章节那段 HTML 输出,上面代码这样修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
return '''<html>
<head>
<h1>This is a head</h1>
</head>
<body>
This is the content.
</body>
</html>'''

留意一下那个 hello 函数中的 return 指令,是返回一个字符串,因为这个字符串是跨多行的,所以用了 Python 的一种特殊用法,可以前后用三个单引号或三个双引号把多行字符串括起来,我们也用缩进的方式提高可读性。

按 CTRL + C 退出服务后再启动,再访问一下网址 http://127.0.0.1:5000/ 试试,能看到一个真正网页的显示内容,有标题有内容。

9.4 做一个比较复杂的网页功能

这一节我们尝试做一个比较复杂的网页功能,是管理联系人信息,我们维护一个类似下面的数据表格:

Name Mobile

John 1300000

Tom 1350000

Mary 1380000

首先讲一下怎样保存这样的表格数据,我们可以使用列表,过去我们学过的列表是保存多个数值,其实列表可以保存绝大多数对象,也可以保存列表对象。比如这样的列表:

1
a = [10, 20, 30]

是保存了3个数字,而这样的列表:

1
b = [ ["John", "1300000"], ["Tom", "1350000"], ["Mary", "1380000"] ]

是保存了3个列表对象,我们可以用 b[0] 获取第一个列表对象,b[1] 获取第二个列表对象,依次类推。

我们就是利用这种列表来保存这次的联系人数据,然后再用我们保存对象到文件的方法把这个大列表保存到硬盘一个文件里,这样可以以后再加载出来。

联系人清单功能

我们首先做个网页,是显示已有的联系人清单,然后做个新增的功能,可以增加新联系人,然后再做一个删除联系人的功能,这样基本的联系人管理功能就具备了。

参考前面章节的简单页面的例子,先写一下显示联系人清单的页面功能,这一次我们保存程序文件为 contacts.py。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import pickle
from flask import Flask

app = Flask(__name__)

def load_data_from_file(filePath):
file = open(filePath, "rb")
dataObject = pickle.load(file)
return dataObject

def save_data_to_file(filePath, dataObject):
file = open(filePath, "wb")
pickle.dump(dataObject, file)

@app.route("/init")
def init():
b = [ ["John", "1300000"], ["Tom", "1350000"], ["Mary", "1380000"] ]
save_data_to_file("contacts.dat", b)
return "Init successfully."

@app.route("/list")
def list():
webContent = '''<html>
<head>
<h1>Contacts Management</h1>
</head>
<body>'''

webContent = webContent + "<table><tr><td>Name</td><td>Mobile</td></tr>"

dataList = load_data_from_file("contacts.dat")

for contact in dataList:
webContent = webContent + "<tr><td>" + contact[0] + "</td><td>" + contact[1] + "</td></tr>"

webContent = webContent + "</table>"

webContent = webContent + "</body></html>"

return webContent

启动 Flask 后先访问网址 http://127.0.0.1:5000/init 初始化一些数据,然后再访问网址 http://127.0.0.1:5000/list 可以看到显示的联系人清单。

这段代码涉及内容比较多,先自己读一下看能否理解。

程序的主体部分跟前面章节的简单页面例子差不多,只是多了两个对应不同网址的函数,一个是 /init 对应方法 init,这个方法是先初始化一点数据,另一个是 /list 对应方法 list,用于显示已有的联系人信息。

还有两个函数一个是用于保存数据的 save_data_to_file,另一个是加载数据的 load_data_from_file,留意一下函数所用的参数。

在 list 函数里有 webContent 这个变量,是用于保存网页内容,这次我们的网页内容是通过程序动态生成的,

1
webContent = webContent + "html codes"

这种用法是在 webContent 后面追加 “html codes” 这个字符串,例如一开始 webContent 内容是 “web content “,执行了上面代码后 webContent 内容变为 “web content html codes”。在 list 函数里用了很多这种方式来组装网页内容,最后再返回给用户的浏览器端显示出来。

网页代码方面,里面用了几种 HTML 标签语法,主要是 table,table 是用于定义一个表格,里面通过 tr 标签定义行,然后通过 td 标签定义列,具体用法可以自己上网搜索一下。

list 方法的主要目的是组装网页代码,其中表格里面的内容是根据联系人数据生成的,以后在联系人数据变化时网页显示内容也会跟着变化。

增加联系人功能

下面再加上增加联系人功能,我们在联系人表格下面增加一个输入表单,用到 form 相关的 HTML 标签语法,主要是输入框和提交按钮等。这里只显示 list 方法的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@app.route("/list")
def list():
webContent = '''<html>
<head>
<h1>Contacts Management</h1>
</head>
<body>'''

webContent = webContent + "<table><tr><td>Name</td><td>Mobile</td></tr>"

dataList = load_data_from_file("contacts.dat")

for contact in dataList:
webContent = webContent + "<tr><td>" + contact[0] + "</td><td>" + contact[1] + "</td></tr>"

webContent = webContent + "</table>"

webContent = webContent + "<form action='/save_contact' method='post'>Name: <input type='text' name='name'/> Mobile: <input type='text' name='mobile'/> <input type='submit'/></form>"

webContent = webContent + "</body></html>"

return webContent

我们可以看到,是增加了一行代码,这行代码是增加联系人表单的 HTML 网页代码,可以上网搜索 “html form” 这样的关键词去搜索一下相关内容。

在 form 网页里有个

1
<form action='/save_contact' method='post'>

这里的 action 意思是用户点击 “提交” 按钮是传给哪个函数,这个函数会负责把用户录入的数据保存起来,method=’post’ 表示表单提交的方式,”post” 是表单比较常用的提交方式。

我们需要在程序里加一个 save_contact 函数,下面只显示这个函数的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from flask import request

@app.route("/save_contact", methods=['GET', 'POST'])
def save_contact():
name = request.form.get("name")
mobile = request.form.get("mobile")

dataList = load_data_from_file("contacts.dat")
dataList.append( [name, mobile] )
save_data_to_file("contacts.dat", dataList)

return '''<html>
<head><h3>Add successfully!</h3></head>
<body>
<a href="/list">Click to return</a>
<body>
</html>
'''

解释一下这段代码,@app.route(“/save_contact”, methods=[‘GET’, ‘POST’]) 这行里除了定义网址信息以外,还定义了允许的调用方式,”GET” 和 “POST” 是 Web 应用领域的概念,是指数据提交方式,现在可以不用太深究,只记住比较常用的是 “POST” 方式就可以。

按 CTRL + C 停止 Web 服务后再用命令 FLASK_APP=contacts.py flask run 启动服务,访问网址 http://127.0.0.1:5000/list 可以查看已有的联系人清单,在清单下面有两个输入框,一个是输入名字的,另一个是输入手机号码的,还有个 “提交” 按钮,输入你要增加的联系人的名字和手机号码后点 “提交” 按钮就可以保存数据,会转到一个提示保存成功的页面,点击上面的返回连接可以返回到联系人清单显示页面。

删除联系人功能

删除联系人是在联系人清单表格的每行后面增加一个删除链接,用户点击时会调用我们一个函数,这个函数拿到要删除的联系人信息后进行删除操作,然后提示操作成功,用户可以返回到清单显示界面。

这里我们要学习一个列表的操作方法,是删除某个数据的方法,看下面代码:

1
2
3
4
5
a = [10, 20, 30]

del(a[1])

print(a)

这段代码运行打印输出的列表数据只有2个,10 和 30,第二个数字 20 被删掉了,这就是对列表数据的删除操作。类似道理,如果想删除联系人清单中某一条数据,可以通过列表索引值的方式删除。

比如这个列表:

1
b = [ ["John", "1300000"], ["Tom", "1350000"], ["Mary", "1380000"] ]

用 del(b[1]) 的方式就可以删掉上面列表中的第二个子列表对象,也就是删除第二行数据。

下面开始我们的删除联系人代码,先在清单列表显示中增加删除链接:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@app.route("/list")
def list():
webContent = '''<html>
<head>
<h1>Contacts Management</h1>
</head>
<body>'''

webContent = webContent + "<table><tr><td>Name</td><td>Mobile</td><td> </td></tr>"

dataList = load_data_from_file("contacts.dat")

index = 0
for contact in dataList:
webContent = webContent + "<tr><td>" + contact[0] + "</td><td>" + contact[1] + \
"</td><td><a href='/delete_contact?index=" + index + "'>Delete</a></td></tr>"
index = index + 1

webContent = webContent + "</table>"

webContent = webContent + "<form action='/save_contact' method='post'>Name: <input type='text' name='name'/> Mobile: <input type='text' name='mobile'/> <input type='submit'/></form>"

webContent = webContent + "</body></html>"

return webContent

上面代码中,我们是在 table 标签里增加了一个列,这个列为每行数据放一个删除链接,在连接里我们用到一个 index 变量,是记录循环遍历列表时的索引值,并作为参数通过 /delete_contact?index=某数值 的方式传递给 /delete_contact 这个网址,这个网址对应一个函数,是我们要增加的,这个函数会根据列表索引值删除对应的记录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@app.route("/delete_contact", methods=['GET'])
def delete_contact():
index = request.args.get('index')

dataList = load_data_from_file("contacts.dat")
del( dataList[int(index)] )
save_data_to_file("contacts.dat", dataList)

return '''<html>
<head><h3>Delete successfully!</h3></head>
<body>
<a href="/list">Click to return</a>
<body>
</html>
'''

解释一下这段代码,@app.route(“/delete_contact”, methods=[‘GET’]) 这行定义了网址,也定义了允许的调用方式为 GET,也就是通过网址传递参数的方式,例如像 /delete_contact?index=某数值 这样。

代码里关键是先拿到网址里传得参数 index,是这一行 index = request.args.get(‘index’),这是 Flask 框架提供的方法,然后从文件中加载数据,然后用 del( dataList[int(index)] ) 删除对应索引值的列表对象,里面有个 int(index) 用法,这里 index 变量是字符串类型,从网址里传的值默认是字符串类型,要先转成数字类型才能在这里用。

删除成功后保存最新列表到数据文件中,然后显示删除成功的信息,用户可以点击返回到清单显示页面。

到现在为止,我们已经完成了这次复杂的网页功能开发,具备比较完整的数据管理功能,可以用来管理联系人信息。

恭喜你学到了这么多内容!

9.5 实践练习时间

过去章节我们学习了 Web 开发相关内容,下面通过实践练习来加深理解。

练习1:

仿照那个联系人管理功能开发一个考试成绩管理网页功能,数据列有 姓名、语文、数学、英语,能够显示清单,能够增加和删除。

注意:如果程序里有中文字符,需要在程序第一行放这行代码

1
# -*- coding: utf-8 -*-

以防止报错,这样代码是让 Python 程序支持中文字符。

练习2:

在练习1中我们是用列表中再用列表来表示每行数据的方式,在这个基础上调整一下程序,改成列表中用字典的方式实现这个程序,也就是说数据存储是这样的:

[ {“name”: “John”, “mobile”: “1300000”}, {“name”: “Tom”, “mobile”: “1350000”}, {“name”: “Mary”, “mobile”: “1380000”} ]

保存到文件和从文件加载数据时是对整个列表,而列表内部的每行数据是按字典格式存储。

七天学会Python编程 -- 第八章 数据分析

Posted on 2018-11-19 | In 技术 |

8.1 数据分析是什么?

数据分析是根据一些分析方法对数据进行计算、汇总等操作,输出比较有价值的结果。

比如我们有了一个班级所有学生的全部科目的考试成绩,就可以做各种数据分析了,我们可以计算一下每科所有学生的平均分,也可以计算每个学生所有科目的总分和平均分,可以排列总分名次,也可以排列平均分名次。

进一步可以对某科目的分数段做统计,统计出90分到100分有多少个学生,低于60分的有多少个学生。

这里只是举了个实际中可能用到的例子,可以根据需要做多种个性化分析。

分析数据来源可以是一个表格数据文件,也可以是数据库,或者其他来源。

主要过程就是:加载源数据 -> 根据需要做数据统计运算 -> 输出统计结果。

8.2 一个有趣的分析案例

我们通过一个有趣的案例来深入讲解一下,比如我们拿到这样的记录一个城市天气状况的源数据文件,是 CSV 格式的,可以用 Excel 打开浏览。

Date,Type Of Weather,Average Temperature

2015-1-1,Sunny,8

2015-1-2,Sunny,9

2015-1-3,Cloudy,8

2015-1-4,Rainy,7

…

2015-12-31, Sunny, 10

这个文件记录了日期、天气类型、平均气温这3个数据,每天一条记录,包含了 2015 年一年的数据,我们现在通过程序做几个分析,一个分析是统计一下 Sunny 天气总共有多少天,Cloudy 天气总共有多少天,和 Rainy 天气总共有多少天。

首先我们要读取文件内容:

1
file = open("weather2015.csv", "r")

然后读取整个文件内容:

1
fileContent = file.read()

然后要解析数据,因为现在读到的是整个文件所有数据,都放在一个大字符串 fileContent 里了。

现在学一个字符串的方法 split,是按某个字符拆分一个字符串成一个列表,现在 fileContent 里的大字符串是用回车符号 \n 分割成各行,每行又用逗号 , 分割成多列,我们先用 split 方法来拆分每行数据。

1
lines = fileContent.split("\n")

split 方法是属于字符串对象 fileContent 的,它需要一个分割字符做参数,拆分后的列表返回给 lines 变量。

下面再拆分每行,需要用循环遍历 lines 中每行,

1
2
3
4
5
rows = []

for line in lines:
rowData = line.split(",")
rows.append(rowData)

上面代码先定义了一个列表 rows,用于保存拆分后的每行列表对象,然后循环遍历 lines 列表,对每行字符串再使用 split 方法,这次是用逗号 , 做参数,把拆分完的列表追加到 rows 列表中,最后 rows 中的数据是这样的:

[ [“2015-1-1”, “Sunny”, “8” ], [“2015-1-2”, “Sunny”, “9” ], … ]

现在才开始进入数据分析阶段,前面我们做的都是数据加载方面的处理。

数据统计分析需要用到字典类型对象了,这次我们要统计 Sunny 天气类型在一年内有多少天,我们可以定义一个字典类型对象:

1
results = {}

空的大花号就表示一个空的字典对象,我们把这个字典对象赋予 results 这个变量。

1
results["Sunny"] = 0

这样就在字典对象里增加一个数据,Key 是 “Sunny”,对应的数据是 0,我们可以用这样的方式改变 Key 对应的数据:

1
results["Sunny"] = results["Sunny"] + 1

这行代码是把 “Sunny” 这个 Key 对应的数值加1,运行后 results[“Sunny”] 的数据变成 1,以前是 0,加 1 就变成 1.

我们就是用这种思路来统计数据中 “Sunny” 的天气天数,也就是遍历那些从文件中加载的数据,每当碰到 “Sunny” 类型的天气,就把 results[“Sunny”] 加 1,循环遍历完后 results[“Sunny”] 就保存了 “Sunny” 天气的天数。下面看一下代码:

1
2
3
4
5
6
7
results["Sunny"] = 0

for row in rows:
if row[1] == "Sunny":
results["Sunny"] = results["Sunny"] + 1

print(results["Sunny"])

上面代码是遍历我们前面已经加载好的数据,每行数据都是一个列表,其中第二个数据是天气类型,就判断这个天气类型是否是 “Sunny”,如果是就把 results[“Sunny”] 加 1。遍历完毕后就计算好了 “Sunny” 天气的天数,现在我们再把 “Cloudy” 和 “Rainy” 天气的天数也计算一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
results["Sunny"] = 0
results["Cloudy"] = 0
results["Rainy"] = 0

for row in rows:
if row[1] == "Sunny":
results["Sunny"] = results["Sunny"] + 1

if row[1] == "Cloudy":
results["Cloudy"] = results["Cloudy"] + 1

if row[1] == "Rainy":
results["Rainy"] = results["Rainy"] + 1


print(results)

现在那几种天气类型的天数都计算出来。

现在我们改进一下程序,如果我们要计算的天气类型有很多种,我们预先也不知道有哪几种,但我们需要统计出来有几种,而且每种有多少天。

这就需要用到字段对象的一个长处了,我们可以先不用定义各个 Key 及对应的初始值,我们可以直接在循环里用那个天气类型作为 Key 值,并做加 1 处理,下面看一下代码:

1
2
3
4
5
6
7
8
9
results = {}

for row in rows:
if row[1] in results:
results[ row[1] ] = results[ row[1] ] + 1
else:
results[ row[1] ] = 0

print( results )

现在代码是不是比较清爽,我们分析一下,一开始先定义一个字段对象,赋给变量 results,然后遍历加载的数据,判断每行中的天气类型那个数据有没有在 results 这个字段对象的 Key 里,如果有,就直接加 1,如果没有就初始化为 0,为后面加 1 做准备。最后打印出统计结果。

现在我们把上面几部分代码放到一起:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
file = open("weather2015.csv", "r")

fileContent = file.read()
lines = fileContent.split("\n")

rows = []

for line in lines:
rowData = line.split(",")
rows.append(rowData)

results = {}

for row in rows:
if row[1] in results:
results[ row[1] ] = results[ row[1] ] + 1
else:
results[ row[1] ] = 0

print( results )

8.3 实践练习时间

过去章节我们学习了数据分析相关内容,下面通过实践练习来理解。

练习1:

仿照前面章节的数据分析例子,写一个程序,统计一下那一年内的数据中各个平均温度都有多少天?统计出来的结果可能是这样的:

results[8] = 25

results[9] = 93

results[10] = 101

…

数据文件自己建一个,类似这样格式:

Date,Type Of Weather,Average Temperature

2015-1-1,Sunny,8

2015-1-2,Sunny,9

2015-1-3,Cloudy,8

2015-1-4,Rainy,7

…

2015-12-31, Sunny, 10

不需要一年365天都有,有一部分就可以。

七天学会Python编程 -- 第七章 模块

Posted on 2018-11-19 | In 技术 |

7.1 什么是模块?

在上面章节有提到,模块可以理解为把一组相关的函数放在一起,起个分类名字,然后通过这个分类名字加函数名字来使用这些函数,用这个方式理解比较容易懂。比如 pickle 模块,它提供了几个相关的函数,让使用者可以方便的保存对象到文件,以及从文件加载对象。

为什么要使用模块?

模块的目的是更好地重用代码,你既可以在自己的项目中重用自己开发的一些模块,也可以分享模块给其他人。

比如 pickle 模块,那个开发者开发出来后可以很方便地分享给其他人使用,它已经被吸收到 Python 标准库中了,也就是说只要安装了 Python 环境就可以直接用这个模块。其他很多模块没有被包含到 Python 标准库中,需要额外安装。

比如说你要开发一个系统,需要用到发邮件的功能,可以找个别人开发的模块来用,也可以自己开发一个发邮件的模块,在自己的多个系统中使用。

7.2 模块定义和使用方法

最简单的模块就是一个里面只包含函数的 .py 文件,只包含函数的意思是不包含主程序内容,主程序的概念在前面章节解释过,这里再说明一下。

如果一个程序是这样的:

1
2
3
4
5
def func1():
print("This is func1.")

def func2():
print("This is func2.")

假设程序文件名字是 test1.py,当你用 python test1.py 运行时不会运行里面的代码,因为里面只定义了几个函数,并没有主程序代码,所以这个 test1.py 只能作为一个模块给别的程序使用,例如下面这段代码:

1
print("This is the main program.")

假设这个程序文件名字是 test2.py,用 python test2.py 运行时就能显示内容,里面没有任何函数,代码都属于主程序代码。

看一下怎样在 test2.py 中使用 test1.py 这个模块,修改 test2.py 文件的代码为:

1
2
3
4
5
6
7
import test1

print("This is the main program.")

test1.func1()

test1.func2()

用 python test2.py 运行时就能显示 test1.py 中两个函数的输出。

模块还可以通过目录进一步细分为包,也就是对模块再分类,这里就不做详细介绍了,需要用到的时候可以上网查一下资料。

7.3 分享你的模块给别人

我们用到的 pickle 是使用了别人分享的模块,你也可以分享模块给别人。

例如刚才章节里的 test1.py 文件就是一个模块,你直接发给别人,别人就可以在他们代码里用。

从规范化角度看,模块定义需要清晰明确,比如你想写一个发消息的模块,叫 MyMessaging.py,里面有发邮件的方法叫 sendEmail,有发微信的方法叫 sendWechat,有发短信的方法叫 sendSms,我们可以这样写:

(这里只是演示目的,不真正发送消息,还是用打印的方式模拟发送消息)

1
2
3
4
5
6
7
8
def sendEmail(email, content):
print("Sending the email successfully")

def sendWechat(wechatAccount, content):
print("Sending the Wechat message successfully")

def sendSms(mobile, content):
print("Sending the sms successfully")

保存这个文件为 MyMessaging.py,分享给别人,在别人的程序里就可以这样使用了:

1
2
3
4
5
6
7
import MyMessaging

MyMessaging.sendEmail("xxx@xxx.com", "email from me")

MyMessaging.sendWechat("xxx", "wechat message from me")

MyMessaging.sendSms("130xxxxx", "sms from me")

现在网上有很多开源项目,如果有兴趣可以参与,或者自己发起一个开源项目,吸引其他人参加,这是为软件开发整个生态做贡献,是比较有意义的事情。

7.4 实践练习时间

过去章节我们学习了模块相关内容,下面通过实践练习来理解。

练习1:

编写一个模块,保存文件名为 MyCalculate.py,里面定义加 add、减 subtract、乘 multiply、除 divide 4个函数,这四个函数都有2个参数 variable1 和 variable2,然后把加减乘除计算结果返回。再写一个 test_MyCalculate.py 程序,调用 MyCalculate.py 这个模块中的那4个函数,并打印返回结果。

七天学会Python编程 -- 第六章 文件操作

Posted on 2018-11-19 | In 技术 |

6.1 目录和文件是什么?

对于当今的少年儿童来说,他们比较习惯的是手机和平板电脑,他们可能还没有接触普通电脑,所以有必要解释一下目录和文件的概念。

电脑、手机和平板电脑都有存储,电脑上是硬盘,手机和平板上是其他存储介质,但都是按照目录和文件的方式存储数据的。

硬盘上分多个目录,用来保存不用类型的文件,一个目录下可以再继续分目录,这称为子目录,层层分下去可以分很多层,每层目录都可以保存文件,类似下面的结构:

\目录1

\目录1\目录11

\目录1\目录11\文件11-1.py

\目录2

\目录2\文件2-1.dat

文件比较容易理解,比如手机上我们安装一个APP,一般从应用市场上安装,背后的原理是应用市场会从网上下载一个安装文件,然后运行这个安装文件进行安装,这个安装文件就是文件的一种。

我们在前面章节写的程序代码可以保存到一个文件里,这个程序文件也是文件的一种。

还有一种比较常见的文件是数据文件,也就是可以保存一些数据在里面,例如对于游戏软件,在运行过程中会产生很多数据,例如打到哪一关了,装备情况怎么样,等等。这些数据文件可以保存到硬盘里,下次再运行游戏软件时可以再次读取,这样我们可以接着上次暂停的地方继续玩下去。

在本套教程里我们常用到的有两种,一种是 Python 程序文件,里面是程序代码,用 文件名.py 这样格式存储;另一种是数据文件,里面保存程序用到的一些数据,用 文件名.dat 这样格式存储。.py 和 .dat 叫作文件扩展名,用于区分文件类型的。

6.2 读文件

Python 提供了内嵌函数可以用来操作文件,看一下这个示例:

1
2
3
4
5
6
7
file = open("test1.dat", "r")

fileContent = file.read()

file.close()

print(fileContent)

这段代码运行时需要在程序文件目录下有个 test1.dat 文件,可以找个编辑器软件随便输点内容保存成这个文件名字就可以。

open(“test1.dat”, “r”) 就是使用内嵌函数 open 打开一个文件,调用这个函数有两个参数,一个是文件名称,准确说是文件目录,也就是保存在某个目录下的一个文件路径。我们在文件名字前不加任何目录时表示在程序运行当前目录;第二个参数是文件访问模式,”r” 表示用只读模式去访问,还有 “w” 模式是写模式访问。

这个函数在成功打开一个文件后会返回一个文件对象,我们用 file = open(“test1.dat”, “r”) 把这个文件对象赋值给 file 变量,下面就可以通过 file 变量就代表这个文件对象了,可以用它访问文件内容了。

我们在前面对象那一章节解释过,对象有属性,也有操作方法,我们就是用 file 这个对象的 read 方法读取文件中的所有内容,并且赋值给变量 fileContent,然后用 file 对象的 close 方法关闭文件,最后打印出 fileContent。

(注释:打开文件用完后及时关闭,这个是比较好的编程习惯,我们打开的文件实际上是占用了一个资源,用完后需要尽快释放以便给其他程序使用,因为系统的可用资源数量是有限的,比如一个系统可能同时只能打开1000个文件,如果我们每次打开都没关闭,运行1000次后就占用了所有可用的文件资源数,再运行就报错了,也就意味着程序不能再用了。)

6.3 写文件

写文件的用法跟读文件类似,也是先打开文件,然后写内容到文件,然后关闭文件,看一下这段代码:

1
2
3
4
5
6
7
file = open("test1.dat", "w")

fileContent = "The contents you want to write to a file."

file.write(fileContent)

file.close()

第一行是打开一个文件,第一个参数是文件名,第二个是打开模式,这里是 “w”,表示写模式。

第二行是定义了一个变量 fileContent,保存了一个字符串。

第三行是用文件对象的 write 方法写字符串内容到文件。

第四行是关闭文件对象,也是类似道理,打开文件用完后记得及时关闭,这样可以及时释放占用的资源。

6.4 保存对象到文件和加载文件中的对象

这一节要用到一个新概念叫“模块”,模块在下一章会详细讲解,这里只是需要用到,先简单解释一下。

模块可以理解为把一组相关的函数放在一起,起个分类名字,然后通过这个分类名字加函数名字来使用这些函数。

这里我们要用到 pickle 这个模块,它是用于把对象保存到文件以及从文件加载出对象,通过它我们可以很方便地把数据保存到文件里,也能把数据从文件中加载出来。

看一下这段代码:

1
2
3
4
5
6
7
8
9
import pickle

file = open("test1.dat", "wb")

dataList = [10, 20, 30]

pickle.dump(dataList, file)

file.close()

import pickle 这行代码就是引入 pickle 模块,import 是指令,pickle 是模块名字。

file = open(“test1.dat”, “wb”) 是打开一个文件,用 “w” 写模式,但还多了个 “b”,”b” 表示以二进制(binary)的方式读写,以前不加 “b” 的时候是以文本方式读写的,也就是这个文件可以用普通文本编辑器打开查看,如果加了 “b” 就只能通过程序读写了,pickle 模块要求是以二进制方式读写。

dataList = [10, 20, 30] 是定义一个列表,我们打算把这个列表对象保存到文件中。

pickle.dump(dataList, file) 是把列表对象 dataList 保存到文件对象 file 中。

file.close() 是关闭文件,要记住这个良好的习惯,打开文件用完后及时关闭。

运行这段代码就能成功把数据保存到文件中了,怎么检验有没有保存成功呢?要用从文件加载对象的方法,看一下这段代码:

1
2
3
4
5
6
7
8
9
import pickle

file = open("test1.dat", "rb")

dataList1 = pickle.load(file)

file.close()

print(dataList1)

第一行是引入 pickle 模块。

第二行 file = open(“test1.dat”, “rb”) 是打开文件,用 “rb” 的模式,表示读取二进制模式。

第三行 dataList1 = pickle.load(file) 就是从打开的文件对象中加载数据对象,并把加载结果赋值给 dataList1 变量。

第四行 file.close() 是关闭文件对象,好习惯。

第五行 print(dataList1) 是打印加载出来的数据。

运行上面这段代码会发现从文件加载出来的数据跟我们保存的数据是一致的。

6.5 实践练习时间

过去章节我们学习了文件读写操作功能,下面通过几个实践练习来加深理解。

练习1:

先用一个文本编辑器(例如 Windows 里的记事本)编辑一个文件,随便敲入一些文字,保存到你写程序的目录下,起个文件名字,例如 test1.txt,然后写个程序读取这个文件的内容,并打印出来。

练习2:

写个程序,定义一个字符串变量,随便敲入一些字符作为它的值,然后用写的方式打开刚才练习1里那个文件,把这个字符串变量的值写入文件,运行程序后再用文本编辑器打开看看文件内容。

练习3:

写个程序,定义一个列表,保存这几个姓名 “John”、”Mary”、“Alice”,然后使用 pickle 模块把这个列表保存到一个文件里。然后再通过 pickle 模块从这个文件加载列表对象到另一个变量名,打印这个变量。

七天学会Python编程 -- 第五章 函数

Posted on 2018-11-19 | In 技术 |

5.1 什么是函数?为什么要用函数?

什么是函数?

函数是专门定义的一个程序块,可以被其他程序块重复使用。这个描述有点抽象,可以举个例子,比如计算两个数的平均数,按照一般逻辑是要这样写:

1
2
3
4
5
6
a = 10
b = 20

c = a + b
d = c / 2
print(d)

后面的三行是平均数计算程序,先把两个变量加起来,然后除以2。这里就可以把这部分定义成一个函数,类似这样:

1
2
3
4
def average_two_numbers(a, b):
c = a + b
d = c / 2
print(d)

使用函数是这样:

1
2
3
a = 10
b = 20
average_two_numbers(a, b)

这个 average_two_numbers 函数是定义了一个程序块,能接收2个参数 a 和 b,然后会计算两个数字的平均数并打印出来,这个函数可以被重复使用的,你可以传入任何2个数字都可以计算出平均数。

为什么要用函数?

函数可以把重复使用的程序块抽取出来,放到统一一个地方,然后在其他用到的地方重复调用。举个例子看一下,假设我们写个程序,要计算3次平均数,每次都是不同的两个数,如果不使用函数是类似这样代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
a = 10
b = 20

c = a + b
d = c / 2
print(d)

a = 30
b = 40

c = a + b
d = c / 2
print(d)

a = 50
b = 60

c = a + b
d = c / 2
print(d)

有没有看到计算平均数的代码在重复?

现在看一下改成函数的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def average_two_numbers(a, b):
c = a + b
d = c / 2
print(d)

a = 10
b = 20
average_two_numbers(a, b)

a = 30
b = 40
average_two_numbers(a, b)

a = 50
b = 60
average_two_numbers(a, b)

现在有没有感觉代码清爽很多?可能还不够明显,如果计算平均数的代码有更多行,例如50行,感觉就会非常明显了,我们会把这50行都写在一个函数里,然后在使用时只需要一行代码调用这个函数就可以了,所以一个复杂的程序有了函数之后主程序也就是几段代码而已。

这样代码会清晰易懂,而且更重要的是更容易维护,如果我们想改动计算平均数的方法,只需要改动函数里面的代码就可以,调用函数的地方不需要改动。

举个现实中类似的例子,很多人都知道电脑上的 USB 接口,USB 接口其实就是定义了一个标准函数接口,规定了一些参数,只要符合 USB 接口的电子设备,比如鼠标、键盘等,可以插到 USB 接口使用,而这些电子设备本身可以多种多样,而且可以不断优化,只要按照 USB 接口的参数标准提供对外服务就可以。

Python 语言本身已经提供了很多内嵌函数,我们可以直接拿来用,像在我们示例代码里经常用的 print 函数。

我们在对象那一章节讲到的方法,其实也属于函数,只是方法一般是指一个对象本身的函数,也就是对象提供的可用函数,也一样可以有参数,有返回值。

函数这一章是比较抽象困难的部分,但也是必须要理解学会的部分。如果读完了之后没有理解,可以多实践操作和上网查资料。可以参考一下之前对 print 函数的介绍,更加直观,方便理解。

5.2 函数定义和使用方法

最简单的函数定义是这样写:

1
2
def empty_func():
pass

上面这个函数实际上没有发挥作用,是个空函数,里面的 pass 指令是跳过的意思,什么也不做。

我们看一下第一行 def empty_func(): 中的 def 是 Python 指令,后面的 empty_func 是我们给函数起的名字,后面的括号是指这个函数需要的参数,在这个例子里没有任何参数,所以括号里是空的,然后后面的冒号 : 跟以前的 if、for、while 等指令类似,是定义所属的程序块。

看一下上一节中那个有意义点的函数:

1
2
3
4
def average_two_numbers(a, b):
c = a + b
d = c / 2
print(d)

这个是定义一个名字叫 average_two_numbers 的函数,需要2个参数 a 和 b,里面的程序块是计算了 a 和 b 的平均数,并打印出来。

函数还有一个重要的概念是返回值,我们上面的例子是在函数里直接打印出了平均数计算结果,还有一种更常用的方式是把计算结果返回,由调用该函数的程序来考虑怎样展示出来,而不是每次都是在函数里打印出来,这个打印函数是在命令行里输出的,而实际场景可能是在一个网页里显示,或者在一个手机APP界面里显示。

我们看一下在函数里怎么用返回值:

1
2
3
4
5
6
7
8
9
def average_two_numbers(a, b):
c = a + b
d = c / 2
return d

a = 10
b = 20
result = average_two_numbers(a, b)
print(result)

从代码里可以看到,在函数程序块的最后一行 return d 是表示把计算结果返回,我们是把函数调用结果直接赋值给一个变量 result,然后再用 print(result) 打印出函数调用结果。

5.3 实践练习时间

过去章节我们学习了函数的概念和使用方法,下面通过几个实践练习来加深理解。

练习1:

定义一个函数,名字是 sum_list,传一个数值列表参数 list1,函数计算列表里各数值的和,然后返回。在主程序里定义一个数值列表,包含 10、20、30 这几个数字,然后调用刚才定义的函数,用这个数值列表作为参数,用一个变量获取到函数返回结果,最后打印出来。

(提示:这里的主程序就是用 python 程序文件名.py 命令时运行的程序代码,函数是属于主程序的一部分,但函数自己不会执行,需要被主程序调用后才能执行)

练习2:

定义一个函数,名字是 send_email,参数是 email 邮件地址和 content 邮件内容,函数里不进行实际的邮件发送操作,只是用 print 函数打印信息的方式模拟发送过程,先打印 “Connect to the email server…”,再打印 “Sending the email…”,再打印 “Sent successfully”。在主程序里使用这个函数。

七天学会Python编程 -- 第四章 循环遍历

Posted on 2018-11-19 | In 技术 |

4.1 for … in …

现在到了循环指令时间,在 Python 中用得最多的循环指令应该是 for … in …,先看一段代码:

1
2
3
4
list1 = [10, 20, 30]

for a in list1:
print(a)

上面就是一个典型的 for … in … 循环,list1 是定义了一个列表,里面有几个数值,for a in list1: 表示遍历列表 list1 中的每个数值,每次遍历都把数值赋给变量 a,后面的冒号 : 也是跟 if 指令类似,定义一段属于 for 循环的程序段,用缩进的方式,这个程序段会在每次遍历时执行。这里我们是每次遍历都打印一下变量 a 的值,也就是打印列表中的每个值。

可能听起来有些困难,其实很好理解:list1是一筐水果,里面有苹果、梨、香蕉……现在工作人员要来检查水果,于是把水果,也就是list1中的数据一个个拿出。先检查了苹果,苹果经过检查,发现很新鲜,工作人员把苹果的情况新鲜记录了下来 ……以此类推,全部水果都这样被检查了。检查每个水果时 a 就代表那个水果。

下面来个稍复杂的例子:

1
2
3
4
5
list1 = [10, 20, 30]

for a in list1:
b = a * 2
print(b)

这是改变了一下 for 循环里的程序段的代码,是把列表中每个数值先乘以2,然后再打印出来。要多理解一下冒号后面的缩进的含义。

4.2 while

while 是另一种比较常见的循环指令,先看个例子:

1
2
3
4
5
a = 10

while a > 0:
print(a)
a = a - 1

这段代码是打印从10到1,先定义一个变量 a,赋值为 10,然后 while a > 0: 是开始 while 循环,a > 0 是类似 if 指令中的判断条件,意思是只要符合 a > 0 条件就会运行下面的循环程序块。

然后也是用缩进的方式定义了循环程序块,这个程序块中先用 print(a) 打印出当前 a 变量的值,然后用 a = a - 1 的方式把 a 的数值减去 1,例如第一次循环时 a 是 10,执行了 a = a - 1 后 a 变为 9,第二次循环 a 会从 9 变为 8,依次下去,知道 a 变为 0,这时候就不满足 while 循环的 a > 0 条件了,就不会再运行 while 程序块里面的代码了。

4.3 实践练习时间

过去章节我们学习了两种常用的循环指令,下面通过几个实践练习来加深理解。

练习1:

定义一个列表,里面保存这几个姓名:Mary、Tom、John,然后用 for … in … 指令循环打印出来。

练习2:

定义一个数字,赋值为 1,然后用 while 不断加1,并循环打印从1到100这些数字。

练习3:

思考一下,怎样用 for … in … 的方式实现练习2?

可以上网搜索一下相关资料,有一点要注意,构建一个从1到100的列表是有函数的,不要自己在程序代码里手工输入100个数字。

七天学会Python编程 -- 第三章 条件控制

Posted on 2018-11-19 | In 技术 |

3.1 if

条件控制是很常用的程序指令,拿我们常见的一种场景,去买高铁票,小孩是半票,一般是通过身高来判断,通常规则是低于1.5米半票,年龄小于2岁是免票,这种就是典型的条件控制。

Python 里用 if 来做这种判断,像上面的场景可以用这样的代码来处理

1
2
3
4
5
6
7
8
9
10
11
age = 10
height = 1.45
price = 50

if height < 1.5:
price = price * 0.5

if age < 2:
price = 0

print(price)

上面这段代码是先定义了 3 个变量,分别是年龄 age 是 10 岁,身高 height 是 1.45 米,高铁票原价 price 是 50 元。然后程序先判断身高,如果低于 1.5 米就把价格变为半价,用 price 乘以 0.5 后再赋予 price 变量,就是改变 price 的数据。然后程序再判断年龄,如果小于2岁就是免票,也就是票价为 0。最后把价格打印出来。

观察一下上面代码,我们能发现 if 指令的用法:if 后面是条件判断语句,后接冒号 ,接着下面的指令缩进了。这就是 if 的使用规则,缩进是很重要的概念,Python 用缩进来表示不同的程序块。比如 if 指令下面的缩进是属于 if 指令的程序块,也就是在 if 指令的条件判断成立时就会执行它的程序块,如果条件判断不成立就不会执行。

对于整个代码块来说,这个程序首先是一个大的程序块,代表整个程序,然后用 if 指令和对应的缩进形成小的程序块,多个小的程序块共同组成最大的程序块。程序块里可以有多行代码,只要保持相同的缩进就表示同一个程序块,例如下面这样:

1
2
3
if height < 1.5:
price = price * 0.5
print("Half price")

其中的

1
price = price * 0.5

和

1
print("Half price")

这两行属于同一个程序块,都是属于 if height < 1.5: 指令的。

Python 的这种缩进规则既属于语言语法,也属于排版风格。会使每个 Python 程序都看起来比较相像,不会像其他很多语言。代码排版风格往往多种多样,差异很大,让你阅读不同排版风格的代码,会比较困难。而代码大部分时间是用来阅读的,所以清晰一致的排版风格非常重要。另外,缩进是逐级进行的,例如:

1
2
3
def...
if...
print...

就像军衔一样,从元帅到上将、中将、少将再到后面的一等兵、二等兵……程序也是如此,逐级类推。

3.2 if … else

如果天气下雨你就打伞,如果不下雨就不用打伞。

用程序代码怎么表示这句话?

用刚才学过的 if 指令可以这样写:

1
2
3
4
5
6
7
weather = "rainy"

if weather == "rainy":
print("You should bring umbrella.")

if weather != "rainy":
print("You don't need to bring an umbrella.")

代码是能正常运行的,但现在有更简单的方式去表示上面的意思:

1
2
3
4
5
6
weather = "rainy"

if weather == "rainy":
print("You should bring an umbrella.")
else:
print("You don't need to bring an umbrella.")

if 后面用 else 来表示 if 条件判断不成立的情况,也就是非if的情况。请注意观察,else 后面也是有冒号: ,另外下面的程序块也是缩进的,说明下面缩进的程序代码是属于 else 指令的,是在 else 指令有效时才会执行,也就是在 if 条件判断不成立时才会使 else 指令有效。

进一步的还有 else if,也就是在 else 后面进一步做条件判断,这稍有点复杂,在需要用到的时候可以上网查找对应的资料。

3.3 实践练习时间

过去这个章节我们学习了变量、列表和对象,现在开始做几个实践练习,可以用在线 Python 练习环境,也可以用本地安装的 Python 环境。练习时注意一定要让程序能正常运行,并且按要求输出结果。

练习1:

定义一个变量 a 并赋值 50,用 if 指令判断 a 是否小于 100,如果小于就打印 “a is smaller than 100.”。程序能成功执行后再修改变量 a 的值为 120,再执行一次程序,看一下运行结果是什么。

练习2:

定义一个变量 age 并赋值 10,表示 10 岁,然后用 if 指令判断是否小于 12,如果大于就打印 “This is a child.”,否则就打印 “This is not a child”。程序能成功执行后再修改变量 age 的值为 20,再执行一次程序,看一下运行结果是什么。

1…3456

Ken Deng

53 posts
5 categories
29 tags
© 2020 Ken Deng
Powered by Hexo
|
Theme — NexT.Muse v5.1.4