一、常量表达式
在编程中,常量指的是在程序执行期间其值不会改变的数据项。虽然 Python 并没有专门的语法来定义常量(不像某些其他语言如 Java 中有 final
关键字),但在实践中,我们通常通过约定俗成的方式来表示一个变量是一个“常量”:
示例:
# 算术表达式
a = 5 + 3 * 2 # 结果为 11,注意乘法优先于加法
# 关系表达式
b = 10 > 5 # b 的值为 True
# 逻辑表达式
c = (10 > 5) and (2 < 3) # c 的值为 True
print(1 + 2 - 3)
print(1 + 2 * 3)
print(1 + 2 / 3)
代码里的print()
是 Python 中的一个内置函数,用于将内容输出到终端(屏幕)上。它是我们最常用的调试工具之一,可以让我们看到程序运行时的中间结果、变量值、提示信息等。这个我们后续详谈
- 可以使用+-*/()等运算符进行算术运算,先算乘除后算加减
- 运算符和数字之间,可以没有空格,但是一般习惯上写一个空格(比较美观)
- 例如 1 + 2 - 3 这样是算式,在编程语言中被称为表达式,而运行后的结果,就是这个表达式的返回值
- 其中1,2,3这种被称为字面值常量, +-*/ 这种被称为运算符或者操作符
表达式的类型:
算术表达式:涉及数值及其运算符(如
+
,-
,*
,/
)。关系表达式:比较两个值(如
==
,!=
,>
,<
)。逻辑表达式:结合多个条件(如
and
,or
,not
)。
这里注意一下,我们发现第三个表达式计算出来后是 1.66666666665,而不是1。而我们熟悉了c或者java的兄弟可能觉得很奇怪,其实在Python中得到的结果则是一个小数,更符合日常使用的直觉
例如:给定四个分数,65.5 , 89.0 , 12.9 , 32.2 ,编写代码,求这四个分数的平均数
print((65.5 + 89.0 + 12.9 + 32.2) / 4)
二、变量和类型
2.1 变量是啥?
有的时候,我们需要进行的计算可能会复杂一点,计算过程中需要把一些中间结果保存起来,那么这个时候就是通过变量这个东西
就例如我们现在要计算一个方差
- 给四个数, 67.5 , 89.0 , 12.9 , 32.2,编写代码,求这四个数的方差
- 方差计算过程:取每一项,减去平均值,计算平方,再求和,最后除以(项数 - 1)
- 计算这四个数的平均值
- 取每一项,减去平均值,计算平方,再求和 把最后的值给total
- 把total除以(项数 - 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)
注意:avg,total,result都是变量
**在python里面表示乘方运算。 **2就是平方
而变量可以视为是一块可以存放数据的一个空间,而这个空间是开辟在内存中过地方的
想象内存是一个大仓库,有许多小格子,每个格子有唯一编号(地址)。当我们声明一个变量
int avg = 30;
,计算机在仓库中找到一个空闲格子,放进去30,并记下标签“age”指向那个格子编号。(图上一个存放50.400000000000006)
2.2 变量的语法
2.2.1 变量的定义
a = 10
//a是变量名。
// 10是值。
//变量名+赋值运算符+值
创建变量非常简单:
- a是变量名。当我们创建很多个变量的时候,大家的变量名要取一个有意义,例如你创建的变量是用来计数的,就可以取为count
- = 为赋值运算符,表示把 = 右侧的数据放到 = 左侧空间中 ,注意,是由右向左
注意事项(规则):
- 变量名由数字、字母、下划线构成
- 数字不能开头
- 变量名不能和“关键字重复”。例如:print
- 变量名大小写敏感。num和Num是两个不同的变量名
变量取名建议:
- 变量名最好用有意义的单词来表示,就是我刚刚说的
- 驼峰命名法(CamelCase):首个单词小写,后续单词首字母大写,如 $userName$(常用于Java、JavaScript)。
- 蛇形命名法(snake_case):单词间用下划线连接,如 $user_name$(常用于Python、Ruby)。
- 常量命名:全大写加下划线,如 $MAX_VALUE$。
2.2.2 变量的使用
读取变量的值:
a = 10
print(a)
修改变量的值
a = 10
pritn(a)
#修改a
a = 20
print(a)
当然,我们也可以使用其他的变量来修改需要修改的值
a = 10
b = 20
a = b
print(a)
print(b)
一开始对变量a和b进行初始化,随后 a = b,将b的值赋给a,这样就把a的值给改变了!!!
2.2.3 变量的类型
变量里面存储的不仅仅是数字,还可以存储其他种类的数据,未来区分不同种类的数据,我们引入了“类型”这一概念。
注意:Python和C++/java等语言不同,Python的变量类型是不需要显示指定的,而是在赋值的时候确定的
例如c++和java
//在 C++ 和 Java 中,变量类型必须在定义时明确写出,否则编译器会报错
int age = 20; // 必须显式指定类型
string name = "Tom";
而Python:
x = 10 # x 是整数
x = "Hello" # x 变成字符串
x = [1, 2, 3] # x 变成列表
2.2.3.1 整数
a = 10
print(type(a))
PS:pyte和print类似,也是Python内置的函数,pyte可以来查看一个变量的类型
这里注意一个点:Python的int类型变量,所表示的不是四个字节,而是 没有上限 的,只要内存足够大,理论上就可以表示无限大小的数组
2.2.3.2 浮点数
a = 0.5
print(type(a))
字符串需要用 ' (单引号)或者 " (双引号) ,被这两个符号所包围起来的就被称为字符串。可以用来表示文本
注意'hello'和"hello"是等价的
可以使用 len 函数来计算一个字符串的长度
a = 'hello'
print(len(a))
可以使用+针对两个字符串的拼接
a = "hello"
b = " world"
print(a+b)
a = "hello"
b = 1
print(a+b)
此处只是字符串相加,不能拿字符串和其他类型相加
2.2.3.4 布尔
布尔类型是一个特殊的类型(用于逻辑判断),取值只有两种:True(真)和False(假)
PS:这里True(真)和False(假)必须是首字母大写的
而真假是什么?
例如:
女生每月会有生理期(真)
男士每月会有生理期(假)
a = True
print(type(a))
b = False
print(type(b))
三、变量类型的意义
类型决定了数据在内存中占据多大内存空间
- float类型在内存中占据8个字节
- int 动态扩容
- bool为一个字节
类型约定了能对这个变量做了什么样的工作
- 例如int / float 类型的变量,可以进行+ - * / 等操作
- 而str类型的变量,只能进行+(并且行为是字符串拼接),不能进行 - * / ,但是还能使用len等其他操作
四、动态类型特性
在Python中,一个变量是什么类型,是可以在"程序运行"过程中发生变化的(也就是变量类型是可以改变的)。这个特性称为“动态类型”
a = 10
print(type(a))
a = 'hello'
print(type(a))
大家注意,程序执行过程中,a的类型从int变为str了,而这是在c++/Java中是不行的
- 静态类型
程序运行时,变量的类型始终不变
- 动态类型
程序运行时,变量的类型是可以改变的
一个编程语言,是否为动态类型,只取决于运行时,类型是否发生改变,不取决于变量定义的时候是否声明类型
当然了,动态类型是一把双刃剑
- 对于中小型程序,他能大大节约代码量
- 对于大型程序,则提高了模块之间交互的成本(A提供的代码很难被B看懂)
其实这就是为什么很多公司一开始使用Python语言来完成项目,而后期又要针对原来的代码用其他语言重构
五、注释
在编程中,注释就是写在代码中、给程序员看的“说明文字”。它不会被 Python 解释器执行,也就是说,计算机不会运行注释里的内容,但它是写给人看的。
5.1 注释的作用
注释的作用
- 解释代码:让别人(或未来的你)更容易理解代码的意图。
- 调试代码:暂时屏蔽某段代码,方便调试。
- 文档说明:在大型项目中,注释可以作为文档的一部分,说明函数、类或模块的功能。
- 协作沟通:多人协作时,注释可以说明你为什么这样写代码。
5.2 注释的方式
5.2.1.单行注释
使用 #
符号,从 #
开始到这一行的末尾都会被当作注释。
# 这是一个打印语句,输出“你好,Python!”
print("你好,Python!")
5.2.2 多行注释(块注释)
虽然 Python 没有专门的多行注释语法,但我们可以使用三引号 '''
或 """
来实现多行注释:
'''
这是一个多行注释的例子。
你可以在这里写很多行说明。
这些内容不会被执行。
'''
print("多行注释演示")
注意:严格来说,三引号是字符串,如果它没有被赋值给变量,也不会被运行,因此可以当作注释使用。但在某些上下文中,它可能作为文档字符串(docstring)使用,我们后面会专门讲解。
5.2.3 注释的使用规范
注释的使用规范(建议):
类型 | 写法 | 示例 |
---|---|---|
单行注释 | # 注释内容 |
# 计算两个数的和 |
行末注释 | 代码 # 注释 |
x = 5 # 设置初始值 |
多行注释 | ''' 注释内容 ''' 或 """ 注释内容 """ |
"""
这是一个函数说明:
输入两个参数,返回它们的和。
"""
5.2.4 优秀注释的例子
注释写得好,代码更清晰!
# 定义两个变量
a = 3
b = 4
# 计算平方和
c = a**2 + b**2
# 输出结果
print(c)
对比没有注释的版本:
a = 3
b = 4
c = a**2 + b**2
print(c)
你觉得哪种更容易理解呢?没错,加上注释之后,即使是一个新接触这段代码的人,也能迅速理解每一行代码的目的。
六、输入输出
6.1 和用户交用
- 用户把消息传递给程序的过程,称为"输入"
- 用户把结果展示给用户的过程,称为"输出"
输入输出的最基本方法就是控制台:用户通过控制台输入一些字符串,程序再通过控制台打印一些字符串
vs code运行程序的时候,下方弹出的窗口就是控制台
Mac OS自带的终端,也可以视为控制台
输入输出的最常见方法是图形化界面。我们平常对于电脑的操作基本都是图形化界面
6.2 通过控制台输出
Python使用print函数输出到控制台
print('hello')
不仅可以输出一个字符串,还可以输出一个其他类型的变量
a = 10
print(a)
b = True
print(b)
更多的时候,我们希望能够输出的内容是混合了字符串的变量
例如:输出num = 10
num = 10
print(f'num = {num}')
注意:这里的 f'num = {num}' 是一种格式化字符串,使用{}来嵌入变量或表达式
例如:
#格式化字符串 a = 10 #希望数字和字符串混在一起 print(f'a = {a + 10}')
6.3 通过控制台输入
Python使用input函数输入,从控制台读取用户的输入
# 通过控制台输入
num = 0
num = input('请输入一个整数:')
print(f'你输入的整数是{num}')
当我们在控制台输入10,再按回车,就运行完成
注意:
- 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}')
小练习:输入5个小数,求5个小数的平均值
a = input('请输入一个整数:')
b = input('请输入二个整数:')
c = input('请输入三个整数:')
d = input('请输入四个整数:')
e = input('请输入五个整数:')
a = int(a)
b = int(b)
c = int(c)
d = int(d)
e = int(e)
avg = (a + b + c + d + e)/5
print(f'平均值: {avg}')
七、运算符
7.1 算术运算符
像 + - * / % ** // 这种进行算术运算的运算符,称为算术运算符
算术规则:先算乘方,然后是乘除,最后是加减。如果运算过程中想修改默认的运行程序,就需要加上“()”
注意1:/中不能用0作为除数。否则会抛出异常
print(10/0)
注意2 :整数/整数结果可能是小数,而不会截断
print(1/2)
注意3:%不是“百分数”,而是求余数
print(7%2)
关于求余数,有些同学容易蒙,其实这个就是我们小学学过的
7除以2,商3余1
注意4: **是乘方,不光能算整数次方,还可以算小数次方
print(4 ** 2)
print(4 ** 0.5)
注意5: //是取整除法(也叫地板除)整数除以整数,结果还是整数(舍弃小数部分,并向下取整,不是四舍五入)
print(7 // 2)
print(-7 // 2)
7.2 关系运算符
像 < <= > >= == != 这一系列的运算符被称为关系运算符
- <= 是"小于等于"
- >= 是"大于等于"
- == 是"等于"
- != 是"不等于"
7.2.1 如果关系符合,则返回Ture,如果不符合,返回False
a = 10
b = 20
print(a < b)
print(a <= b)
print(a < b)
print(a >= b)
print(a == b)
print(a != b)
7.2.2 关系运算符不光针对整数/浮点数进行比较,还能针对字符串进行比较
a = 'hello'
b = 'world'
print(a < b)
print(a <= b)
print(a < b)
print(a >= b)
print(a == b)
print(a != b)
注意:
- 直接使用 == 或者 != 即可对字符串内容判断是否相等
- 字符串比较大小,规则是“字典序”
字典序:
一个随意单词,例如absorb,这个单词再字典里都是按照字母顺序排列,如果首个字母相同,就比较第二个字母
我们认为一个单词再字典上越靠前,就越小,越靠后,就越大
7.2.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,而是一个和0.3极其接近的0.30000000004
那么该如何操作来得到我们理想的0.3呢:做差来判定差值小于允许的误差范围
a = 0.1 + 0.2
b = 0.3
print(-0.000001 < (a - b) < 0.0000001)
八、逻辑运算符
8.1 and or not
像 and、or、not 这一系列的运算符被称为 逻辑运算符
- and:表并且,两侧操作数均为Ture,最终结果为Ture,否则为False(一假则假)
- or:表或者,两侧操作数均为False,最终结果为False,否则为Ture(一真则真)
- not:逻辑取反,操作数本身为Ture,则返回False,则返回Ture
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)
另一种写法:我们可以把 print(a < b and b < c) 等价于 a < b < c
8.2 短路求值
和其他编程语言类似,Python也存在短路求值的规则
- 关于and,如果左侧表达式为False,则整体一定为False,右侧表达式不再执行
- 对于or , 如果左侧表达式为Ture,则整体一定为Ture,右侧表达式不再执行
print(10 > 20 and 10 / 0 == 1)
print(10 < 20 or 10 / 0 == 1)
九、赋值运算符
9.1 = 的使用
= 表示赋值,这个我们已经用过很多次了
=除了基本的用法外,还可以同时针对多个变量进行复制
9.1.1 链式赋值
a = b = 10
9.1.2 多元赋值
a, b = 10, 20
9.1.3 小案例:交换两个变量
基于链式复制(基础写法):
a = 10
b = 20
tmp = a
a = b
b = tmp
- 先定义两个变量a,b
- 将a的值赋给一个空变量
- 再见b的值赋给a
- 最后把空变量(这是存放的是a的值)赋给b
举个小例子:我们要将酱油和醋换一下,那这时候就一定要有个开瓶子暂时存放,让其中一个空出来,就例如让酱油空出来(酱油倒入tmp),这时候就可以把醋倒入酱油内
基于多元赋值:
a = 10
b = 20
a , b = b , a
9.2 复合赋值运算符
Python还有一些 复合赋值运算符 ,例如:+= -= *= /= %=
a = 10
a = a+1
a += 1
print(a)
a += 1 等价于 a = a+1
本节完