序言:
在之前,我们已经对【python】的开发环境进行了相应的安装,紧接着本期我就讲给大家介绍它的相关语法。对于学过【C/C++】或者其他语言的小伙伴来说,语法内容学习起来就会掌握的很快了。
目录
【分析】
- 熟悉 C / Java 的同学可能认为, 【2 / 3 】结果为 0 (小数部分被截断);
- 但是在 Python 中得到的结果则是 一个小数. 更符合日常使用的直觉,且在编程中一般没有“四舍五入”这样的规则,因此大家发现最末位输出的是 “5”;
- 形如 1 + 2 - 3 这样是算式, 在编程语言中称为 表达式, 算式的运算结果, 称为 表达式的返回值;
- 其中 1 , 2 , 3 这种称为 字面值常量, + - * / 这种称为 运算符 或者 操作符.
【注意】
- print 是一个 Python 内置的 函数, 这个稍后详细介绍.
- 可以使用 + - * / ( ) 等运算符进行算术运算. 先算乘除, 后算加减.
- 运算符和数字之间, 可以没有空格, 也可以有多个空格. 但是一般习惯上写一个空格(比较美观).
示例
给定四个分数, 67.5, 89.0, 12.9, 32.2 , 编写代码, 求这四个分数的平均数.
(二)变量和类型
1、变量是什么
有的时候, 我们需要进行的计算可能更复杂一些, 需要把一些计算的中间结果保存起来. 这个时候就需要用到 变量.
示例
给定四个分数, 67.5, 89.0, 12.9, 32.2 , 编写代码, 求这四个分数的方差.
PS: 方差的计算过程: 取每一项, 减去平均值, 计算平方, 再求和, 最后除以 (项数 - 1)
在这个代码中, 就需要先计算这四个数字的平均值, 然后再计算方差. 这就需要把计算的平均值使用 变量 保存起来.
注意
- avg, total, result 均为变量.
- 【** 】在 Python 中表示乘方运算. ** 2 即为求平方.
就像计算器中的 M 键功能类似, 通过变量就可以保存计算过程中的中间结果.
- 只不过, 计算器一般只能保存一个数据, 而在 Python 代码中, 可以创建任意多的变量, 来随心所欲的保存很多很多的数据.
变量可以视为是一块能够容纳数据的空间,这个空间往往对应到 "内存" 这样的硬件设备上.
【注意】
- PS: 我们可以把内存想像成是一个宿舍楼, 这个宿舍楼上有很多的房间. 每个房间都可以存放数据.;
- 衡量内存的一个重要指标就是内存空间的大小, 比如我的电脑内存是 16GB. 这个数字越大, 意味着 内存的存储空间就越大, 能够存放的数据(变量) 就越多.
2、变量的语法
Python 变量和类型是 Python 语言中最基本的概念之一。变量是用于存储数据值的标识符,而类型则定义了这些数据值的性质和操作。
在 Python 中,所有的变量都是“对象”,并且每个对象都具有“类型”。与其他编程语言不同,Python 是一种动态类型的语言,因此变量的类型可以在运行时自由更改。
注意: 和 C++ / Java 等语言不同, Python 变量的类型不需要显式指定, 而是在赋值的时候确定的
💨下面是 Python 中的一些常见数据类型和变量:
1️⃣数字类型
Python 中的数字类型包括整数、浮点数和复数;
通常,Python 根据值的大小来确定数字类型,例如 42
和 1000000
都是整数,而 3.14
和 1e-10
是浮点数。如果要创建一个复数,可以使用 【complex(real, imag)
】函数。
输出如下:
- PS: type 和 print 类似, 也是 python 内置的函数. 可以使用 type 来查看一个变量的类型.
【注意】
和 C++ / Java 等语言不同, Python 的 int 类型变量, 表示的数据范围是没有上限的. 只要内存足够 大, 理论上就可以表示无限大小的数据.
【分析】
- 这是一个Python中创建复数的语句。这个语句创建了一个复数`c`,其中实部为1,虚部为2;
- 复数是包含实部和虚部的数,可以用来表示平面上的点;
- 在Python中,复数可以用`complex`函数来创建,语法为`complex(a, b)`,其中`a`是实部,`b`是虚部。
【注意】
- 和 C++ / Java 等语言不同, Python 的小数只有 float 一种类型, 没有 double 类型;
- 但是实际上 Python 的 float 就相当于 C++ / Java 的 double, 表示双精度浮点数.
PS: 关于单精度浮点数和双精度浮点数的问题, 我们此处不做过多讨论. 大家只要知道, 相比于单精 度浮点数, 双精度浮点数占用的内存空间更多, 同时表示的数据精度更高即可(大概精确到小数点后 15 位).
2️⃣字符串类型
Python 中的字符串类型用于存储文本数据。可以使用单引号、双引号或三引号来表示字符串;
例如 "Hello, World!"
和 'I\'m a Python developer.'
都是有效的字符串。
注意
在 Python 中, 单引号构成的字符串和双引号构成的字符串, 没有区别. 'hello' 和 "hello" 是 完全等价的.
💨 此处是两个字符串相加. 不能拿字符串和整数/浮点数相加.
其次还可以使用 len 函数来获取字符串的长度.
字符串作为开发中最常用到的数据类型, 支持的操作方式也是非常丰富的. 此处暂时不详细展开.
3️⃣bool类型
在Python中,bool是一种基本数据类型,用于表示逻辑真和逻辑假。一个bool型变量只能取True或False两个值。
在Python中,可以通过关键字True和False来分别表示逻辑真和逻辑假。例如:
- 布尔类型在咱们后续进行逻辑判断的时候, 是非常有用的.
在条件判断和循环语句中,bool类型的变量通常用来表示条件是否成立。如果条件成立,bool型变量的取值为True;否则为False。例如:
输出结果将根据变量x的取值来决定;
- 当x为True时,输出"x is true";
- 当x为False时,输出"x is false"
4️⃣列表类型
列表是一种可变序列,可以包含任意类型的数据。可以使用方括号 [] 来创建列表,并使用索引(从 0 开始)来访问和修改元素。例如 [1, 2, 3]
和 ['apple', 'banana', 'cherry']
都是有效的列表。
arr = [1, 2, 3, 4, 5]
# 访问元素
print(arr[0]) # 输出第一个元素
print(arr[-1]) # 输出最后一个元素
输出如下:
# 修改元素
arr[0] = 0
print(arr)
输出如下:
【分析】
- 这是Python中对列表(list)或其他可切片对象进行切片操作的语法,表示创建一个新的列表`arr2`,它是从列表`arr`的索引1处开始(包括索引1位置上的元素),到索引3处结束(不包括索引3位置上的元素),所包含的元素所组成的子列表;
- 换句话说,`arr2`包含`arr`列表中的第2和第3个元素,是一个新列表;
- 需要注意的是,这里所指的索引不是从0开始,而是从1开始计数。
💨 除了上述类型之外, Python 中还有 tuple, dict, 自定义类型 等等. 我们后续再介绍.
3、为什么要有这么多类型?
(1) 类型决定了数据在内存中占据多大空间.
例如 float 类型在内存中占据 8 个字节.
PS: 计算机里面使用二进制来表示数据. 也就是每个位只能表示 0 或者 1.
1 个二进制位, 就称为是一个 "比特", 8 个二进制位, 就称为一个 "字节" (Byte)
一个 float 变量在内存中占据 8 个字节空间, 也就是 64 个二进制位.
假设我的电脑有 16GB 的内存空间, 也就是一共有 1024 * 1024 * 1024 * 8 这么多的二进制位.
(2) 类型其实约定了能对这个变量做什么样的操作.
- 例如 int / float 类型的变量, 可以进行 + - * / 等操作
- 而 str 类型的变量, 只能进行 + (并且行为是字符串拼接), 不能进行 - * / , 但是还能使用 len 等其他操作.
【总结】
- 类型系统其实是在对变量进行 "归类". 相同类型的变量(数据) 往往具有类似的特性和使用规则.
4、动态类型特性
在 Python 中, 一个变量是什么类型, 是可以在 "程序运行" 过程中发生变化的. 这个特性称为 "动态类型" .
- 在程序执行过程中, a 的类型刚开始是 int, 后面变成了 str
C++/Java 这样的语言则不允许这样的操作. 一个变量定义后类型就是固定的了. 这种特性则称为 "静态类型".
Python是一种动态类型语言,具有以下动态类型特性:
-
不需要提前声明变量的数据类型:在Python中,不需要显式地声明变量的数据类型,可以直接赋值。Python会根据变量的值来确定变量的数据类型。
-
变量的类型可以在运行时改变:在Python中,变量的类型是可以在程序运行时动态改变的,即一个变量在某个时刻可以是整数,而在另一个时刻可以是字符串。
-
对变量和对象的引用不限制类型:在Python中,变量名只是一个符号,对于任何一个变量,可以使用同一个变量名来引用不同类型的对象。
-
内置函数type()可以用来获取变量的类型:在Python中,可以使用内置函数type()来获取变量的数据类型。
由于Python具有动态类型的特性,因此它更加灵活和易于使用,但也需要程序员在编写代码时更加注意变量类型的变化,以确保程序能够正确运行。
(三)注释
1、注释是什么
注释是一种特殊的代码, 它不会影响到程序的执行, 但是能够起到解释说明的作用, 能够帮助程序猿理解程 序代码的执行逻辑.
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: 代码的第一目标是容易理解, 第二目标才是执行正确. 写注释不光是为了方便别人来理解, 也是方便几个月之后的自己理解.
一个反例: 早些年医生的手写处方
2、注释的语法
Python 中有两种风格的注释.
(1) 注释行
使用 # 开头的行都是注释.
# 这是一行注释.
(2) 文档字符串
使用三引号引起来的称为 "文档字符串", 也可以视为是一种注释.
- 可以包含多行内容;
- 一般放在 文件/函数/类 的开头;
- """ 或者 ''' 均可 (等价).
"""
这是文档字符串
这是文档字符串
"""
3、注释的规范
1. 内容准确: 注释内容要和代码一致, 匹配, 并在代码修改时及时更新.
2. 篇幅合理: 注释既不应该太精简, 也不应该长篇大论.
3. 使用中文: 一般中国公司都要求使用中文写注释, 外企另当别论.
4. 积极向上: 注释中不要包含负能量(例如 领导 SB 等).
(四)输入输出
1、和用户交互
程序需要和用户进行交互.
- 用户把信息传递给程序的过程, 称为 "输入".
- 程序把结果展示给用户的过程, 称为 "输出".
输入输出的最基本的方法就是控制台. 用户通过控制台输入一些字符串, 程序再通过控制台打印出一些字 符串.
PyCharm 运行程序, 下方弹出的窗口就可以视为是控制台.
windows 自带的 cmd 程序, 也可以视为是控制台.
输入输出的最常见方法是图形化界面. 如我们平时用到的 QQ, 浏览器, steam 等, 都不需要用户输入命令, 而只是通过鼠标点击窗口点击按钮的方式来操作.
Python 当然也可以用来开发图形化界面的程序. 但是图形化程序开发本身是一个大话题. 咱们现在暂时不做介绍.
2、通过控制台输出
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 中还支持其他的格式化字符串的方法, 咱们此处只了解这个最简单的即可. 其他的暂时 不做介绍.
3、通过控制台输入
python 使用 input 函数, 从控制台读取用户的输入.
【 注意】
- input 的参数相当于一个 "提示信息", 也可以没有.
- input 的返回值就是用户输入的内容. 是字符串类型.
- 在python中批量注释为:ctrl+/
- 此处的结果是字符串拼接, 不是算术运算. 如果要想进行算术运算, 需要先转换类型.
- 通过 int( ) 把变量转成了 int 类型.
- 类似的, 使用 float( ), bool( ), str( ) 等可以完成对应的类型转换
💨 代码示例: 输入 4 个小数, 求 4 个小数的平均值.
此处为了输入 4 个数字, 执行了四次 input. 如果是读取任意多个数字怎么办呢? 这个时候就需要用 到循环了(后面再介绍)。
(五)运算符
在 Python 中,表达式是由运算符和操作数组成的代码片段。Python 支持许多不同类型的运算符,包括算术、比较、逻辑和位运算符。下面是一些常用的运算符和示例:
1、算术运算符
像 + - * / % ** // 这种进行算术运算的运算符, 称为 算术运算符
💨 注意1: / 中不能用 0 作为除数. 否则会 抛出异常
print(10 / 0)
- 异常 是编程语言中的一种常见机制, 表示程序运行过程中, 出现了一些 "意外情况", 导致程序不能继 续往下执行了.
💨 注意2: 整数 / 整数 结果可能是小数. 而不会截断
💨 注意3: % 不是 "百分数", 而是求余数.
- 关于求余数, 有些同学容易蒙. 其实这个是小学二年级数学就学过的.
- 7 除以 2 , 商是 3 , 余数是 1.
💨 注意4: ** 是求乘方. 不光能算整数次方, 还能算小数次方.
💨 注意5: // 是取整除法(也叫地板除). 整数除以整数, 结果还是整数(舍弃小数部分, 并向下取整. 不是四舍五入)
【小结】
2、关系运算符
像 < >= == != 这一系列的运算符称为 关系运算符, 它们是在比较操作数之间的关系.
其中
- <= 是 "小于等于"
- >= 是 "大于等于"
- == 是 "等于"
- != 是 "不等于"
(1) 如果关系符合, 则表达式返回 True. 如果关系不符合, 则表达式返回 False
(2) 关系运算符不光针对整数/浮点数进行比较, 还能针对字符串进行比较.
【注意】
- 直接使用 == 或者 != 即可对字符串内容判定相等. (这一点和 C / Java 不同).
- 字符串比较大小, 规则是 "字典序"
关于字典序:
想象一个英文词典, 上面的单词都是按照字母顺序排列. 如果首个字母相同, 就比较第二个字母. (就 比如著名单词 abandon).
我们认为一个单词在词典上越靠前, 就越小. 越靠后, 就越大.
(3) 对于浮点数来说, 不要使用 == 判定相等.
注意: 浮点数在计算机中的表示并不是精确的! 在计算过程中, 就容易出现非常小的误差.
- 可以看到, 0.1 + 0.2 的结果并非是 0.3 , 而是带了个小尾巴.;
- 虽然这个尾巴非常小了, 但是 == 是锱铢 必较的, 仍然会导致 == 的结果为 False
不止是 Python 如此, 主流编程语言都是如此. 这个是 IEEE754 标准规定的浮点数格式所引入的问题. 此处我们不做过多讨论.
💨 正确的比较方式: 不再严格比较相等了, 而是判定差值小于允许的误差范围.
a = 0.1 + 0.2
b = 0.3
print(-0.000001 < (a - b)< 0.000001)
- 实际工程实践中, 误差在所难免, 只要保证误差在合理范围内即可.
【小结】
3、逻辑运算符
像 【and or not 】这一系列的运算符称为 逻辑运算符.
- and 并且. 两侧操作数均为 True, 最终结果为 True. 否则为 False. (一假则假)
- or 或者. 两侧操作数均为 False, 最终结果为 False. 否则为 True. (一真则真)
- not 逻辑取反. 操作数本身为 True, 则返回 False. 本身为 False, 则返回 True.
此处说的 "并且" 和 "或者", 就是我们日常生活中使用的 "并且" 和 "或者".
想象一下未来丈母娘问你要彩礼, 什么叫做 "有房并且有车", 什么叫做 "有房或者有车".
💨 一种特殊写法
- a < b and b < c 这个操作等价于 a < b < c . 这个设定和大部分编程语言都不相同.
💨 关于短路求值
和其他编程语言类似, Python 也存在短路求值的规则.
- 对于 and, 如果左侧表达式为 False, 则整体一定为 False, 右侧表达式不再执行.
- 对于 or, 如果左侧表达式为 True, 则整体一定为 True, 右侧表达式不再执行.
- 上述代码没有抛出异常, 说明右侧的除以 0 操作没有真正执行.
【小结】
4、赋值运算符
(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 . 其他复合赋值运算符也是同理.
【 注意】
- 像 C++ / Java 中, 存在 ++ -- 这样的自增/自减运算符;
- Python 中则不支持这种运算. 如果需要使用, 则直接使用 += 1 或者 -= 1
其他...
除了上述之外, Python 中还有一些运算符, 比如 身份运算符 (is, is not), 成员运算符 (in, not in), 位运算符 ( & | ~ ^ >) 等.
此处咱们暂时不介绍.
总结
以上便是本文的全部内容了。感谢大家的观看与支持!!!