计算机是发源于数学的,起初计算机就是为了数学计算,众所周知冯·诺依曼发明了第一代电子计算机,所以我们学习Python编程最简单莫过于把我们小学数学计算实现一下。
最简单的计算就是加减乘除了,我们就从细微处入手。我们在PyCharm上创建一个文件calculator.py,在文件里编辑代码:
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ------------------------------------------------------------------------
# 一个简单的计算器
# ------------------------------------------------------------------------
# 加法
def add(a, b):
c = a + b
return c
# 入口函数
def main():
# 最简单的加法
n = add(1, 1)
print(n)
if __name__ == '__main__':
main()
上面编写了这么多行,其实就是实现: 1 + 1 = 2.
折腾了这么久的效果,还不如我们一念之间就心算出来了,为什么我们还要这么麻烦去写代码,因为计算机可以解决复杂计算,心算和珠算在一定复杂度之后就不如计算机了,当然当代计算机用途之广是众所知周的,我讲这么多,就是让初学者不要小看这种样板代码,我不建议直接随意地这么来:
python
>>> 1 + 1
2
这么学习来得及其简单,但是可能后果就是学习了一通,好像都会了,但是叫你实现一个实际的功能,还是不会。
回到我上面的代码来学习吧,我们看看有多少知识点。
1. 注释
#是注释符号,也就是当一行上出现#, 那么#以及它之后的任何内容,都不会当作代码来看待,Python解释器不会去执行它们,即所谓注释。
既然不会被执行,注释为什么还创造出来呢,见名知义,注释,注解解释,注解什么?注解接下来的代码行或代码块是干什么的,什么作用的。
注释解决了程序的可读性。
在文件头部写注释,作者告诉你整个文件实现了什么功能。
在函数头部写注释,作者告诉你这个函数实现了什么功能。
在类头部写注释,作者告诉你这个类实现了什么功能。
在类方法头部写注释,作者告诉你这个类方法实现了什么功能。
在代码块前头写注释,作者告诉你这个代码块显示了什么功能。
2. 特殊的注释
在文件头部前两行,我们基本上这么写:
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
第1行是指定解释器,在windows系统上你感觉不到它的作用,也不会起到任何效果,这是Unix/Linux系统上的东西,对初学者确实有点难度,但是还是要讲,因为多年之后你可能就会体会到这些程序在Linux上运行会更爽。
如果不能理解,就先记忆吧,郭靖当初学习降龙十八掌就是这么干的。
在Linux系统上,我们把文件calculator.py赋予可执行权限:
bash
> chmod u+x ./calculator.py
那么在Linux系统命令行上我们可以直接执行:
bash
> ./calculator.py
Linux会怎么样去处理,Linux命令行其实是一个Shell解释器在运行,它会先读取calculator.py的第一行:
#!/usr/bin/env python
它会以python为参数去执行/usr/bin/env,找到python解释器程序在哪里,然后用这个python解释器程序去执行下面的所有代码。
这又牵扯到Python是一门解释性的编程语言,暂且不提。
那么第二行注释呢:
-*- coding: utf-8 -*-
它告诉编辑器,这个源代码文件是UTF-8编码存储的,讲UTF-8知识,又涉及ASCII、Unicode,对初学者又是一个学习点,乱码问题有时可是让开发人员头痛得很。
所以编程不仅仅是按照语言语法写几行代码了事,软硬件两方面知识是很广泛的,你了解的越多越深入,可能你做出的系统设计和写出来的代码会更优秀。
3. 函数
即使对一个不会编程的人来说,函数这个名字是不是很熟悉?因为我们在初中的数学课上就接触到了:
y = f(x)
函数的近代定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y = f(x)表示。函数概念含有三个要素:定义域A、值域B和对应法则f。其中核心是对应法则f,它是函数关系的本质特征。
函数的英文就是function, 所以简写为f; 定义的英文就是define, 所以我们看到了关键字def。
python
def add(a, b):
c = a + b
return c
def是函数定义的关键字,空格之后是函数名,括号里面是一个或多个参数,用逗号分隔,最后是Python特有的语法-冒号结尾。
接下来一行或多行是代码块,最后是返回,如果没有返回结果的,可以没有。
函数体内是一定要缩进统一的,有用tab缩进的,有用空格缩进的,两种都可以,但是不能混用,Python在这个方面很有个性的,强迫开发者去做好缩进,提高代码可读性。
一般的经验,建议缩进不要用tab,而是用4个空格,因为tab在不同编辑器里的显示宽度是不一致的,可能在某个编辑器里很宽很难看,但空格一般是固定宽度的。
如果函数体代码很少,少到只有一行,一般就没有必要封装成一个函数了。
4. 入口处
文件最下面为什么要这么写:
python
if __name__ == '__main__':
main()
为什么要写以if开头的这一行呢,这关系到多文件问题,当我们正儿八经地写一个项目的代码时,是不能把所有代码写在一个文件里的,那样一个文件里的代码可能有几千行、几万行甚至更多,阅读起来特别困难,这关系到系统的可读性、可维护性。
在多文件的系统里,我们去运行系统,一般是从一个入口文件去执行的,这个入口文件去调用其它文件来执行流程,那么当这个入口文件被执行时,name__这个变量的值就是__main,从而main()得到执行,而之后那些被入口文件调用的文件被调用时,__name__值则不会是__main__值。
如果是初学者,这里讲的知识有点复杂,先可以不去理解,模仿就是了,将来有多文件的时候就自然明白了。这里还涉及到if语句的知识,接下来就会学习。