Python基础语法(1)
常量和表达式
我们可以把 Python 当成一个计算器,来进行一些算术运算。
print(1 + 2 - 3)
print(1 + 2 * 3)
print(1 + 2 / 3)
这里我们可能会有疑问,为什么不是1.6666666666666667呢?
其实在编程中,一般没有“四舍五入”这样的规则,这些小数在python中称为浮点数,浮点数的话专门有一套规则在内存中表示的,我们叫IEEE754标准,关于这个标准里面具体怎么规定的,我们暂且不给大家做过多解释,在这个标准之下所规定的浮点数,它在内存中表示一些数据的时候,可能会存在非常小的误差。
注意:
print 是一个 Python 内置的函数,这个稍后详细介绍。
可以使用 + - * / ( ) 等运算符进行算术运算。先算乘除,后算加减。
运算符和数字之间,可以没有空格,也可以有多个空格。但是一般习惯上写一个空格(比较美观)。
PS: 美观是否重要?
形如 1 + 2 - 3 这样的算式,在编程语言中称为表达式,算式的运算结果,称为表达式的返回值
其中 1 , 2 , 3 这种称为字面值常量,+ - * / 这种称为运算符或者操作符。
注意:熟悉 C / Java 的同学可能认为, 2 / 3 结果为 0 (小数部分被截断)。但是在 Python 中得到的结果则是一个小数,更符合日常使用的直觉。
示例
给定四个分数,67.5,89.0,12.9,32.2,编写代码,求这四个分数的平均数。
变量和类型
变量是什么
有的时候,我们需要进行的计算可能更复杂一些,需要把一些计算的中间结果保存起来,这个时候就需要用到变量。
示例
给定四个分数,67.5,89.0,12.9,32.2,编写代码,求这四个分数的方差。
PS: 方差的计算过程: 取每一项,减去平均值,计算平方,再求和,最后除以 (项数 - 1)。
在这个代码中,就需要先计算这四个数字的平均值,然后再计算方差,这就需要把计算的平均值使用变量保存起来。
avg = (67.5 + 89.0 + 12.9 + 32.2) / 4
total = (67.5 - avg) ** 2 + (89.0 - avg) ** 2 + (12.9 - avg) ** 2 + (32.2 - avg) ** 2
result = total / 3
print(result)
在python里面,x ** 后面跟一个数字表示x的几次方,例如x的平方就是 x ** 2,x的三次方就是 x ** 3。
打印的结果:
注意:
avg, total, result 均为变量。
** 在 Python 中表示乘方运算,** 2 即为求平方。
就像计算器中的 M 键功能类似,通过变量就可以保存计算过程中的中间结果。
只不过,计算器一般只能保存一个数据,而在 Python 代码中,可以创建任意多的变量,来随心所欲的保存很多很多的数据。
变量可以视为是一块能够容纳数据的空间,这个空间往往对应到 "内存" 这样的硬件设备上。
PS: 我们可以把内存想像成是一个宿舍楼,这个宿舍楼上有很多的房间,每个房间都可以存放数据。
衡量内存的一个重要指标就是内存空间的大小,比如我的电脑内存是 16GB。这个数字越大,意味着内存的存储空间就越大,能够存放的数据(变量) 就越多。
变量的语法
(1) 定义变量
a = 10
创建变量的语句非常简单, 其中
a 为变量名,当我们创建很多个变量的时候,就可以用名字来进行区分。
= 为赋值运算符,表示把 = 右侧的数据放到 = 左侧的空间中。
注意: 变量的名字要遵守一定规则。
硬性规则(务必遵守) 变量名由数字字母下划线构成,数字不能开头,变量名不能和 "关键字" 重复,变量名大小写敏感,num 和 Num 是两个不同的变量名。
软性规则(建议遵守)
变量名使用有描述性的单词来表示,尽量表达出变量的作用。
一个变量名可以由多个单词构成, 长一点没关系, 但是含义要清晰。
当变量名包含多个单词的时候,建议使用 "驼峰命名法",形如 totalCount ,personInfo 这种,除 了首个单词外,剩余单词首字母大写。
数学上, 变量通常使用 x, y, z 这种简单的英文字母或者拉丁字母表示,但是在编程中不建议这样使 用。
原因是编程中,一个程序里通常会同时创建出很多个变量,如果只是使用单个字母表示,在变量多了的时候,就很难记住哪个变量是干啥的,从而给维护程序带来了一定的困难,因此我们更建议使用带有明确描述性的名字,来表示变量的用途。
(2) 使用变量
读取变量的值
a = 10
print(a)
修改变量的值
a = 20
print(a)
注意: 在 Python 中,修改变量也是使用 = 运算,看起来和定义变量没有明显区别。
当然,也可以用一个变量的值赋给另外一个变量。
a = 10
b = 20
a = b
print( a )
print( b )
变量的类型
变量里面存储的不仅仅是数字,还可以存储其它种类的数据,为了区分不同种类的数据,我们引入了 "类型" 这样的概念。
注意: 和 C++ / Java 等语言不同,Python 变量的类型不需要显式指定,而是在赋值的时候确定的。
(1) 整数
a = 10
print( type( a ))
PS: type 和 print 类似,也是 python 内置的函数,可以使用 type 来查看一个变量的类型。
注意: 和 C++ / Java 等语言不同,Python 的 int 类型变量,表示的数据范围是没有上限的,只要内存足够大,理论上就可以表示无限大小的数据。
(2) 浮点数(小数)
a = 10
print( type( a ))
注意: 和 C++ / Java 等语言不同,Python 的小数只有 float 一种类型,没有 double 类型,但是实际上 Python 的 float 就相当于 C++ / Java 的 double,表示双精度浮点数。
PS: 关于单精度浮点数和双精度浮点数的问题,我们此处不做过多讨论,大家只要知道,相比于单精度浮点数,双精度浮点数占用的内存空间更多,同时表示的数据精度更高即可(大概精确到小数点后 15 位)。
(3) 字符串
a = 'hello'
print(type( a ))
使用 ' ' 或者 " " 引起来的,称为字符串,可以用来表示文本。
注意: 在 Python 中,单引号构成的字符串和双引号构成的字符串,没有区别。'hello' 和 "hello" 是 完全等价的。
可以使用 len 函数来获取字符串的长度。
a = 'hello'
print(len( a ) )
可以使用 + 针对两个字符串进行拼接。
此处是两个字符串相加,不能拿字符串和整数/浮点数相加。
字符串作为开发中最常用到的数据类型,支持的操作方式也是非常丰富的,此处暂时不详细展开。
(4) 布尔
布尔类型是一个特殊的类型,取值只有两种,True (真) 和 False (假)。
PS: 布尔类型也是数学上的一个概念。我们初中就学过一个概念叫做 "命题",进一步的就可以判定 命题的真假。例如: 汤老湿真帅! (真命题) 汤老湿是个妹子 (假命题)
a = True
print(type( a ))
b = False
print(type( b ))
布尔类型在咱们后续进行逻辑判断的时候,是非常有用的。
(5) 其他
除了上述类型之外,Python 中还有 list、tuple、dict、自定义类型等等,我们后续再介绍。
为什么要有这么多类型?
(1) 类型决定了数据在内存中占据多大空间。
例如 float 类型在内存中占据 8 个字节。
PS: 计算机里面使用二进制来表示数据,也就是每个位只能表示 0 或者 1。
1 个二进制位,就称为是一个 "比特",8 个二进制位,就称为一个 "字节" (Byte)。
一个 float 变量在内存中占据 8 个字节空间,也就是 64 个二进制位。
我的电脑有 16GB 的内存空间,也就是一共有 1024 * 1024 * 1024 * 8 这么多的二进制位
(2) 类型其实约定了能对这个变量做什么样的操作
例如 int / float 类型的变量, 可以进行 + - * / 等操作
而 str 类型的变量,只能进行 + (并且行为是字符串拼接),不能进行 - * / ,但是还能使用 len 等其他操作。
总结: 类型系统其实是在对变量进行 "归类",相同类型的变量(数据) 往往具有类似的特性和使用规则。
动态类型特性
在 Python 中,一个变量是什么类型,是可以在 "程序运行" 过程中发生变化的,这个特性称为 "动态类型"。
a = 10
print(type( a ))
a = 'hello'
print(type( a ))
在程序执行过程中,a 的类型刚开始是 int,后面变成了 str。
C++/Java 这样的语言则不允许这样的操作,一个变量定义后类型就是固定的了,这种特性则称为 "静 态类型"。
动态类型特性是一把双刃剑
对于中小型程序,可以大大的解约代码量(比如写一段代码就可以同时支持多种类型),对于大型程序,则提高了模块之间的交互成本,(程序猿 A 提供的代码难以被 B 理解)。