基础语法(1):变量、注释、输入输出、运算符
1. 常量和表达式
我们可以把 Python 当成一个计算器, 来进行一些算术运算
print(1 + 2 - 3)
print(1 + 2 * 3)
print(1 + 2 / 3)
输出:
0
7
1.6666666666666665
- 形如
1 + 2 - 3
这样是算式, 在编程语言中称为 表达式, 算式的运算结果, 称为表达式的返回值 - 其中
1 , 2 , 3
这种称为 字面值常量,+ - * /
这种称为 运算符 或者 操作符
注意: 熟悉 C / Java / C++ 的同学可能认为, 2 / 3 结果为 0 (小数部分被截断)。但是在 Python 中得到的结果则是一个小数, 更符合日常使用的直觉
2. 变量和类型
2.1 变量是什么
变量可以视为是变量可以视为是一块能够容纳数据的空间。 这个空间往往对应到 “内存” 这样的硬件设备上。
2.2 变量的语法
(1) 定义变量
a=10
- a 为变量名,当我们创建很多个变量的时候, 就可以用名字来进行区分
- = 为赋值运算符, 表示把 = 右侧的数据放到 = 左侧的空间中
变量命名规则:
硬性规则(务必遵守)
- 变量名由数字字母下划线构成
- 数字不能开头
- 变量名不能和 “关键字” 重复
- 变量名大小写敏感,
num
和Num
是两个不同的变量名
软性规则(建议遵守)
- 变量名使用有描述性的单词来表示, 尽量表达出变量的作用
- 一个变量名可以由多个单词构成, 长一点没关系, 但是含义要清晰
- 当变量名包含多个单词的时候, 命名有多种规范
- “驼峰命名”,形如
totalCount
,personInfo
这种, 除了首个单词外, 剩余单词首字母大写 - “蛇形命名”,形如
total_count
,person_info
这种, 单词之间使用_来分割
- “驼峰命名”,形如
(2) 使用变量
读取变量的值
a = 10 # 首次使用,初始化
print(a)
修改变量的值
a = 20 # 再次使用,赋值
print(a)
注意: 在 Python 中, 修改变量也是使用 = 运算, 看起来和定义变量没有明显区别
2.3 变量的类型
变量里面存储的不仅仅是数字, 还可以存储其它种类的数据。 为了区分不同种类的数据, 我们引入了 "类型"这样的概念
注意: 和 C++ / Java 等语言不同, Python 变量的类型不需要显式指定, 而是在赋值的时候确定的
(1) 整数
a = 10
print(type(a))
输出:
<class 'int'>
type 和 print 类似, 也是 python 内置的函数. 可以使用 type来查看一个变量的类型
注意:
- 在C++中int最大表示到-21亿~21亿
- Python, int能表示的数据范围是无穷的, int是可以根据要表示数据的大小,自动扩容。因此python中没有short, long这样的类型
(2) 浮点数(小数)
a = 0.5
print(type(a))
输出:
<class 'float'>
注意:
- 在C++/Java中float是4个字节,也叫做"单精度浮点数",double是8个字节,也叫做"双精度浮点数"
- Python 的小数只有 float 一种类型, 没有 double 类型;Python中的float就相当于C++/Java的double, 表示双精度浮点数
(3) 字符串
a = 'hello'
print(type(a))
输出:
<class 'str'>
Python中要求使用引号把一系列字符引起来就构成了字符串,引号使用 '
或 "
都可以,'hello'
和"hello"
是完全等价的
一句话中本身包含双引号,打印时用
'
把这句话括起来
# 打印: my name is "zhangsan"
a='my name is "zhangsan"'
print(a)
一句话中本身包含单引号,打印时用
"
把这句话括起来
# 打印: hello 'world'
a="hello 'world'"
print(a)
一句话中既包含单引号又包含双引号,打印时用
'''
把这句话括起来
# 打印: my 'name' is "zhangsan"
a='''my 'name' is "zhangsan"'''
print(a)
Python中也可以用三引号来表示字符串,即
'''
或"""
# a,b表示的字符串完全等价
a='''hello'''
b="""hello"""
字符串相关操作
可以使用 len 函数来获取字符串的长度
a = 'hello'
print(len(a))
输出:
5
可以使用 + 针对两个字符串进行拼接
a = 'hello'
b = 'world'
print(a + b)
输出:
helloworld
注意:不能把字符串和数字混合相加
(4) 布尔
布尔类型是一个特殊的类型, 取值只有两种, True (真) 和 False (假),主要用于逻辑判定
a = True
print(type(a))
b = False
print(type(b))
输出:
<class 'bool'>
<class 'bool'>
注意:在Java/C++中布尔取值表示为true/false,Python中表示为True/False
2.4 为什么要有这么多类型?
- 类型决定了数据在内存中占用多大内存空间
- int默认占用4个字节,动态扩容
- float固定8个字节
- bool占用1个字节
- 类型决定了对变量进行什么样的操作
- int/float 类型的变量, 可以进行 + - * / 等操作,不能使用len
- str类型的变量, 只能进行 + (并且行为是字符串拼接), 不能进行 - * / , 但是还能使用 len 等其他操作
2.5 动态类型特性
静态类型:程序运行的过程中,变量的类型始终不变。
C++/Java中:int a=10,a这个变量在程序运行过程中,始终都是int类型,若尝试a=“hello”,就会编译报错
动态类型:程序运行的过程中,变量的类型可能会发生改变
在 Python 中, 一个变量是什么类型, 是可以在 “程序运行” 过程中发生变化的
在程序执行过程中, a 的类型刚开始是 int, 后面变成了str
a = 10
print(type(a))
a = 'hello'
print(type(a))
输出:
<class 'int'>
<class 'str'>
注意:一个编程语言程序是否是静态类型,取决于运行时,类型是否发生改变,不取决于变量定义的时候是否声明类型
Python作为一个动态类型的语言,在变量定义的时候是可以写类型的
c1:int=2
print(type(c1))
动态类型特性是一把双刃剑
- 对于中小型程序, 可以大大的解约代码量(比如写一段代码就可以同时支持多种类型)
- 对于大型程序, 则提高了模块之间的交互成本 (程序猿 A 提供的代码难以被 B 理解)
3. 注释
3.1 注释是什么
注释是一种特殊的代码, 它不会影响到程序的执行, 但是能够起到解释说明的作用, 能够帮助程序猿理解程序代码的执行逻辑
3.2 注释的语法
Python 中有两种风格的注释
(1) 注释行
使用 #
开头的行都是注释
# 这是一行注释
(2) 文档字符串
使用三引号引起来的称为 “文档字符串”, 也可以视为是一种注释
-
可以包含多行内容
-
一般放在 文件/函数/类 的开头
-
"""
或者'''
均可 (等价)
"""
这是文档字符串
这是文档字符串
"""
3.3 注释使用规范
- 内容准确: 注释内容要和代码一致, 匹配, 并在代码修改时及时更新
- 篇幅合理: 注释既不应该太精简, 也不应该长篇大论
- 使用中文: 一般中国公司都要求使用中文写注释, 外企另当别论
- 积极向上: 注释中不要包含负能量
4. 输入输出
4.1 和用户交互
程序需要和用户进行交互
- 用户把信息传递给程序的过程, 称为 “输入”
- 程序把结果展示给用户的过程, 称为 “输出”
输入输出的最基本的方法就是控制台。用户通过控制台输入一些字符串, 程序再通过控制台打印出一些字符串
PyCharm 运行程序,下方弹出的窗口就可以视为控制台
输入输出的最常见方法是图形化界面。如我们平时用到的 QQ,浏览器, steam 等, 都不需要用户输入命令,而只是通过鼠标点击窗口点击按钮的方式来操作。我们现在初学 Python就基于控制台的方式与程序交互。
4.2 通过控制台输出
Python 使用 print 函数输出到控制台
print('hello')
不仅能输出一个字符串,还可以输出一个其他类型的变量
a = 10
print(a)
b = True
print(b)
输出:
10
True
字符串和变量混合输出
示例:输出num=10
num=10
print(f"num={num}")
注意:
- 使用 f 作为前缀的字符串(此处的f表示"format"),称为 f-string。这个语法称为格式化字符串
- 里面可以使用 { } 来内嵌一个其他的变量/表达式
- 关于格式化字符串,很多语言都进行了探索
- C语言的printf采用了%d, %s等的占位符
- C++的std::cout采用<<
- Java采用字符串拼接,允许字符串和其他类型的值进行拼接
- Python最早支持的格式化字符串是效仿C的printf并做出改进,Python3.6版本才开始支持f-string
- Python 中还支持其他的格式化字符串的方法, 咱们此处只了解这个最简单的即可
4.3 通过控制台输入
python 使用 input 函数, 从控制台读取用户的输入
num = 0
num = input('请输入一个整数: ')
print(f'你输入的整数是 {num}')
输出:
请输入一个整数: 10
你输入的整数是: 10
注意:
- input在执行的时候会等待用户的输入,此处的等待可能是一个很长的等待,完全取决于用户何时输入
- input 的参数相当于一个 “提示信息”, 也可以没有
- input 的返回值就是用户输入的内容, 是字符串类型
验证input返回值是字符串类型
a=0
b=0
a=input("请输入一个整数:")
b=input("请输入一个整数:")
print(f"a+b={a+b}")
输出:这里做的是字符串的拼接工作,而不是两数相加
请输入一个整数:10
请输入一个整数:20
a+b=1020
打印a,b的类型
print(type(a))
print(type(b))
输出:
<class 'int'>
<class 'int'>
如果要想进行算术运算, 需要先转换类型
a=0
b=0
a=input("请输入一个整数:")
b=input("请输入一个整数:")
a=int(a)
b=int(b)
print(f"a+b={a+b}")
输出:
请输入一个整数:10
请输入一个整数:20
a+b=30
关于input返回值的问题:
- 如果只是想单纯的拿到用户的输入然后打印,使用str打印即可
- 如果需要根据用户的输入内容进行算术运算,此时需要把读到的str转为int,即
int(xxx)
- 同理字符串转浮点数,
float(xxx)
,整数转字符串str(xxx)
5. 运算符
5.1 算术运算符
像 + - * / % ** //
这种进行算术运算的运算符, 称为算术运算符
/
中不能用 0 作为除数,否则会抛出异常
print(10/0)
输出:
Traceback (most recent call last):
File "D:\编程学习\python_code\basic_grammer\code2.py", line 3, in <module>
print(10/0)
ZeroDivisionError: division by zero
异常是编程语言中的一种常见机制, 表示程序运行过程中, 出现了一些 “意外情况”, 导致程序不能继续往下执行了
- 整数 / 整数 结果可能是小数,而不会发生截断
print(1 / 2)
输出:
0.5
除Python外大部分编程语言,整数 / 整数结果还是整数,会发生截断
%
是求余数。
print(7 % 2)
输出:
1
**
是求乘方。不光能算整数次方, 还能算小数次方(开方运算)
print(4 ** 3) # 4^3
print(4 ** 0.5) # 4^1/2
输出:
64
2.0
- // 是取整除法(也叫地板除)。整数除以整数, 结果还是整数(舍弃小数部分, 并向下取整。不是四舍五入)
print(7//2)
print(-7//2)
输出:
3
-4
5.2 关系运算符
像 < <= > >= == !=
这一系列的运算符称为 关系运算符, 它们是在比较操作数之间的关系。
其中
<= 是 “小于等于”
= 是 “大于等于”
== 是 “等于”
!= 是 “不等于”
(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)
输出:
True
True
True
False
False
False
True
(2) 关系运算符不光针对整数/浮点数进行比较, 还能针对字符串进行比较
a = 'hello'
b = 'world'
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
print(a == b)
print(a != b)
输出:
True
True
False
False
False
True
False
注意:
- C语言中字符串比较采用strcmp,若采用== 本质上是比较两个字符串首元素的地址;Java中字符串比较采用equals方法,若采用==本质上是比较两个字符串是否是同一对象
- 像Python直接使用==和!=来比较字符串内容相同,是大部分编程语言遵守的规则;Python的字符串比较规则是"字典序"
关于字典序:
想象一个英文词典, 上面的单词都是按照字母顺序排列。 如果首个字母相同, 就比较第二个字母(就比如著名单词 abandon)。
我们认为一个单词在词典上越靠前, 就越小。越靠后, 就越大。
(3) 对于浮点数来说, 不要使用 == 判定相等
print(0.1+0.2==0.3)
输出:
False
注意:浮点数在内存中的存储和表示是可能存在误差的,这样的误差在算术运算的时候可能会被放大,从而导致==判定出现误判
运算过程
print(0.1)
print(0.2)
print(0.3)
print(0.1 + 0.2)
输出:
0.1
0.2
0.30000000000000004
0.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)
5.3 逻辑运算符
像 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)
输出:
True
False
False
True
False
True
一种特殊写法
a < b and b < c 这个操作等价于 a < b < c 。这个设定和大部分编程语言都不相同
print(a<b<c)
输出:
True
短路求值
和其他编程语言类似, Python 也存在短路求值的规则。
- 对于 and, 如果左侧表达式为 False, 则整体一定为 False, 右侧表达式不再执行
- 对于 or, 如果左侧表达式为 True, 则整体一定为 True, 右侧表达式不再执行
print(10 > 20 and 10 / 0 == 1)
print(10 < 20 or 10 / 0 == 1)
输出:
False
True
上述代码没有抛出异常, 说明右侧的除以 0 操作没有真正执行
5.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 。其他复合赋值运算符也是同理
a = 10
a = a + 1
print(a)
b = 10
b += 1
print(b)
输出:
11
11
注意:像 C++ / Java 中, 存在 ++ – 这样的自增/自减运算符。Python 中则不支持这种运算。如果需要使用,则直接使用 += 1 或者 -= 1
- 后置++和后置–都会在语法上报错
- 前置++和前置–不出现报错,可能是Python解释器把+ -当成了正负号
验证
a=10
a+=1
++a # 这里会被解释为正号
print(a)
--a # -会被解释为负号, --为正
print(a)
输出:
11
11
6. 总结
本章节中学习了 Python 中的最基础的语法部分
- 常量
- 变量
- 类型
- 整数
- 浮点数
- 字符串
- 布尔值
- 注释
- 输入输出
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符