尚学堂 Python 400 集
如果本文有侵犯您的知识产权和版权问题,请通知本人,本人会立即做出处理并删除文章
电子邮件:louhergetup@163.com >
代码测试所用版本: Python 3.8.2
一行程序长度是没有限制的,但是为了可读性更强,通常将一行比较长的程序分为多行。这是,我们可以使用(\)行连接符,把它放在行结束的地方。Python解释器仍然将它们解释为同一行。
【操作】

Python中,一切皆对象。每个对象由:标识(identity)、类型(type)、**value(值)**组成。
对象的本质就是:一个内存块,拥有特定的值,支持特定类型的相关操作。
【操作】
>>> a=3
>>> a
3
>>> id(3)
140725773457120
>>> type(3)
<class 'int'>
>>> id(a)
140725773457120
>>> type(a)
<class 'int'>
>>> print(a)
3
>>> b="我爱你"
>>> id(b)
2317423148944
>>> type(b)
<class 'str'>
>>> print(b)
我爱你
>>>

在Python中,变量也称为:对象的引用。
因为,变量存储的就是对象的地址。变量通过地址引用了“对象”。
变量位于:栈内存(压栈出栈等细节,后续再介绍)。
对象位于:堆内存。
Python是动态类型语言
变量不需要显式声明类型。根据变量引用的对象,Python解释器自动确定数据类型。
Python是强类型语言
每个对象都有数据类型,只支持该类型支持的操作。

标识符:用于变量、函数、类、模块等的名称。 标识符有如下特定的规则:
【操作】使用Python帮助系统查看关键字
>>> help()
>help> keywords
Here is a list of the Python keywords. Enter any keyword to get more help.
False class from or
None continue global pass
True def if raise
and del import return
as elif in try
assert else is while
async except lambda with
await finally nonlocal yield
break for not
help> quit
| 类型 | 规则 | 例子 |
|---|---|---|
| 模块和包名 | 全小写字母,尽量简单。若多个单词之间用下划线 | math, os, sys |
| 函数名 | 全小写字母,多个单词之间用下划线隔开 | phone, my_name |
| 类名 | 首字母大写,采用驼峰原则。多个单词时,每个单词第一个字母大写,其余部分小写 | MyPhone、MyClass、Phone |
| 常量名 | 全大写字母,多个单词使用下划线隔开 | SPEED、MAX_SPEED |
变量的声明和赋值用于将一个变量绑定到一个对象上,格式如下:
变量名 = 表达式
最简单的表达式就是字面量。比如:a = 123 。 运行过程中,解释器先运行右边的表达式,生成一个代表表达式运算结果的对象;然后,将这个对象地址赋值给左边的变量。
【操作】变量在使用前必须先被初始化(先被赋值)
>>> my_name
Traceback (most recent call last):
File "" , line 1, in <module>
my_name
NameError: name 'my_name' is not defined
【操作】可以通过del语句删除不在使用的变量。
>>> a=123
>>> del a
>>> a
Traceback (most recent call last):
File "" , line 1, in <module>
a
NameError: name 'a' is not defined
如果对象没有变量引用,就会被垃圾回收器回收,清空内存空间。
链式赋值用于同一个对象赋值给多个变量。
x=y=123 #相当于:x=123; y=123 (x,y 都指向123)
系列数据赋值给对应相同个数的变量(个数必须保持一致)
a,b,c=4,5,6 #相当于:a=4;b=5;c=6
【操作】使用系列解包赋值实现变量交换
>>> a,b=10,20
>>> a
10
>>> a,b=b,a
>>> a
20
>>> print(a,b)
20 10
Python 不支持常量,即没有语法规则限制改变一个常量的值。我们只能约定常量的命名规则,以及在程序的逻辑上不对常量的值作出修改。
>>> MAX_SPEED = 120
>>> print(MAX_SPEED)
120
>>> MAX_SPEED = 140 #实际是可以改的。只能逻辑上不做修改。
>>> print(MAX_SPEED)
140
每个对象都有类型,python中最基本的内置数据类型:
| 运算符 | 说明 | 示例 | 结果 |
|---|---|---|---|
| + | 加法 | 3+2 | 5 |
| - | 减法 | 30-5 | 25 |
| * | 乘法 | 3*6 | 18 |
| / | 浮点数除法 | 8/2 | 4.0 |
| // | 整数除法 | 7//2 | 3 |
| % | 模(取余) | 7%4 | 3 |
| ** | 幂 | 2**3 | 8 |
【操作】使用divmod()函数同时得到商和余数:
>>> divmod(10,5)
(2, 0)
Python中,除10进制,还有其他三种进制:
【操作】测试不同进制
>>> 0B101
5
>>> 0o10
8
>>> 0o9
SyntaxError: invalid digit '9' in octal literal
>>> 0xf
15
>>> 0x255
597
>>> 0xff
255
使用int()实现类型转换:
【操作】测试int()实现类型转换
>>> int(3.14)
3
>>> int(3.9)
3
>>> int(True)
1
>>> int(False)
0
>>> int(23456)
23456
>>> int("23456")
23456
>>> int("23456abc")
Traceback (most recent call last):
File "" , line 1, in <module>
int("23456abc")
ValueError: invalid literal for int() with base 10: '23456abc'
>>> int("456.78")
Traceback (most recent call last):
File "" , line 1, in <module>
int("456.78")
ValueError: invalid literal for int() with base 10: '456.78'
自动转型:
整数和浮点数混合运算时,表达式结果自动转型成浮点数。比如:2+8.0的结果是10.0
>>> a = 3 +4.1
>>> a
7.1
>>> type(a)
<class 'float'>
整数可以有多大?
Python2中,int是32位,可以存储从-2147483648到2147483647的整数(约±21亿)。Long类型是64位,可以存储:-2^63 --2^63-1之间的数值。
Python3中,int可以存储任意大小的整数,long被取消。我们甚至可以存储下面的值:
>>> googol = 10**100
>>> googol
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Python3中可以做超大数的计算,而不会造成“整数溢出”,这也是Python特别适合科学运算的特点。
浮点数,称为float。
浮点数用科学计数法表示。比如:3.14,表示成:314E-2或者314e-2。
这些数字在内存中也是按照科学计数法存储。
>>> float(3) #不会改变原有值(对象),而是产生新的值(对象)
3.0
>>> float("3.14")
3.14
>>> int(3.94) #不会改变原有值(对象),而是产生新的值(对象)
3
>>> round(3.54) #不会改变原有值(对象),而是产生新的值(对象)
4
>>> round(3.14)
3
>>> round(4.5) #注意,奇入偶不入
4
运算符+、-、*,/、//、**和%和赋值符=结合可以构成“增强型赋值运算符”。
a = a + 1 等价于: a +=1
注:但不会改变原有值(对象),而是产生新的值(对象),原有值(对象)被垃圾回收机制回收
| 运算符 | 例子 | 等价 |
|---|---|---|
| += | a += 2 | a = a + 2 |
| -= | a -= 2 | a = a-2 |
| *= | a *= 2 | a = a * 2 |
| /= | a /= 2 | a = a / 2 |
| //= | a //= 2 | a = a//2 |
| **= | a **= 2 | a = a**2 |
| %= | a %= 2 | a = a % 2 |
注意:“+=”中间不能加空格!
计算机中时间的表示是从“1970年1月1日 00:00:00”开始,以毫秒(1/1000秒)进行计算。我们也把1970年这个时刻成为“unix时间点”。
这样,我们就把时间全部用数字来表示了。

