2. 变量 ,表达和语句
编程语言最强大的特性之一是: '操纵变量'的能力.
变量: 是指向一个值的名称.
2.1 赋值语句
赋值语句可以建立新的变量, 并给它们赋值.
>>> message = '你好!'
>>> n = 'Python'
>>> pi = 3.1415
状态图: 在纸上表达变量的一个常见方式, 显示每个变量所在的状态.
使用方法: 写下名称, 并用箭头指向其值.
2.2 变量名称
程序员常常选择有意义的名称作为变量名--以此标记变量的用途.
变量名可以任意长短, 它可以包含字母和数字, 但必须以一个字母开头.
使用大写字母是合法的, 但变量名使用小写字母开头是个好主意(后面你会看到为何如此).
下划线'_'可以出现在变量名称中, 它经常出现在由多个词组成的变量名中,
如: your_name, air_speed_of_unladen_swallow.
1num = 12
Python内置31个关键字, 这些关键字不能被作为变量的名称.
* 在大多数开发环境中, 关键字会以不同颜色显示, 如果使用它们当作变量来用, 很容易发现.
False class finally is return
None contiune for lambda try
True def from nonlocal while
and del global not with
as elif if or yield
assert else import pass
break exxept in raise
2.3 表达式和语句
表达式: 是值, 变量和操作符的组合.
单独一个值也被看作一个表达式, 单独的变量也是如此.
>>> n = 17
>>> n
17
>>> 42
42
>>> n + 25
42
当你在提示符之后键入一个表达式时, 解释器会对其进行求值, 即尝试找到该表达式的最终值.
在上例中, 变量n的值是17, 而表达式n + 25的值是42.
语句: 是一段会产生效果的代码单元, 如创建新变量或者显示一个值.
>>> n = 17
>>> print(n)
17
第一行: 是一个赋值语句, 将值17赋给变量n.
第二行: 是一个print语句, 显示变量n的值.
当键入一行语句之后(需要回车), 解释器会执行它, 也就是说会按照语句所说的来做.
通常来说, 语句本身没有值(这样理解: 语句是操作值的'动作').
2.4 脚本模式
Python提供了两种运行模式:
* 1. 交互模式(interactive mode)
交互模式下运行Python, 直接与解释器打交道, 键入一行立刻执行, 适用于初学者.
* 2. 脚本模式(script mode)
把代码保存到称为脚本的文件中(python脚本文件通常以.py结尾), 最后运行解释器执行脚本文件.
在交互模式下执行键入语句, 解释器会立刻执行, 而将同样的语句写在脚本中运行则得不到任何输出.
>>> 1 * 3
3
在脚本模式中一个单独的表达式没有什么'可见的效果', Python实际上会对表达式进行求值, 但不会显示其结果.
1 * 3
将同样的语句存入一个脚本文件并运行没有输出效果,
将所有的表达式都转为print语句, 再执行一次则看到输出效果.
* 如果想要显示结果, 可以使用print关键字.
print(1 * 3)
脚本通常包含一系列的语句, 如果超过一行, 那么会随着语句执行的顺序一行行显示结果.
print(1)
x = 2
print(x)
# 产生如下结果:
1
2
2.5 操作顺序
当一个表达式中出现多个操作符是, 求值顺序依赖与优先级规则.
对数据操作符, Python遵循数学的传统规则.
缩写词PEMDAS可以帮助记忆这些规则:
* 1. 括号(P, Parentheses) 拥有最高的优先级, 并可以用来强制表达式按照你需要的顺序进行求值.
可以使用括号让表达式更加易读.
* 2. 乘方(E, Exponentiation)操作拥有次高的优先级.
* 3. 乘法(M, Multiplication)和除法(D, Division)优先级相同.
* 4. 加法(A, Addition)和减法(S, Substraction)优先级相同.
* 优先级相同的操作按照自左向右的顺序求值, 其它的操作符优先级不确定的话使用括号指明优先级即可.
2.6 字符串操作
字符串不能进行数据操作, 即使看起来像数字也不行, 但是'+'号和'*'例外.
非法操作示例: '2' - '1', 'agges' / 'easy'...
Python是强类型语言, 不同的数据类型之间是不允许操作的, 但是它对某些符号的功能重新定义了.
操作符'+': 对字符串进行拼接操作, 两个操作对象都是字符串--> str + str.
操作符'*': 对字符串进行重复操作, 其中一个操作对象是整数--> str * int.
print('abc' + 'def')
print('abc' * 2)
2.7 注释
当程序变得更大更复杂时, 读起来也会更加困难.
形式语言很紧凑, 经常会遇到一段代码, 却很难弄清它在做什么, 为什么那么做.
因此, 在程序中加入自然语言的笔记来解释程序在做什么, 这种笔记被称为注释, 它们以#号开头.
注释可以单独占据一行, 也可以把注释放在代码行的结尾.
print('Hello World!')
从#号开始到行尾的注释内容都会被解释器忽略掉, 它们对程序本身运行没有任何影响.
注释最重要的用途在于解释代码并不显而易见的特性, 而不是滥用, 需要避免毫无用处注释出现.
v = 5
v = 5
2.8 调试
一个程序中可能出现3种错误: 语法错误, 运行时错误, 语义错误, 对它们加以区分可以更快地找到错误.
* 语法错误: 指的是程序的结构及其结构的规则.
例: (1 + 2)是合法的, 而8)是一个语法错误.
程序中只要出现一处语法错误, Python就会显示出错误信息并退出, 你的程序就会无法运行了.
在编程生涯的最初几周中, 可能会需要花费大量时间来查找语法错误.
但随着经验的增加, 犯错会越来越少, 查找起来也就会越来越快.
* 运行时错误: 这种错误只有程序运行后才会出现, 这些错误也常被称为异常(exception).
它们常常表示某些异常的(不好的)事情发生了.
运行时错误在开头几章中的简单示例里很少会出现, 所以可能要过一段时间你才会遇到.
* 语义错误: 错误与含义相关(自己写的代码与设想的效果不一致, 写错代码了).
如果你的程序中有一个语义错误, 程序仍会成功运行, 而不会产生任何错误消息, 但是它不会执行正确的逻辑.
它会做其它的事情, 特别需要注意的是, 它所做的正是你的代码所告诉它的.
查找语义错误会比较麻烦, 因为需要反向查找, 查看程序输出并尝试弄明白它到底做了什么.
2.9 术语表
变量(variable): 引用一个值的名称.
赋值语句(assignment statement): 将一个值赋值给变量的语句.
状态图(state diagram): 用来展示一些变量以及其值的图示.
关键字(keyword): 编辑器或解释器保留的词, 用于解析程序, (变量的名称不能使用关键字).
操作数(operand): 操作符所操作的值.
表达式(expression): 变量, 操作符和值的结合, 可以表示一个单独的结果值.
求值(evaluate): 对表达式按照操作的顺序进行计算求得其结果值.
语句(statement): 表示一个命令或动作的一段代码, (目前见过'赋值语句'与'打印语句').
执行(execute): 运行一条语句, 看它说的是什么.
交互模式(interactive mode): 使用Python解释器的一种方式, 在提示符之后键入代码.
脚本模式(script mode): 保存在文件中的程序.
操作顺序(order of operations): 当表达式中有多个操作符和操作对象要求值时, 用于指导求值顺序的规则.
拼接(concatenate): 将两个操作数首尾相连.
注释(comment): 代码中附加的注解信息, 用于帮助其他程序员阅读代码, 并不影响程序的运行.
语法错误(syntax error): 程序中的一种错误, 导致它无法进行语法解析(因此无法被解释器执行).
异常(exception): 程序运行中发现的错误.
语义(semantics): 程序表达的含义.
语义错误(semantion reeor): 程序中的一种错误, 导致程序所做的事情不是程序员设想的.
2.10 练习
* 每当你学习新语言特性时, 都应当在交互模式中进行尝试, 并故意犯下错误, 看会有哪些问题.
1. 练习1
1. 我们已经见过n = 42是合法的, 那么42 = n呢?
>>> 42 = n
File "", line 1
42 = n
^
SyntaxError: cannot assign to literal.
语法错误:无法分配给文本.
2. 那么x = y = 1呢?
>>> x = y = 1
>>> x
1
>>> y
1
3. 有些语言中, 每个语句都需要以分号(;)结尾. 如果你在Python的结尾放一个分号, 会有什么情况?
>>> x = 1;
>>> x;
1
4. 如果在语句结尾放的是句号呢?
>>> print(1).
File "", line 1
print(1).
^
SyntaxError: invalid syntax.
语法错误:无效语法.
>>> x = 1。
File "", line 1
x = 1。
^
SyntaxError: invalid character '。' (U+3002).
语法错误:无效字符'.'(U+3002).
5.在数学标记中, 对于x乘以y, 可以这么表达: xy. 在Python中这样尝试会有什么结果?
>>> x = 1
>>> y = 2
>>> xy
Traceback (most recent call last):
File "", line 1, in <module>
NameError: name 'xy' is not defined.
名称错误: 未定义名称'xy'.
2. 练习2
* 把Python解释器当作计算器来进行练习.
1. 半径为r的球体的体积是(4/3)πr^3(3是立方), 半径为5的球体体积是多少?
>>> PI = 3.1415926
>>> r = 5
>>> (4 / 3) * PI * (r ** 3)
523.5987666666666
2. 假设一本书的定价是24.95美元, 当时书店打了40%的折扣(6折). 运费是一本3美元, 每家一本家75美分.
60本书的总价是多少?
>>> 24.94 * 0.6 * 60
897.84
>>> 1 * 3 + 59 * 0.75
47.25
>>> 897.84 + 47.25
945.09
3. 如果我6:52时离开家, 并以慢速(6分10秒/千米)跑1.6千米, 接下来以4分30秒/千米的速度跑4.8千米,
再以慢速跑1.6千米, 请问我回家吃早餐是什么时候? (这题目很无语!)
>>> 6 * 60 + 10
370
>>> 1000 / 370
2.7027027027027026
>>> 1600 / 2.7027027027027026
592.0
>>> 592.0 / 60
9.866666666666667
>>> 4 * 60 + 30
270
>>> 1000 / 270
3.7037037037037037
>>> 4800 / 3.7
1297.2972972972973
>>> 1297.2972972972973 / 60
21.62162162162162
>>> 2 * 9.9 + 21.7
41.5
>>> 41.5 / 60
0.6916666666666667
>>> 52 / 60
0.8666666666666667
>>> 6 + 0.86 + 0.7
7.5600000000000005
>>> 0.56 * 60
33.6
如果你跑步包含来回的路程, 则回到家马上吃饭的话, 那么就是6点52分 + 41分5秒 = 7点33分.
如果以同样的时间回家, 回到家马上吃饭的话, 那么就是6点52分 + 41分5秒 + 41分5秒 = 9点15分.
否则我也不懂你几点回家吃饭...(看chatgpt的解答是第一种, 我没让他写代码...)