一.静态语言和脚本语言
高级语言根据计算机执行机制的不同分为两类:静态语言和脚本语言
静态语言的核心特征:
- 变量的类型在编译时(写代码时)就必须确定并固定下来,即在使用一个变量前必须显式地声明它地类型
- 一旦声明,这个变量的类型就不能再改变
- 执行方式为编译
- 性能通常较高
- 可靠性和可维护性方面更优:编译器像一个严格的代码审查员,能在编译的过程中就捕捉大量的类型错误、接口不匹配等问题,将很多Bug扼杀在摇篮里
脚本语言:
- 变量无需声明类型
- 通常不需要显式的编译步骤,一般都是采用解释作为执行方式
- 性能通常较低,因为边解释边执行,运行时需要额外的时间来运行语法、推断类型,动态分配内存等。不过通过即时编译技术(如V8引擎for JavaScript,PyPy for Python),这个性能差距在逐渐缩小
- 更灵活:无需关注类型细节,代码更短,开发速度更快
- 运行时错误风险:一个拼写错误或类型错误可能直到运行到那一行代码时才会暴露,对于大型复杂项目,维护和重构的难度更高
两种将高级语言代码转换成计算机能读懂的指令的过程:
编译:是一次性转换的过程 (好比把一本中文书翻译成英文,才能让完全不懂中文的人看懂) 技术过程如下:
- 输入:全部的源代码文件
- 处理:编译器会读通所有代码,进行词法分析,语法分析,优化等一系列操作、
- 输出:生成一个独立的,全新的可执行文件(如Windows中的.exe文件)。这个文件里是纯粹的机器指令
- 执行:此后,源代码就和执行无关了。可以直接运行这个可执行文件,即使源代码被删除,程序照样可以运行
2.解释:是一个边转换边执行的过程(好比同声传译)
技术过程如下:
- 输入:源代码文件
- 处理:解释器读取原代码的第一行,立即转换成机器指令并让CPU执行;然后读取第二行,转换成机器指令并让CPU执行;如此重复直到结束
- 输出:没有独立的可执行文件生成(输出的是程序的运行结果,如屏幕显示,文件修改等)
- 执行:程序的每次执行都离不开源代码和解释器,必须同时拥有两者
编译器和解释器是执行上述编译和解释过程的软件
编译器如GCC(c\cpp编译器),javac(java编译器)
特点:
- 速度快:程序运行时已经是机器码,直接由CPU执行,效率高
- 需额外步骤:修改代码后,必须重新编译才能看到变化
- 跨平台性差:编译产生的可执行文件通常只适用于特定的操作系统和CPU架构(例如为Windows编译的程序无法在Mac上运行)
解释器如python解释器,JavaScript引擎(如V8),Ruby解释器
特点:
- 灵活性高:修改代码后,直接就可以再次运行,无需等待编译
- 跨平台性好:只要有对应平台的解释器,同一份代码就可以在任何平台上运行,实现了“一次编写,到处运行”
- 速度相对慢:因为边翻译边执行,每次运行都包含翻译的开销
注:现在纯粹的编译和解释比较少了,很多语言采用混合模式,最典型的是Java和JavaScript
二.程序设计的统一模式(IPO)
Input:输入
Process:处理
Output:输出
三.基本语法格式
python采用严格的缩进(一般为4个空格)来表明程序的格式框架(代码的层次和包含关系),但并不是所有的python代码都需要缩进
四.Python中的转义字符
转义字符是一个以反斜杠\开头的特殊字符序列,用于表示那些在字符串中难以直接表示或具有特殊含义的字符。
例如换行,引号,制表符等
下面是一些常见的转义字符的形式和作用:
- \\: 表示反斜杠\
- \': 表示单引号 如 ' it\'s good '
- \n :换行符
- \t : 水平制表符 一个\t表示4个空格
- \r : 回车符
- \b : 退格符
五.变量命名规定
分为硬性规则(必须遵守)和软性规则(建议遵守)
1.硬性规则
只能包含以下字符:
- 大小写英文字母
- 数字0~9
- 下划线
不能以数字开头
不能是python的保留字(也称关键字)
区分大小写
2.命名约定(软性规则)
变量名应该清晰地表明意图
python3可以适用汉字以及大多数Unicode字符作为变量名,但是不推荐这么做,¥,$ 都不能做变量名,所以尽量不要用英文和数字及下划线以外的作为变量名
六.重要的代码知识
1.print()函数中的end参数
控制print()函数在输出完后要以什么字符结尾,end参数的默认值为'\n',即默认输出完会换行,end参数取值为空字符串或者空格的时候可以让多次输出打印在同一行,即取消换行
2.复数
形如a+bj的形式,其中a,b都是浮点数。
注意在数学中一般用i表示复数,但是在工程和python中都用j表示
在python中直接在数字后面加j或J就能表示复数,或者使用complex()函数
complex(4,5) # (4+5j)
3+4j # 3+4j
每个复数都有.real和.imag两个属性,用来获取复数的实部和虚部
(3+4j).real # 3.0
(3+4j).imag # 4.0
同时python支持复数的所有运算,+-*/ **
3.divmod()函数
divmod(a,b)返回一个包含两个元素的元组,第一个元素为a//b,即在a除以b的基础上向下取整,第二个元素为a%b ,即a与b的模运算(求余数)
divmod(11,3) # (3,2)
4.%模运算
模运算是一种求余运算,基本概念是:对于两个整数a和b(b为不为零),存在唯一的整数q(商)和r(余数),使得:
a = b * q + r, 并且0 <= r < |b|
其中,r就是a对b取模的结果,在python中表示为a % b
需要注意的是,python的模运算结果的符号始终与除数(第二个操作数)的符号相同
7 % 3 # 1
7 % -3 # -2
-7 % 3 # 2
分析:
对于 7 % -3 我们要找到一个r,范围为0<= r < |-3| = 3, 使得7 = (-3) * 某个整数 + r
这要求 -3 * 这个整数 的 值 不能和 7 相差 太大,差在[0,3)之间,
所以考虑这个整数为-3或者-2 但r要和-3符号相同,因此这个整数只能是-3,r的值容易得出为-2
或者还可以这样分析,r要为负数,说明-3和商要比7大,所以商只能是-3
同理对于-7 % 3,商为-3 余数为2 所以r=2
4.pow()函数
也是python的内置函数,用于计算幂运算(指数运算)
语法:pow(base,exp[,mod])
base:底数,必须要有的参数
exp:指数,必须要有的参数
mod:模数,可选,如果提供,将返回 base ** exp % mod
pow(2,3) # 8
pow(2,3,5) # 3
pow(-2,3,5) # 2
5.字符串格式化format方法
基本语法:"字符串{占位符}".format(值)
print("小明今年{}岁".format(18)) # 小明今年18岁
print("{1}喜欢{0}".format('苹果','小红')) # 小红喜欢苹果# 使用关键字参数
print("{name} 今年 {age} 岁,喜欢 {hobby}".format(name="小红", age=20, hobby="读书"
))
# 输出:小红 今年 20 岁,喜欢 读书# 可以重复使用
print("{fruit} 很甜,我喜欢吃 {fruit}".format(fruit="西瓜"))
# 输出:西瓜 很甜,我喜欢吃 西瓜print("{0} 买了 {1} 个 {fruit}".format("小李", 3, fruit="苹果"))
# 输出:小李 买了 3 个 苹果# 右对齐,宽度10,用空格填充
print("|{:>10}|".format("hello")) # 输出:| hello|# 左对齐,宽度10
print("|{:<10}|".format("hello")) # 输出:|hello |# 居中对齐,宽度10
print("|{:^10}|".format("hello")) # 输出:| hello |# 指定填充字符
print("|{:*^10}|".format("hello")) # 输出:|**hello***|
print("|{:=^10}|".format("hello")) # 输出:|==hello===|# 十进制
print("{:d}".format(42)) # 输出:42# 二进制
print("{:b}".format(42)) # 输出:101010# 八进制
print("{:o}".format(42)) # 输出:52# 十六进制(小写)
print("{:x}".format(255)) # 输出:ff# 十六进制(大写)
print("{:X}".format(255)) # 输出:FF# 带前缀的十六进制
print("{:#x}".format(255)) # 输出:0xff
print("{:#X}".format(255)) # 输出:0XFF# 显示正负号
print("{:+d}".format(42)) # 输出:+42
print("{:+d}".format(-42)) # 输出:-42# 只显示负号(默认)
print("{:d}".format(42)) # 输出:42
print("{:d}".format(-42)) # 输出:-42# 正数前加空格
print("{: d}".format(42)) # 输出: 42
print("{: d}".format(-42)) # 输出:-42# 千位分隔符
print("{:,}".format(123456789)) # 输出:123,456,789
print("{:_}".format(123456789)) # 输出:123_456_789# 复杂的数字格式化
num = 1234.5678
print("|{:>15,.2f}|".format(num)) # 输出:| 1,234.57|
print("|{:0>15,.2f}|".format(num)) # 输出:|00000001,234.57|