python概念及语法
概念
编译器与解释器
编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快;它把源代码转换成目标机器的CPU指令
而解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的。解释后转换成字节码,运行在虚拟机上,解释器执行中间代码。
这是因为计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)。
编译型语言与解释型语言
编译型
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。解释型
优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
低级语言与高级语言
低级语言
面向机器的语言,包括机器语言、汇编语言
不同的机器不能通用,不同的机器需要不同的机器指令或者汇编程序
高级语言
接近自然语言和数学语言的计算机语言
高级语言首先要书写源程序,通过编译程序把源程序转换成机器指令的程序
人们只需要关心怎么书写源程序,针对不同机器的编译的事交给编译器处理
语言越高级,越接近人类的自然语言和数学语言。语言越低级,越能让机器理解。高级语言和低级语言之间需要一个转换的工具,就是编译器或解释器。
动态语言和静态语言
动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。
静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。
强类型定义语言和弱类型定义语言
- 强类型语言:不同类型之间操作,必须先强制类型转换为同一类型。print(‘a’+1)
- 弱类型语言:不同类型间可以操作,自动隐式转换,JavaScript中console.log(1+’a’)
基础语法
注释:# 标注的文本
数字:
- 整数,不区分long和int。可使用二进制、十进制、十六进制。bool(布尔)有两个值True和False
- 浮点数:1.2、3.1415、-0.12、1.46e9等价于1.46*10的9次方
- 复数:1+2j
字符串:
- 使用’ “ 单双引号引用的字符的序列
- ‘’’和””” 单双三引号,可以跨行、可以在其中自由的使用单双引号
- 在字符串前面加上r或R前缀,表示该字符串不做特殊的处理
转义序列
- \\ \t \r \n \‘ \“
- 前缀r,把里面的所有字符当普通字符对待
缩进
- 未使用C等语言的花括号,而是采用缩进的方式表示层次关系
- 约定使用4个空格缩进
续行
- 在行尾使用\
- 如果使用各种括号,认为括号内是一个整体,内部跨行不用\
标识符
- 一个名字,用来指代一个值
- 只能字母、下划线和数字
- 只能以字母或下划线开头
- 不能是python的关键字,如def、class就不能作为标识符
- python是大小写敏感的
- 约定:
- 不允许使用中文
- 不允许使用歧义单词,如class_
- 在python中不要随便使用下划线开头的表示符
常量
- 一旦赋值就不能改变值的标识符
- python中无法定义常量
字面常量
- 一个单独的量,如12、”abc”、’234531.03e-9’
变量
- 赋值后,可以改变值的标识符
运算符
算数运算符
运算符 | 描述 | 实例 |
---|---|---|
+ | 两个对象相加 | a + b输出结果30;a=10, b=20 |
- | 得到负数或是一个数减去另一个数 | a - b输出结果-10 |
* | 两个数相乘或是返回一个被重复若干次的字符串 | a * b输出结果200 |
/ | x除以y | b / a输出结果2 |
% | 返回除法的余数 | b % a输出结果0 |
** | 返回x的y次幂 | a ** b为10的20次方,输出结果1000000000000000000 |
// | 返回商的整数部分 | 9 // 2输出结果4,9.0//2.0输出结果4.0 |
比较运算符
运算符 | 描述 | 实例 |
---|---|---|
== | 比较两个对象是否相等 | (a == b)返回False |
!= | 比较两个对象是否不等 | (a != b)返回true |
<> | 比较两个对象是否不等 | (a <> b)返回true。这个运算符类似!= |
> | 返回x是否大于y,返回一个bool值 | (a > b)返回False;4>3>2或4>mynumber>=1是链式比较操作符 |
< | 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 | (a < b)返回true |
>= | 返回x是否大于等于y | (a >= b)返回False |
<= | 返回x是否小于等于y | (a <= b)返回true |
赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | c = a+b将a + b的运算结果赋值为c |
+= | 加法赋值运算符 | c += a等效于c = c + a |
-= | 减法赋值运算符 | c -= a等效于c = c - a |
*= | 乘法赋值运算符 | c *= a等效于c = c * a |
/= | 除法赋值运算符 | c /= a等效于c = c / a |
%= | 取模赋值运算符 | c %= a等效于c = c % a |
**= | 幂赋值运算符 | c **= a等效于c = c ** a |
//= | 取整除赋值运算符 | c //= a等效于c = c // a |
逻辑运算符
短路运算符,可以把and当作乘法,把or当作加法,非是取反。and:如果第一个表达式为False,后面就没有必要计算了,这个逻辑表达式一定是False;or:如果第一个表达式为True,后面没有必要计算了,这个逻辑表达式一定是True
运算符 | 描述 | 实例 |
---|---|---|
and | 布尔“与”,如果x为False,x and y返回False,否则它返回y的计算值 | (a and b)返回true |
or | 布尔“或”,如果x是True,它返回True,否则它返回y的计算值 | (a or b)返回true |
not | 布尔“非”,如果x为True,返回False。如果x为False,它返回True | not(a and b)返回false |
成员运算符
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回True,否则返回False | x在y序列中,如果x在y序列中返回True |
not in | 如果在指定的序列中没有找到值返回True,否则返回False | x不在y序列中,如果x不在y序列中返回True |
身份运算符
运算符 | 描述 | 实例 |
---|---|---|
is | is是判断两个标识符是不是引用自一个对象 | x is y,如果id(x)等于id(y),is返回结果1 |
is not | is not是判断两个标识符是不是引用自不同对象 | x is not y,如果id(x)不等于id(y),is not返回结果1 |
位运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与运算符 | (a & b)输出结果12,二进制解释:0000 1100。只有1和1相与得1,其他相与都是0 |
I | 按位或运算符 | (a I b)输出结果61,二进制解释:0011 1101 |
^ | 按位异或运算符 | (a ^ b)输出结果49,二进制解释:0011 0001 |
~ | 按位取反运算符 | (~a)输出结果-61,二进制解释:1100 0011,在一个有符号二进制数的补码形式 |
<< | 左移动运算符 | a << 2输出结果240,二进制解释:1111 0000 |
>> | 右移动运算符 | a >> 2输出结果15,二进制解释:0000 1111 |
运算符优先级
算数运算符 > 位运算符 > 身份运算符 > 成员运算符 > 逻辑运算符
记不住,就用小括号
长表达式,多用括号,易懂、易读
原码、反码、补码、负数表示法
原码
5 => 0b101,1 => 0b1,-1 => -0b1,bin(-1)
反码
正数的反码与原码相同;负数的反码符号位不变其余按位取反
补码
正数的补码与原码相同;负数的补码符号位不变其余按位取反后+1;补码的补码就是原码
负数表示法
数字电路的CPU中的运算器实现了加法器,但是没有减法器,减法是转换成加法
负数在计算机中使用补码存储,-1的补码为1111 1111
5 - 1 => 5+(-1)直觉上是0b101-0b1,其实计算机中是0b101+0b11111111,溢出位舍弃
1 | 例:5-1保存为二进制 |
内存管理
变量无须事先声明,也不需要指定类型
编程中一般无须关心变量的存亡,也不用关心内存的管理
python使用引用 计数记录所有对象的引用数。当对象引用数变为0,它就可以被垃圾回收(GC)了。
计数增加:赋值给其它变量就增加引用计数,例如:x=3;y=x
计数减少:函数运行结束时,局部变量就会被自动销毁,对象引用计数减少。变量被赋值给其它对象。例如:x=3;y=x;x=4
程序控制
顺序
按照先后顺序一条条执行
分支
根据不同的情况判断,条件满足执行某条件下的语句
循环
条件满足就反复执行,不满足就不执行或不再执行
单分支结构
1 | if语句 |
三目运算
1 | 语法:真值if条件else假值 |
多分支结构
1 | if...elif...else语句 |
分支嵌套
1 | 例: |
while循环
1 | while condition: |
for循环
1 | for element in iteratable: |
循环continue语句
1 | 中断当前循环的当次执行,继续下一次循环 |
循环break语句
1 | 终止当前循环,跳出循环 |
continue和break语句总结
- continue和break是循环的控制语句,只影响当前循环,包括while、for循环
- 如果循环嵌套,continue和break也只影响语句所在的那一层循环
- continue和break不是跳出语句块,所以if cond: break不是跳出if,而是终止if外的break所在的循环
循环else子句
1 | # 如果循环正常的执行结束,就执行else子句;如果使用break终止,else子句不会执行 |
练习
1 | 1. 输入2个数字,输出最大数 |