一、常量和表达式
Python 可以直接当成一个计算器来使用。
例如:
print(1+2-3)print(1+2*3)print(1+2/3)这里的:
1、2、3属于字面值常量。
而:
+-*/属于运算符。
像:
1+2-3这种完整的算式,在编程语言中称为表达式,计算之后得到的结果可以理解为表达式的返回值。Python 中算术运算的优先级和数学中比较接近,先算乘除,再算加减,也可以使用括号改变运算顺序。
有一个和 C++ 特别容易搞混的地方:
print(2/3)Python 得到的是小数,而不是像整数除法那样直接截掉小数部分。
二、变量到底是什么
刚开始写程序的时候,很多计算都很简单,直接一行算完就行。
但是稍微复杂一点之后,就会出现一个问题:
中间结果需要保存起来。
这时候就需要变量。
比如计算平均数:
avg=(67.5+89.0+12.9+32.2)/4这里的avg就保存了平均值。
接下来计算方差的时候,就可以继续使用:
total=(67.5-avg)**2\+(89.0-avg)**2\+(12.9-avg)**2\+(32.2-avg)**2result=total/3print(result)变量可以先简单理解成一个保存数据的空间,程序运行过程中可以不断读取和修改这些数据。
三、Python变量的定义
Python 创建变量特别简单:
a=10这里的a是变量名,=是赋值运算符,表示把右边的数据赋给左边的变量。
变量名有一些必须遵守的规则:
只能由数字、字母、下划线组成 数字不能放在开头 不能使用关键字作为变量名 大小写敏感例如:
num=10Num=20这两个变量并不是一个东西。
因为 Python 区分大小写:
num Num属于两个不同的变量。
四、变量名最好别乱起
虽然:
a=10b=20c=a+b这样写完全可以运行,但是程序一复杂,就很难看懂。
例如:
totalCount=100personInfo='Tom'看到变量名基本就能猜到它是干什么的。
所以写代码时,变量名最好带有一定的描述性。多个单词组成的变量名可以使用驼峰命名法,比如:
totalCount personInfo这样以后自己回头看代码,也不用重新猜变量的含义。
五、Python最大的特点之一:变量没有固定类型
在 C++ 中,我们通常需要先写:
inta=10;Python 不需要这样写:
a=10变量的类型会在赋值的时候确定。
而且同一个变量后面还可以换成其他类型:
a=10print(a)a='hello'print(a)刚开始a是整数,后面又变成了字符串。
这种特性叫做动态类型。相比之下,C++、Java 这样的语言,一个变量定义之后,其类型通常就是固定的,因此属于静态类型语言。
动态类型确实能让代码少写很多东西,但程序变得很大之后,也可能增加模块之间的理解和协作成本。
六、Python中的几种基础类型
目前主要接触下面几种:
int float str bool后面还会接触list、tuple、dict以及自定义类型。
1. 整数 int
Python 中的整数类型是:
int例如:
a=10print(type(a))一个比较有意思的地方是,Python 的int表示范围没有固定上限,只要内存足够大,理论上就可以表示非常大的整数。
2. 浮点数 float
小数使用:
float例如:
a=0.5print(type(a))Python 这里和 C++ 又有一个明显区别。
Python 中主要使用float表示浮点数,没有单独的double类型;这里的float实际上对应双精度浮点数。
3. 字符串 str
使用单引号或者双引号包起来的内容,就是字符串:
a='hello'b="hello"这两种写法没有区别。
还可以使用:
len(a)获取字符串长度。
字符串之间可以使用+进行拼接:
a='hello'b='world'print(a+b)但是字符串不能直接和整数、浮点数进行这种加法。
4. 布尔类型 bool
布尔类型只有两个值:
TrueFalse后面进行条件判断和逻辑运算时会大量使用。
注意这里的写法是:
TrueFalse首字母大写,不是 C++ 中的:
truefalse七、为什么需要类型?
一开始可能会觉得:
“变量反正就是存数据的,为什么还要区分类型?”
其实类型至少有两个重要作用。
第一,类型和数据在内存中的存储方式、空间有关。
第二,类型会影响这个数据可以进行什么操作。
比如:
a=10b=20print(a+b)整数可以进行:
+ - * /等算术运算。
但是字符串:
a='hello'b='world'使用:
a+b得到的是:
helloworld这里的+已经不是数学意义上的加法,而是字符串拼接。
所以可以把类型理解成一种分类:相同类型的数据通常有相似的使用方式和规则。
八、注释
注释不会影响程序执行,主要作用是帮助自己和别人理解代码。
例如计算方差的代码,如果完全不写说明,过一段时间再回来看的时候,很容易忘记每个变量是在干什么。
可以这样写:
# 计算 4 个数字的方差avg=(67.5+89.0+12.9+32.2)/4我觉得注释有一个比较实际的作用:
不是只给别人看的,也是给未来的自己看的。
写代码的时候逻辑可能还记得很清楚,但几个月以后再看,很可能已经忘了。
所以注释最好和代码保持一致,不能代码改了,注释还停留在以前。注释也不要写得过短或者太长,核心就是把关键逻辑说明白。
九、Python的输入和输出
程序不能永远自己算自己的,还需要和用户交互。
用户把数据交给程序叫做输入,程序把结果展示出来叫做输出。
最基础的方式就是控制台输入输出。
Python 中最常用的就是:
print()input()1. print输出
最简单:
print('hello')也可以输出变量:
a=10print(a)字符串和变量一起输出时,可以使用f-string:
num=10print(f'num ={num}')这里:
f'num ={num}'就是 f-string,可以在{}里面直接放变量或者表达式。
2. input输入
使用:
input()从控制台读取输入。
例如:
num=input('请输入一个整数: ')print(f'你输入的整数是{num}')这里一定要记住:
input()返回的是字符串。
哪怕你输入:
10得到的也是:
'10'而不是:
10所以如果想做真正的数字运算,就需要进行类型转换。
十、类型转换
常见的类型转换函数有:
int()float()bool()str()例如:
a=input()b=input()a=int(a)b=int(b)print(a+b)如果没有转换:
a=input()b=input()print(a+b)那么这里实际上执行的是字符串拼接。
比如输入:
10 20结果可能是:
1020而不是:
30这也是刚学 Python 时非常容易踩的坑。
十一、算术运算符
Python 常见的算术运算符有:
+ 加法 - 减法 * 乘法 / 除法 % 取余 ** 乘方 // 整除1./除法
Python 中:
print(1/2)结果是:
0.5而不是0。
另外,除数不能为0,否则程序运行过程中会出现异常。
2.%取余
%不是百分号,而是求余数。
例如:
print(7%2)结果:
1因为:
7 ÷ 2 = 3 余 13.**乘方
例如:
print(4**2)结果:
16不仅可以计算整数次方,也可以进行小数次方,例如:
print(4**0.5)4.//整除
//又叫地板除。
例如:
print(7//2)结果:
3这里不是四舍五入,而是向下取整。
负数的时候尤其容易注意错:
print(-7//2)因为是向下取整,所以不能简单理解成“直接把小数部分砍掉”。
十二、关系运算符
关系运算符主要负责比较两个数据:
< <= > >= == !=结果只有:
TrueFalse例如:
a=10b=20print(a<b)print(a==b)print(a!=b)比较成立返回True,否则返回False。
=和==千万别混
这个和 C++ 一样,也是非常基础但容易错的地方。
a=10表示赋值。
而:
a==10表示比较是否相等。
这两个符号功能完全不同。
十三、字符串也可以比较
Python 中不仅数字可以使用关系运算符,字符串也可以比较。
例如:
a='hello'b='world'print(a<b)print(a==b)字符串比较采用的是字典序。
可以把它理解成查英文词典:
先比较第一个字符;
如果第一个字符一样,再比较第二个;
一直比较到出现不同的位置。
哪个单词在字典中更靠前,就认为哪个字符串更小。
另外,Python 中判断两个字符串内容是否相同,直接使用:
==或者:
!=即可。
十四、浮点数不要直接用==判断
比如:
print(0.1+0.2==0.3)很多人第一反应会觉得应该是:
True实际上可能得到:
False因为浮点数在计算机中并不能完全精确地表示,计算过程中会出现很小的误差。0.1 + 0.2的结果可能会带有非常小的尾差。
所以实际比较浮点数时,一般不是直接判断:
a==b而是判断:
abs(a-b)<eps也就是允许存在一定范围的误差。
十五、逻辑运算符
Python 的逻辑运算符主要有:
and or not分别对应:
并且 或者 取反1. and
两边都是真,结果才是真。
print(TrueandTrue)结果:
True只要有一边是假:
FalseandTrue结果就是:
False也就是:
一假则假。
2. or
只要有一边是真,结果就是真。
TrueorFalse结果:
True只有:
FalseorFalse才是False。
也就是:
一真则真。
3. not
not就是逻辑取反:
notTrue得到:
False而:
notFalse得到:
True十六、Python比较特别的一个写法
Python 支持连续比较:
a<bandb<c可以直接写成:
a<b<c这点和很多其他编程语言不一样。
所以以后看到:
1<x<10不要觉得奇怪,它就是在判断:
1 < x 并且 x < 10十七、短路求值
逻辑运算里面还有一个非常重要的概念:
短路求值。
对于and:
如果左边已经是False,那么整个表达式一定是False,右边就没有必要继续执行。
例如:
print(10>20and10/0==1)左边:
10>20本身就是False。
所以右边:
10/0根本不会执行,也就不会因为除零而抛出异常。
对于or则正好相反:
如果左边已经是True,那么整个表达式一定是True,右边也就不需要继续执行。
这个特性以后写条件判断的时候还是挺有用的。
十八、赋值运算符
最基础的赋值:
a=10除了普通赋值,Python 还支持链式赋值:
a=b=10也支持多元赋值:
a,b=10,20这种写法还特别适合交换两个变量:
a,b=b,a不用像 C++ 一样专门定义一个临时变量。
十九、复合赋值运算符
Python 支持:
+= -= *= /= %=例如:
a=10a+=1等价于:
a=a+1同理:
a-=1就是:
a=a-1二十、Python没有++和--
这个地方对于 C++ 程序员来说特别容易下意识写错。
C++ 中:
i++;i--;Python 不支持这种写法。
需要改成:
i+=1i-=1Python 在语法设计上直接没有加入++和--这种写法,也避免了前置和后置自增之间的一些区别。