python中可以通过time.time() 获得当前时刻,返回的值是以秒为单位,带微秒(1/1000毫秒)精度的浮点值。
【操作】时间测试
>>> import time
>>> a = int(time.time())
>>> a
1649681519
>>> totalMinutes=a//60
>>> totalMinutes
27494691
>>> totalHours = totalMinutes//60
>>> totalHours
458244
>>> totalDays = totalHours//24
>>> totalDays
19093
>>> totalYears = totalDays//365
>>> totalYears
52
# 浮点整除之后还是浮点
>>> b = time.time()
>>> b
1649682427.537643
>>> totalMinutes=b//60
>>> totalMinutes
27494707.0
【操作】定义多点坐标_绘出折线_并计算起始点和终点距离
import turtle
import math
#定义多个点的坐标
x1,y1=100,100
x2,y2=100,-100
x3,y3=-100,-100
x4,y4=-100,100
#绘制折线
turtle.penup()
turtle.goto(x1,y1)
turtle.pendown()
turtle.goto(x2,y2)
turtle.goto(x3,y3)
turtle.goto(x4,y4)
#计算起始点到终止点的距离
distance=math.sqrt((x1-x4)**2+(y1-y4)**2)
turtle.write(distance)
运行结果

Python2中没有布尔值,直接用数字0表示False,用数字1表示True。
Python3中,把True和False定义成了关键字,但他们的本质还是1和0,甚至可以和数字相加。
【操作】布尔值与数字相加
>>> a = True
>>> b = 3
>>> a+b
4
所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。
以下假设变量a为15,变量b为30:
| 运算符 | 描述 | 实例 |
|---|---|---|
| == | 等于 - 比较对象的值是否相等 | (a == b) 返回 False |
| != | 不等于 - 比较两个对象的值是否不相等 | (a != b) 返回 true |
| > | 大于 - 返回x是否大于y | (a > b) 返回 False |
| < | 小于 - 返回x是否小于y | (a < b) 返回 true |
| >= | 大于等于 - 返回x是否大于等于y | (a >= b) 返回 False |
| <= | 小于等于 - 返回x是否小于等于y | (a <= b) 返回 true |
| 运算符 | 格式 | 说明 |
|---|---|---|
| or 逻辑或 | x or y | x为true,则不计算y,直接返回true x为false,则返回y |
| and 逻辑与 | x and y | x为true,则返回y的值 x为false,则不计算y,直接返回false |
| not 逻辑非 | not x | x为true,返回false x为false,返回true |
【操作】测试逻辑运算符
>>> a = True
>>> b= False
>>> a or 30
True
>>> b or 30
30
>>> a or 30/0
True
>>> a and 30
30
>>> b and 30
False
>>> not a
False
同一运算符用于比较两个对象的存储单元,实际比较的是对象的地址。
| 运算符 | 描述 |
|---|---|
| is | is是判断两个标识符是不是引用同一个对象 |
| is not | is not 是判断两个标识符是不是引用不同对象 |
is 与 == 区别:
is 用于判断两个变量引用对象是否为同一个,即比较对象的地址。
== 用于判断引用变量引用对象的值是否相等,默认调用对象的 eq()方法。
【操作】测试同一运算符
>>> a=1000
>>> b=1000
>>> a==b
True
>>> a is b
False
>>> id(a)
1470855474032
>>> id(b)
1470856284720
Python仅仅对比较小的整数对象进行缓存(范围为[-5, 256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化(范围是[-5,任意正整数])。
【操作】测试整数缓存问题
>>> c=10
>>> d=10
>>> c is d
True
>>> id(c)
140726384842688
>>> id(d)
140726384842688
文件中测试
a = -6
b = -6
print(a is b)
a = -5
b = -5
print(a is b)
a = 10000000000000000001
b = 10000000000000000001
print(a is b)
运行结果
True #与高淇老师测试结果不同,老师是False
True
True
注意
x = y = [4,5,6]
z = [4,5,6]
print(x==y)
print(x is y)
print(x==z)
print(x is z)
print(id(x))
print(id(y))
print(id(z))
运行结果
True
True
True
False
2119646246336
2119646246336
2119607451328
| 运算符 | 说明 |
|---|---|
| and , or , not | 布尔与、布尔或、布尔非 |
| is , is not | 同一性判断,判断是否为同一个对象 |
| <,<=,>,>=,!=,== | 比较值是否相当,可以连用 |
| | ^ & | 按位或,按位异或、按位与 |
| <<, >> | 移位 |
| ~ | 按位翻转 |
| +,-,*,/,//,% | 加,减,乘,浮点除、整数除、取余 |
| ** | 幂运算 |
【操作】测试
>>> a = 4
>>> 3<a<10 #关系运算符可以连用
True
>>> a = 0b11001
>>> b = 0b01000
>>> a
25
>>> b
8
>>> c = a|b #或,位都为0则为0 ,否则为1
>>> c
25
>>> bin(c) #bin()可以将数字转成二进制表示
'0b11001'
>>> bin(a&b) #与,位都为1则为1 ,否则为0
'0b1000'
>>> bin(a^b) #异或,位相同为0,不同为1
'0b10001
>>> a = 3
>>> a<<2 #左移1位相当于乘以2.左移2位,相当于乘以4
12
>>> a = 8
>>> a>>1 #右移1位相当于除以2.
>>> [10,20,30]+[5,10,100] #类似于字符串拼接
[10, 20, 30, 5, 10, 100]
>>> [10,20,30]*3 #类似于字符串复制,乘法本质上就是复制
[10, 20, 30, 10, 20, 30, 10, 20, 30]
| 运算符 | 描述 | 示例 | 等价于 |
|---|---|---|---|
| += | 加法赋值 字符串拼接 | sum += n a += “sxt” | sum = sum + n a = a + “sxt” |
| -= | 减法赋值 | num1 -= n | num = num - n |
| *= | 乘法赋值 | a *= b | a = a * b |
| /= | 浮点除赋值 | a/=b | a = a / b |
| //= | 整数除赋值 | a//=b | a = a//b |
| %= | 取余赋值 | a%=b | a = a % b |
| **= | 幂运算赋值 | a**=2 | a = a**2 |
| <<= | 左移赋值 | a<<=2 | a = a<<2 |
| >>= | 右移赋值 | a>>=2 | a = a>>2 |
| &= | 按位与赋值 | a&=b | a = a&b |
| | = | 按位或赋值 | a | =b |
| ^= | 按位异或赋值 | a^=b | a = a^b |
注:与C和JAVA不一样,Python不支持自增(++)和自减(–)
| ** | 指数 (最高优先级) |
|---|---|
| ~ | 按位翻转 |
| * / % // | 乘,除,取模和取整除 |
| + - | 加法减法 |
| >> << | 右移,左移运算符 |
| & | 位 ‘AND’ |
| ^ | | 位运算符 |
| <= < > >= | 比较运算符 |
| <> == != | 等于运算符 |
| = %= /= //= -= += *= **= | 赋值运算符 |
| is is not | 身份运算符 |
| in not in | 成员运算符 |
| not or and | 逻辑运算符 |
实际使用中,记住如下简单的规则即可,复杂的表达式一定要使用小括号组织。