1. 程序之道
1.1 什么是程序
程序 : 是一组定义如何进行计算的指令集合 .
编程语言中基本指令 :
* 1. 输入 : 从键盘 , 文件或者其它设备中获取数据 .
* 2. 输出 : 将数据显示到屏幕中 , 保存到文件中 , 或者发送到网络上 .
* 3. 数学 : 进行基本数学操作 , 如 : 加减乘除 .
* 4. 条件执行 : 检查某种条件的状态执行相应的代码 .
* 5. 重复 : 重复执行某个动作 , 往往在重复中有一些变化 .
1.2 运行程序
Python解释器 : 是一个读取并执行Python代码的程序 .
安装Python解释器-- > 省略 .
1.3 第一个程序
使用Python的print ( ) 函数在终端打印Hello World ! .
>> > print ( 'Hello World!' )
Hello World!
1.4 算术操作符
Python支持的算术操作符-- > 省略 .
注意 : Python中的所有符号必须是英文的 , 不能出现中文的符号 .
1.5 值和类型
值 ( Value ) : 是程序操作的最基本东西 , 例如 : 数字 , 字符 . . . 都是值 .
类型 ( type ) : 每个值都有类型 , 例如 : 1 是整型 , 1.1 是浮点型 , 'a' 是字符串类型 . . .
Python提供type ( ) 函数查看值的类型 .
>> > type ( 1 )
< class 'int' >
>> > type ( 1.1 )
< class 'float' >
>> > type ( 'a' )
< class 'str' >
1.6 形式语言和自然语言
自然语言 : 人们所说的语言 , 由自然演化而来的 .
形式语言 : 人们为了特殊用途设计的语言 .
例如 :
* 1. 数学上使用的符号体系 , 它是一种擅于表示数字和符号之间关系的形式语言 .
* 2. 化学家则使用另一个形式语言来表示分子的化学结构 .
编程语言 : 是人们为了表达计算过程而设计出来的形式语言 .
形式语言倾向于对语法做出严格的限制 , 例如 : 3 + 3 = 6 是数学表达式的正确语法 .
语法规则有两种 , 分别适用于记号 ( token ) 和结构 ( structure ) .
记号 : 是语言的基本元素 ( 如 : 词 , 数字 , 符号等 ) , 使用的记号在语言中必须合法的 .
结构 : 是记号按照一定规则的组合方式 , 记号合法也要保证语句的结构合法 .
语法分析 : 阅读语句时分析语句的过程 .
形式语言和自然语言有很多的共同特点 , 如 : 记号 , 结构 , 语法 , 语义 , 但它们也有一些区别 .
* 1. 歧义性
自然语言充满了歧义 , 人们通过上下文线索和其它信息来处理这些歧义 .
形式语言通常设计为 '几乎没有歧义' 或 '完全没有歧义' ,
不论上下文环境如何 , 任何表达式都只有一个含义 .
* 2. 冗余性
为了弥补歧义性 , 减少误解 , 自然语言采用大量的冗余 . 因此 , 自然语言往往很啰嗦 .
形式语言则相对不那么冗余 , 显得简洁 .
* 3. 字面性
自然语言充满了习惯用语和比喻 , 例如 : 有人说你长得像个帅哥 , 也许你并不是 . . .
形式语言则严格按照它的字面意思表达含义 .
计算机程序的意义不含歧义 , 直接如字面所指 , 完全可以通过它的标记和结构理解其含义 .
形式语言的密度远远大于自然语言 , 所以阅读起来需要花费更多时间 .
形式语言非常注重结构 , 所有至上而下 , 从左往右的阅读顺序不一定是最好的 .
相反 , 要试着学会在头脑中解析程序 , 辨别出记号和解析出结构 .
形式语言非常注意细节 , 在自然语言中常常可以忽略的小错误 ( 如 : 符号错误 , 拼写错误 . . . ) ,
在形式语言中往往会造成很大的差异 .
1.7 调试
程序很容易因为各种古怪的原因出错 , 程序错误被成为 'bug' ( 臭虫 ) , 而查捕bug的过程称为调试 ( debugging ) .
'bug' 起源于计算机先驱格蕾丝·霍珀 .
1946 年 , 当霍珀退役后 , 她加入了哈佛大学计算实验室 , 在那里她继续研究计算机MarkII和Mark III .
在研究过程中 , 她发现了Mark II中的一个错误 , 而这个错误是一只飞蛾被困 ( trap ) 在继电器中所导致的 .
而后 , 这个 'bug' 被霍珀小心翼翼地移下继电器 , 并用胶带粘到了日志簿上 , 成为了计算机的第一个 'bug' .
这种说法随后被程序员们广泛使用 , 沿用至今 .
一个程序中可能出现 3 种类型的错误 : 语法错误 , 运行时错误 , 语义错误 .
对它们加以区分 , 可以更快的找到错误 .
编程 , 特别是在调试 , 有时候会引发强烈的情绪 .
如果你挣扎于一个困难的bug , 可能会感到愤怒 , 沮丧 , 窘迫 . . .
学习调试可能会带来挫折感 , 但它是一个有价值的技能 , 并在编程之外还有很多用途 .
1.8 术语表
问题求解 ( problem solving ) : 总结问题 , 寻找解决方案以及表达解决方案的过程 .
高级语言 ( high-level language ) : 设计来方便人们读写的编程语言 , 如 : Python .
低级语言 ( low-level language ) : 设计来方便计算机执行的编程语言 , 也被称为 '机器语言' 或 '汇编语言' .
可移植性 ( portability ) : 程序的一种属性 : 可以在多种类型的计算机上运行 .
解释器 ( interpreter ) : 一个读取其它程序并执行其内容的程序 .
提示符 ( prompt ) : 解释器显示的文字 , 提示用户已经准备好接收用户的输入 .
程序 ( program ) : 一系列代码指令的集合 .
操作符 ( operator ) : 一种特殊符号 , 用来表达加法 , 乘法 , 或字符串拼接等简单运算 .
值 ( value ) : 程序操作的基本单位 , 如一个数字或字符串 .
类型 ( type ) : 值的类别 .
整型 ( integer ) : 用来表示整数类型 .
浮点型 ( floating-point ) : 用来表示带小数部分的数的类型 .
字符串 ( string ) : 用来表示一串字符串的类型 .
自然语言 ( natural language ) : 自然演化而来的 , 人类所说的语言 .
形式语言 ( formal language ) : 人们设计的 , 为某些特定目的 ( 如 : 计算机程序 ) 设计的任何一种语言 .
所有编程语言都属于形式语言 .
标记 ( token ) : 程序的语法构造的最基本单位 , 类似于自然语言中的词 .
语法 ( syntax ) : 用于控制程序结构的规则 .
语法分析 ( parse ) : 检查程序并分析其语法结构 .
bug : 程序中的错误 .
调试 ( debugging ) : 发现和纠正bug的过程 .
1.9 练习
每当你实验新的语言特性时 , 都应当在交互模式中进行尝试 , 并故意犯错 .
例如 : 使用print ( ) 函数打印 'Hello World!' 程序中 ,
如果少写一个引号 , 会发生什么?
如果两个引号都不写 , 会怎么样?
如果把print拼写错了 . 会如何?
这种实验会帮你记住所学的内容 , 也能帮你学会调试 , 因为这样能看到不同的出错信息代表着什么 .
现在故意犯错总比今后在编码中意外出错好 .
1. 练习1
1. 在print语句中 , 如果漏掉一个括号 , 或者两个都漏掉 , 会发生什么?
>> > print ( 'Hello World!'
脚本模式中运行提示 :
英 : SyntaxError : unexpected EOF while parsing .
中 : 语法错误 : 分析时意外的EOF .
>> > print 'Hello World!'
File "<stdin>" , line 1
print 'Hello World!'
^
SyntaxError: Missing parentheses in call to 'print' . Did you mean print ( 'Hello World!' ) ?
语法错误: 调用'print' 时缺少括号. 你是说印刷品( '你好世界!' ) 吗?
* stdin是标准输入, 一般指键盘输入到缓冲区里的东西, 这里指的是错误发生在输入的第一行.
2. 如果真尝试打印一个字符串 , 那么若漏掉一个或所有引号会发生什么?
>> > print ( 'Hello World!)
File "<stdin>" , line 1
print ( 'Hello World!)
^
SyntaxError: EOL while scanning string literal
语法错误: 扫描字符串文字时EOL.
>> > print ( Hello World!)
File "<stdin>" , line 1
print ( Hello World!)
^
SyntaxError: invalid syntax
语法错误: 无效语法.
3. 可以使用一个负号来表示负数 , 如 : - 2. 如果在数字前面放一个正好 , 会发生什么? 如果是 2 + + 2 呢?
print ( + 2 )
print ( 2 + + 2 )
4. 在数学标记例 , 前置 0 是没有问题的 , 如 : 02. 在Python中也这么做会发生什么?
>> > print ( 02 )
File "<stdin>" , line 1
print ( 02 )
^
SyntaxError: leading zeros in decimal integer literals are not permitted;
use an 0o prefix for octal integers
语法错误: 十进制整数文本中不允许前导零; 对八进制整数使用0o前缀.
* 5. 如果在两个值之间不方任何操作符号 , 会发生什么?
>> > print ( 1 2 )
File "<stdin>" , line 1
print ( 1 2 )
^
SyntaxError: invalid syntax
语法错误: 无效语法.
2. 练习2
* 启动Python解释器 , 把它当作计算器使用 .
1. 在 42 分 42 秒中 , 一共有多少秒?
>> > 42 * 60 + 42
2562
2. 10 千米相当于多少英里? 提示 : 1 英里相当于 1.61 千米 .
>> > 10 / 1.6
6.25
3. 如果你用 42 分 42 秒跑完 10 千米 , 那么你的平均速度 ( 跑一千米需要的分钟和秒数 ) 是多少?
平均速度是多少千米每小时?
>> > 42.42 / 10
4.242
>> > 4.242 / 1000
0.004242
>> > 0.004242 * ( 60 * 60 )
15.2712