深入理解python(一)python语法总结:基础知识和对python中对象的理解

用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()则用来返回某序数对应的字符

猜你喜欢

转载自www.cnblogs.com/halaya/p/12269490.html