计算机最基本的基础来源于两个学科:数学和英文。计算来源于数学,而基本语言语法表达来源于英语,如果去死记硬背,而不是从英文意思层面去记忆,是很痛苦的,个人认为英文阅读能力太差的人,是学习不好软件编程的,毕竟第一手的资料大部分用英文写成的。
从数学层面,我们再来看一个函数表达式:
y = f (x) = 3x + 2
x叫做自变量,y叫做x的函数,x不是一个固定的数值,x是有一个定义域的,同理y随着x的变化而得出不同的数值的,所以x和y都是变量,就是变化的量,不是固定死,如果固定死了还有什么意义呢。
中国人喜欢讲阴阳、讲对立,有一个正面肯定伴随就有一个反面存在,那么有变量,就一定有常量存在,上面的3和2就是常量,3就是整型的3,没什么好讲的,这就是常量。
计算机领域呢,自然也有变量和常量,而且是最基本的语言语法知识点。
1. 数值常量
对于初学者,特别是中小学编程爱好者,不要搞那么复杂,从基本的常识去理解数值常量就好了:
整型:1、0、-1等,这些就是整型常量。
浮点型:1.0、0.2、-2.2等,这些都是浮点型常量,先可以简单理解是小数。
现实中我们碰到的常量,大部分就是整数和小数。
2. 数值变量
我们再看这个函数表达式:y = f (x) = 3x + 2,用Python怎么编写代码实现:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
def func1(x):
return 3 * x + 2
def main():
y1 = func1(1)
y2 = func1(2)
print('y1=%d, y2=%d' % (y1, y2))
if __name__ == '__main__':
main()
上面的变量有哪些?x、y1和y2都是变量,我们用字母和数字来定义一个变量。
3. 数值类型
不管是常量还是变量,数值都有一个类型。
从中学数学来看数的定义和分类,首先是整数,然后有理数和无理数,最后是实数和复数。
整数包括正整数、0、负整数,有理数包含整数和分数,实数包含有理数和无理数,复数包含实数和虚数。
那么计算机是怎么定义数的呢?Python实际又是怎么定义数的呢。
计算机是实实在在的,不可能完全按照数学类型定义来处理,要讲清楚计算机这些基本的知识,那需要大学的好几门课程,比如计算机组成原理、操作系统原理、编译原理、汇编语言、数据结构和算法等,做一个合格的专业程序员真不容易。不过也不用担心,实际现实中都遵循二八原理:80%的程序员其实都不懂这些知识,照样行走江湖吃得开,因为一些编程语言、集成开发环境、基础库和开发框架等帮我们解决了一切,这正如飞机很复杂,但是飞行员启动自动驾驶之后就很轻松地观察就是了,只有当异常故障发生的时候才能体现飞行员的水平差距了,编程也一样,特别是中小公司,有一两个扛把子的程序员就行。
回归到Python语言,数值类型就3种:int, float, complex。
int就是整型,complex就是复数,float有点特别,它和数学的有理数、无理数、实数不是那么对应,我们叫float是浮点型。
计算机毕竟是要数值用二进制实实在在存储的,一个int类型存储范围是有限的,像数学中正无穷大和负无穷大是无法实际存储表达的,那这个范围又牵扯到操作系统是32位的还是64位的,Python有分Python2和Python3,具体是什么这里不讲,可以网上查查。
有一天你真正碰到溢出问题,特别是在C/C++、Java等静态编译型编程语言开发过程中,这个问题出现之后会让你真正去理解数值的本质。
int整型:1、0、-1等,这些就是整型常量。
float浮点类型:1.0、0.2、-2.2等,这些都是浮点数常量。
complex类型,先别管,估计一般我们用不着,等你能用得上的时候再学习吧。
4. 数值计算
def test_numeric():
n1 = 1 + 2 # 加: +
n2 = n1 - 1 # 减: -
n3 = n1 * n2 # 乘: *
n4 = 1 / 2 # 除: /
n5 = 1 // 2 # 取整: //
n6 = 2 % 3 # 取余: %
n7 = 2 ** 3 # 乘方: **
print(n1, n2, n3, n4, n5, n6, n7)
以上就是最基本的数值计算符号,我们把多个计算符号组合使用,加上()来改变计算优先级,就形成了表达式:
def test_numeric():
n1 = 1 + 2 # 加: +
n2 = n1 - 1 # 减: -
n3 = n1 * n2 # 乘: *
n4 = 1 / 2 # 除: /
n5 = 1 // 2 # 取整: //
n6 = 2 % 3 # 取余: %
n7 = 2 ** 3 # 乘方: **
print(n1, n2, n3, n4, n5, n6, n7)
# 复杂的表达式
n8 = (n1 + 2) * 2 - 6 / 3 + 7 % 2 ** 2
print(n8)
n8的值是多少呢? 这关系到计算的优先级要清楚,不防先心算一下,然后去电脑上执行,看看结果和自己的心算是不是一致,为什么是这样。
5. 再谈类型
我们说Python数值类型有三种:int, float, complex,但是我们定义变量的时候并没有标识具体的类型,直接就是变量名,那么这个x或n到底是什么类型呢?可以说不确定,当变量被赋予了什么类型的值,变量当时就是什么类型。
有一个语言内置函数type(x)可以判断一个变量当前的具体类型:
# 测试变量类型变化
def test_numeric_type():
n1 = 1 + 2
print(type(n1))
n1 = 1 / 2
print(type(n1))
同一个变量n1, 第一次打印的类型是int,第二次打印的类型却是float, 这就是动态语言的特性,变量类型是在运行时动态确定的,是不是很灵活呢。
那是不是灵活就一定好呢?那为什么Python不取代Java和C++呢?