1. 程序之道

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 "", 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 "", line 1
    print('Hello World!)
                        ^
SyntaxError: EOL while scanning string literal
语法错误: 扫描字符串文字时EOL.
  
# 漏掉两个引号.
>>> print(Hello World!)
  File "", line 1
    print(Hello World!)
                ^
SyntaxError: invalid syntax
语法错误: 无效语法.

3. 可以使用一个负号来表示负数, : -2. 如果在数字前面放一个正好, 会发生什么? 如果是2++2呢?
# 数字前面加正号, 没有什么影响, 正号也不会显示.
print(+2)  # 2

# 多个连续加号被认为是一个加号, 做加法运算.
print(2++2)  # 4

4. 在数学标记例, 前置0是没有问题的, : 02. 在Python中也这么做会发生什么?
# 在数字前面加上前导0.
>>> print(02)
  File "", 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 "", line 1
    print(1 2)
            ^
SyntaxError: invalid syntax
语法错误: 无效语法.

2. 练习2
* 启动Python解释器, 把它当作计算器使用.
1. 4242秒中, 一共有多少秒?
>>> 42 * 60 + 42
2562  
# (单位: 秒)

2. 10千米相当于多少英里? 提示: 1英里相当于1.61千米.
>>> 10 / 1.6
6.25
# (单位: 英里)

3. 如果你用4242秒跑完10千米, 那么你的平均速度(跑一千米需要的分钟和秒数)是多少?
   平均速度是多少千米每小时?
# 跑一千米需要的分钟和秒数.
>>> 42.42 / 10
4.242
# (单位: 秒)

# 求每秒跑多少千米.
>>> 4.242 / 1000
0.004242
# (单位: 千米/秒)

# 求每小时多少千米.
>>> 0.004242 * (60 * 60)
15.2712
# (单位: 千米/每小时)

你可能感兴趣的:(向科学家一样思考,python)