用 python 也用了两年了, 趁这次疫情想好好整理下.
大概想法是先对 python 一些知识点进行总结, 之后就是根据 python 内核源码来对 python 的实现方式进行学习, 不会阅读整个源码,,, 但是应该会把数据结构的实现, 函数调用过程, 以及 python 虚拟机的基本原理根据源码解释下.
当然限于笔者只是一个弱鸡,,, 如内容有疏漏的地方或者是一些错误, 希望看到的大佬不吝赐教.
第一部分 python 语法总结
当然如果对 python 语法还是一无所知的同学请移步缪雪峰或者菜鸟教程等学习网站看一遍再过来,,,, 这里只是进行一些简单的总结
当然, 在这之中我会着重的标明一些 python2 和 python3 中的区别, 具体的结构如下:
1. 数据结构
2. 选择循环
3. 字符串与编码
4. 函数
5. 面向对象编程
6. 异常处理以及 python 的模块
基础知识
当然, 在开始之前我们还要简单的回顾一下基本知识(当然仅仅是列出一些要注意的点):
1. 一切皆对象的思想
对象是 python 中最基本的概念, 在 python 中处理的每个东西都可以称为对象, 而同时 python 的变量都可以看成是内存中某个对象的引用.
关于引用的一个示例如图:
3,9 即放在内存中的对象, 而 x 则是对之的引用, 当改变 3 的值的时候, 只是将 x 指向的对象指向了 9, 而并没有改变 3 的值.
之后则是关于可变对象和不可变对象:
可变对象和不可变对象是指内容是否可以被改变.
不可变对象包括: number,string,tuple,
可变对象包括: list,set,dict
下面给出几个例子来说明上面的问题:
- >>> a=1
- >>> id(a)
- 491508784
- >>> b=1
- >>> id(b)
- 491508784
- >>> c=[1,2,3]
- >>> id(c)
- 45265984
- >>> d=[1,2,3]
- >>> id(d)
- 3252992
- >>> a==b
- True
- >>> c==d
- True
- >>> a is b
- True
- >>> c is d
- False
我们可以看到, 对于不可变对象, 在内存中地址是唯一的, 而对于可变对象, 即便值相等, 但是在内存中的存储却是两个不同的对象. 同时 python 中 "is" 关键字是比较两个引用引用的是否为一个对象, 而对于 == 则是比较的是对应值
再来一个例子:
- >>> a=1
- >>> b=a
- >>> a+=1
- >>> a
- 2
- >>> b
- 1
- >>> a=[1,2,3]
- >>> b=a
- >>> b
- [1, 2, 3]
- >>> a[0]=0
- >>> a
- [0, 2, 3]
- >>> b
- [0, 2, 3]
- >>> a*=2
- >>> a
- [0, 2, 3, 0, 2, 3]
- >>> b
- [0, 2, 3, 0, 2, 3]
- >>> a=a*2
- >>> a
- [0, 2, 3, 0, 2, 3, 0, 2, 3, 0, 2, 3]
- >>> b
- [0, 2, 3, 0, 2, 3]
我们可以看到, 由于数字是不可变对象, 所以改变 a, 将 a 指向的对象改变了, b 仍然是之前所指的值. 而对于可变对象, 由于 a,b 值得是同一对象, 所以通过索引改变 a 的时候, b 也会跟着改变.
但是对于 a=a*2 这个操作, 并没有对 a 进行原地 (在对象上的) 改变, 相当于对重新创建了一个 a*2 的对象使 a 指向它, 所以 b 并没有改变, 但 a*=2 这个操作则是原地的, 所以 b 也会跟着改变.
所以为了避免索引改变值, 我们引用了 copy 操作
- >>> a = [1, 2, 3]
- >>> b = a[:]
- >>> id(a)
- 140200275166560
- >>> id(b)
- 140200275238712 # 由于 b 引用的是 a 引用对象的一个拷贝, 两个变量指向的内存空间不同
- >>> a[0] = 0
- >>> b
- [1, 2, 3] # 改变 a 中的元素并不会引起 b 的变化
或
- >>> import copy
- >>> b = copy.copy(a)
当然, 还会有浅层 copy 和深层 copy 的区别, 浅层只是对父对象进行了拷贝, 而深层拷贝则是除了顶层拷贝外将所有的子对象也进行了拷贝, 如下例:
- >>> a=[[1,2,3],0,3]
- >>> b=a.copy()
- >>> a[0][0]=0
- >>> b
- [[0, 2, 3], 0, 3]
- >>> a[1]=1
- >>> a
- [[0, 2, 3], 1, 3]
- >>> b
- [[0, 2, 3], 0, 3]
- >>> import copy
- >>> c=copy.deepcopy(a)
- >>> a[0][0]=3
- >>> a
- [[3, 2, 3], 1, 3]
- >>> c
- [[0, 2, 3], 1, 3]
关于可迭代对象, 这个就放在后面说, 这里就不展开了.
之后是关于对象的回收
上每个象包含一个引用的计数器, 计数器记录了当前指向该对象引用的数目, 一旦对象的计数器为 0 , 即不存在对该对象的引用, 则这个对象的内存空间会被回收. 这就是 Python 中对象的回收机制, 一个最明显的好处即在编写代码过程中不需要考虑释放内存空间.
2. 几个 python2 和 python3 的差别
a. 内置函数 map()可以将一个单参数函数依次作用到一个序列的每个元素上, 并返回:
一个列表作为结果(Python 2)
一个 map 对象 (它是一个可迭代对象) 作为结果 (Python 3)
b.python2 和 python3 除法的区别:
Python 中的除法有两种, 整数除法 (整除运算) 和真除法
Python 2 和 Python 3 对 "/" 运算符的解释有区别
Python 2 将 "/" 解释为整数除法, 而 Python 3 将其解释为真除法. 例如, 在 Python 3 中运算结果如下:
- >>> 3/5
- 0.6
- >>> 3//5
- 0
- >>> 3.0/5
- 0.6
- >>> 3.0//5
- 0.0
- >>> 13//10
- 1
- python2:
- >>> 3/5
- 0
- >>> 3//5
- 0
- >>> 3.0/5
- 0.6
- >>> 3.0//5
- 0.0
- >>> 13//10
- 1
c. 基本输入输出的区别
python2 中 input 函数会根据所输入的界定符来判断对象类型, 如输入 1 为整型, 而输入'1'为字符串型.
python2 中 raw_input 会将所有的输入看为字符串
而 python3 中则没有 raw_input, 其 input 的作用就相当于 python2 中 raw_input 的作用
还有就是 print 函数的区别, 相比大家已经很熟悉, 这里不再阐述.
3. 几个常用的内置函数, 个人认为比较重要的几个
map 函数, 第一个传入一个函数, 第二个参数传入一个列表, 返回对列表中每个项使用第一个参数函数的结果(pyhon2 和 3 返回的结果类型不同)
如(python3):
- >>> a=[1,2,3]
- >>> map(str,a)
- >>> c=map(str,a)
- >>> type(c)
- <class 'map'>
- >>> list(c)
- ['1', '2', '3']
dir()函数可以查看指定模块中包含的所有成员或者指定对象类型所支持的操作
ord()和 chr()是一对功能相反的函数, ord()用来返回单个字符的序数或 Unicode 码, 而 chr()则用来返回某序数对应的字符
来源: http://www.bubuko.com/infodetail-3415748.html