1.常量表达式
可以把python当成一个计算器,进行一些算术运算:
print(1 + 2 - 3)
print(1 + 2 * 3)
print(1 + 2 / 3)
需要注意的有以下三个点:
- print是一个python内置的函数
- 可以使用+ - * / ( ) 等运算符进行算术运算,先算乘除,后算加减
- 运算符和数字之间,可以没有空格,也可以有多个空格,但是一般写一个空格(比较美观)
形如1 + 2 + 3这样的算式,在编程语言中称为表达式,算式的运算结果,称为表达式的返回值。 其中1, 2, 3这种称为字面值常量, + - * /这种称为运算符或者操作符。
注意: 熟悉C/Java的同学可能认为2/3的结果为0(小数部分被截断),但是在python中得到的结果则是一个小数,更加符合日常使用的习惯。
示例
给定四个分数 66.5,88.7,45.6,34.6 ,编写代码,求这四个分数的平均数
print( (66.5 + 88.7 + 45.6 + 34.6) / 4)
2.变量和类型
变量是什么
有时候,我们需要进行的计算可能比较复杂,需要把一些计算的中间结果保存起来,这个时候就需要用到变量。
示例
给定四个分数 66.5,88.7,45.6,34.6 编写代码,求这四个分数的方差
PS: 方差的计算过程:取每一项,减去平均值,计算平方,再求和,最后除以(项数-1)
在这个代码中,需要先计算四个数的平均值,然后再计算方差,这就需要把计算的平均值使用变量保存起来。
avg = (66.5 + 88.7 + 45.6 + 34.6) / 4
total = (66.5 - avg) ** 2 + (88.7 - avg) ** 2
+ (45.6 - avg) ** 2 + (34.6 - avg) ** 2
result = total / 3
print(result)
注意:
- avg、total、result均为变量
- ** 在python中表示乘方运算,** 2即为求平方
就像计算器中的M键功能类似,通过变量就可以保存计算过程中的中间结果。
只不过,计算器一般只能保存一个数据,而在python代码中,可以创建任意多的变量,来进行各种各样数据的保存。
变量可以视为是一块能够容纳数据的空间, 这种空间往往对应到"内存"这样的硬件设备上。
我们可以把内存想象成是一个宿舍楼,这个宿舍楼有一个个的房间,每个房间都可以存放数据。
衡量内存的一个重要指标就是内存空间的大小,比如电脑的内存是16GB,这个数字越大,也就意味着内存的存储空间就越大,能够存放的数据(变量)也就越多。
变量的语法
(1)定义变量
a = 10
创建变量的语句非常简单,其中
- a为变量名,当我们创建很多个变量的时候,就可以用名字来进行区分
- = 为赋值运算符,表示把 = 右侧的数据存入 = 左侧的空间中
注意:变量的名字要遵守一定的规则
硬性规则(务必遵守)
- 变量名由数字、字母、下划线构成
- 数字不能作为开头
- 变量名不能和“关键字”重复
- 变量名大小写敏感,num和Num是两个不同的变量名
软性规则(建议遵守)
- 变量名使用有描述的单词来表示,尽量表达出变量的作用
- 一个变量名可以由多个单词构成,长一点没关系,但是含义一定要清晰
- 当变量名包含多个单词的时候,建议使用“驼峰命名法”,形如totalCount,persoInfo这种,除了首个单词外,剩余单词首字母大写
数学上,变量通常使用x, y, z这种简单的英文字母或者拉丁字母表示,但是在编程过程中不建议这样使用;
原因是,编程中一个程序通常会同时创建出很多个变量,如果只是使用单个字母来表示,在变量多的时候,就很难区分哪个变量是干什么用的,从而给维护程序带来了一定的困难;因此我们建议使用带有明确描述性的名字,来表示变量的用途。
(2)使用变量
读取变量的值
a = 10
print(a)
修改变量的值
a = 20
print(a)
注意: 在python中,修改变量也是使用 = 运算符,看起来和定义变量没有明显区别。
当然,也可以用一个变量的值赋值给另外一个变量
a = 10
b = 20
a = b
print(a) #20
print(b) #20
变量的类型
变量里面存储的不仅仅是数字,还可以存储其他种类的数据,为了区分不同种类的数据,我们引入了“类型”这样的概念。
注意:和C++/Java等语言不同,python变量的类型不需要显式指定,而是在赋值的时候确定的。
(1)整数
a = 10
print(type(a))
PS:type和print类似,也是python的内置函数,可以使用type来查看一个变量的类型
注意:和C++/Java等语言不同,python的int类型变量,表示的数据范围是没有上限的,只要内存足够大,理论上就可以表示无穷大的数据。
(2)浮点数(小数)
a = 0.5
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)) #5
可以使用 + 针对两个字符串进行拼接
a = 'hello'
b = 'world'
print(a + b)
此处是两个字符串相加,不能拿字符串和整数/浮点数相加
字符串作为开发中最常用的数据类型,支持的操作方式也是非常丰富的。
(4)布尔
布尔类型是一个特殊类型,取值只有两种,True和False
PS:布尔类型也是数学上的一个概念,初中的时候由一个概念叫做“命题”,进一步的可以判断命题的真假,True和False
例如:
- 博主真帅(真命题)
- 博主是个妹子(假命题)
a = True
print(type(a))
b = False
print(type(b))
布尔类型在进行逻辑判断的时候,是非常有用的。
为什么要有这么多类型?
除了上述提到的类型之外,python中海油list, tuple, dict等类型,后续会介绍。
(1)类型决定了数据在内存中占据多大空间
例如float类型在内存中占据8个字节
PS:计算机里面使用二进制来表示数据,也就是每个位只能表示0或1
1个二进制位,就称为一个“比特”,8个二进制位,就称为一个“字节”(Byte)
一个float变量在内存中占据8个字节的空间,也就是64个二进制位
假设一个电脑有16GB的内存,也就是一共有102410241024*8这么多的二进制位
(2)类型约定了能对这个变量进行什么样的操作
例如 int/float 类型的变量,可以进行 + - * / 等操作
而str类型的变量,只能进行 +(行为是字符串拼接), 不能进行 - * / ;但是还能使用len等其他操作。
总结:类型系统其实是在对变量进行“归类”,相同类型的变量往往具有类似的特性和使用规则。
动态类型特性
在python中,一个变量是什么类型,是可以在“程序运行”过程中发生改变的,这个特性称为“动态类型”
a = 10
print(type(a))
a = 'hello'
print(type(a))
在程序执行过程中,a的类型刚开始是int,后面编程了str;
C++/Java这样的语言不允许这样的操作,一个变量定以后类型就是固定的了,这种特性称为”静态类型“
动态类型特性是一把双刃剑
- 对于中小型程序,可以大大的节约代码量(写一段代码可以同时支持多种类型)
- 对于大型程序,提高了模块之间的交互成本(程序员 A提供的代码难以被程序员B理解)
3.注释
注释是什么
注释是一种特殊的代码,它不会影响到程序的运行,但是能够起到解释说明的作用,能够帮助程序猿理解程序代码的执行逻辑。
PS:写代码是一件比较烧脑的事情,读代码同样也非常烧脑,相比于一板一眼的代码,一些口语化的描述更好的帮助程序猿理解程序。
# 计算 4 个数字 67.5, 89.0, 12.9, 32.2 的方差
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)
形如上述代码,如果没有注释,直接阅读,是不容易get到代码的含义是计算方差,但是通过加一行注释解释一下,就让人一目了然了。
PS:代码的第一个目标是容易理解,第二目标才是执行正确
写注释不光是为了方便别人来理解,也是方便三个月之后的自己来理解
一个反例:早些年医生的手写处方
注释的语法
python中有两种风格的注释
(1)注释行
使用 # 开头的行都是注释
# 这是一行注释
(2)文档字符串
使用三引号引起来的称为“文档字符串”,也可以视为是一种注释。
- 可以包含多行内容
- 一般放在文件/函数/类的开头
- """ 或者 ''' 均可(等价)
"""
这是文档字符串
"""
注释的规范
- 内容准确:注释内容要和代码一直,匹配,并在代码修改时及时更新
- 篇幅合理:注释既不能太简介,也不能长篇大论
- 积极向上:注释中不能包含负能量(例如 领导SB)
4.输入输出
和用户交互
和用户进行交互时需要输入输出
- 用户把信息传递给程序的过程,称为“输入”
- 程序把结果展示给用户的过程,称为“输出”
输入输出的最基本的方法就是控制台,用户通过控制台输入一些字符串,程序再通过控制台打印出一些字符串。
pyCharm运行程序,下面弹出的窗口就是控制台:
windows自带的cmd程序,也可以视为控制台:
输入输出最常见方法是图形化界面,例如我们平时用到的QQ,浏览器,steam等,都不需要用户输入命令,而只是通过鼠标点击按钮的方式进行操作。
通过控制台输出
python中使用print函数输出到控制台
print('hello')
不仅能输出一个字符串,还可以输出一个其他类型的变量
a = 10
print(a)
b = True
print(b)
更多的时候,我们希望能够输出的内容是混合了字符串和整数的。
示例:输出num = 10
num = 10
print(f'num = {num}')
注意:
- 使用f作为前缀的字符串,称为f-string
- 里面可以使用{ }来内嵌一个其他的变量/表达式
PS:python中还支持其他的格式化字符串的方法,此处是最简单的,其他的暂时不做介绍
通过控制台输入
python 使用 input 函数,从控制台读取用户的输入
num = 0
num = input('请输入一个整数:')
print(f'你输入的整数是{num}')
注意:
- input的参数相当于一个“提示信息”,也可以没有
- input的返回值就是用户输入的内容,是字符串类型
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
print(f'a + b = {a + b}')
此处的结果是字符串拼接,不是算术运算,如果想进行算术运算,需要先转换类型
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
a = int(a)
b = int(b)
print(f'a + b = {a + b}')
通过int( ) 把变量转成了 int 类型
类似的,使用float( ), bool( ), str( ) 等可以完成对应的类型转换
代码实例:输入4 个小数, 求4个小数的平均值
a = input('请输入第一个数字: ')
b = input('请输入第二个数字: ')
c = input('请输入第三个数字: ')
d = input('请输入第四个数字: ')
a = float(a)
b = float(b)
c = float(c)
d = float(d)
avg = (a + b + c + d) / 4
print(f'平均值: {avg}')
5.运算符
算术运算符
像 + - * / % ** //这种进行算术运算的运算符,称为算术运算符。
# //是一种除法向下取整的操作符
print(10 // 3) # 3
注意1:/中不能用0作为除数,否则会抛异常。
print(10 / 0)
异常是编程语言中的一种常见机制,表示程序运行过程中,出现了一些“以外情况”,导致程序不能继续向下执行下去。
注意2:整数/整数 结果可能是小数,而不会截断。
print(1/2) # 0.5
注意3: % 不是“百分数”,而是求余数
print(7 % 2) #1
关于求余数,很多人容易蒙,其实很简单:
7除以2,商是3,余数是1
注意4:**是求乘方,不光能算整数次方,还能算小数次方。
print(4 ** 2)
print(4 ** 0.5)
关系运算符
像 < <= > >= == != 这一系列的运算符称为关系运算符,它们是比较操作数之间的关系,其中
- <= 是“小于等于”
-
= 是“大于等于”
- == 是“等于”
- != 是“不等于”
(1)如果关系符合,则表达式返回True,如果不符合,则表达式返回False
a = 10
b = 20
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
print(a == b)
print(a != b)
(2)关系运算符不光针对整数/浮点数进行比较,还能针对字符串进行比较
a = 'hello'
b = 'world'
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
print(a == b)
print(a != b)
注意:
- 直接使用== 或 != 即可对字符串进行内容判定相等(和C++/Java不同)
- 字符串比较大小,规则是“字典序”
关于字典序:
想象一个英文词典,上面的单词都是按照字母顺序排列,如果首个字母相同,就比较第二个字母
单词在词典上越靠前,就越小,越靠后,就越大
(3)对于浮点数来说,不要使用 == 判断相等
print(0.1 + 0.2 == 0.3)
注意:浮点数在计算机中的表示并不是准确的,在计算过程中,就容易出现非常小的误差。
print(0.1)
print(0.2)
print(0.3)
print(0.1 + 0.2)
可以看到 0.1 + 0.2 的结果并非0.3, 而是带了一个小尾巴,虽然这个尾巴非常小,但是 == 是非常严谨的,仍会导致 ==的结果为False
不止是python如此,主流编程语言都是如此,这个是IEEE754标准规定的浮点数个数所引入的问题。
正确的比较方式:不在严格的比较相等,而是判定差值小于允许的误差范围。
a = 0.1 + 0.2
b = 0.3
print(-0.000001 < (a - b) < 0.000001)
实际工程实践中,误差在所难免,只要保证误差在合理范围内即可。
逻辑运算符
像 and or not这一系列的运算符称为逻辑运算符
- and并且,两侧操作数均为True时,最终结果为True, 否则为False(一假则假)
- or或者,两侧操作数均为False时,最终结果为False,否则为True(一真则真)
- not逻辑取反,操作数本身为True,则返回False,本身为False,则返回True
此处所说的“并且”和“或者”,就是我们日常生活中使用的"并且”和“或者”
想象一下未来丈母娘问你要彩丽,什么叫做“有房并且有车”,什么叫做“有房或者有车”
a = 10
b = 20
c = 30
print(a < b and b < c)
print(a < b and b > c)
print(a > b or b > c)
print(a < b or b > c)
print(not a < b)
print(not a > b)
一种特殊的写法
a < b and b < c 这个操作等价于 a < b < c,这个设定和大部分编程语言都不相同
关于短路求职
和其他编程语言类似,python中也存在短路求值的规则
- 对于and,如果左侧表达式为False,则整体一定为False,右侧表达式不再执行
- 对于or,如果左侧表达式为True,则整体一定为True,右侧表达式不再执行
print(10 > 20 and 10 / 0 == 1)
print(10 < 20 or 10 / 0 == 1)
上述代码没有抛出异常,说明右侧的除以0操作没有真正执行
赋值运算符
(1) = 的使用
= 表示赋值,除此之外,还能同时针对多个变量进行赋值。
链式赋值
a = b = 10
多元赋值
a, b = 10, 20
代码示例: 交换两个变量
基础写法
a = 10
b = 20
tmp = a
a = b
b = tmp
基于多元赋值
a = 10
b = 20
a, b = b, a
(2)复合赋值运算符
python中有一些复合赋值运算符,如: += -= *= /= %=
其中a += 1等价于a = a + 1,其他的赋值运算符也是同理
a = 10
a = a + 1
print(a)
b = 10
b += 1
print(b)
注意:像C++/Java中,存在 ++ -- 这样的自增/自减运算符,python中不支持这种运算,如果需要使用,可以直接使用 += 1或者 -= 1
++ -- 最大的问题就是容易分不清前置和后置的区别,这一点python设计的时候就进行了规避,避免混淆语法
自测练习
(1) [多选] 以下关于变量之间加法运算的说法, 正确的是:
A. Python 中的字符串之间够能相加.
B. Python 中的字符串可以和整数相加.
C. Python 中的整数可以和浮点数相加.
D. Python 中的整数可以和布尔值相加.
(2) [单选] 以下关于类型的说法, 正确的是:
A. Python 中既有字符串类型, 也有字符类型.
B. Python 中既有 float, 也有 double.
C. Python 中既有 int, 也有 long
D. Python 中的整数表示范围无上限.
(3) [单选] 以下 Python 代码, 合法的是
A. int a = 10
B. a = 10;
C. a = true
D. a = 'aaa
答案:1.ACD 2.D 3.C