前言
学习过程中难免会遇到问题,将所遇到的一些小问题解决并整理起来。就像写日记一样的来写这篇博客。
- 变量存储
python中变量赋值并不是一种内存操作 , 而是一种绑定关系
1 # 将money这个变量绑定到了100上 2 money = 100 3 # 打印money的内存地址 4 print(id(money)) 5 # 将money2这个变量也绑定到了100上 6 money2 = 100 7 # 打印money2的内存地址 8 print(id(money2)) 9 10 # 打印结果如下 11 # 1471417904 12 # 1471417904 13 14 # python先将100存到内存 , 然后等变量来绑定他 , 没人绑定他就会被内存机制清空 , 有多人绑定 , 那么他们的内存地址将会是一样的
我们通常利用 id() 来查看变量的内存地址,而一旦使用 id() 这个方法我们必然会发现一个问题,那就是两个变量值一样id竟然也是一样的,接下来就讲讲这个问题。
这里我不准备贴上代码来解释,所以真正验证请自己去试试。首先我是在Windows环境下,其次我分别在cmd和Pycharm下进行实验的。为什么我要在进行两次实验,因为在cmd下和Pycharm下得到的结果竟然是不一样的!
1. 在cmd下,结果反馈数字类型数值-5~257之间的数值,id是一样的,但是不在此范围内则会像容器类型一样,id会发生变化。这个结果可能跟Windows系统环境有关。
2. 在Pycharm下,跟上述所说一致,即字符串和数字类型值一样id便是一样的。这个结果跟python的存储机制一致。
Python中,数字和字符串只要值一样,id就一样,就算在容器类型(list、tuple、dict、set)里面,id也是一样的
当然对于python这种高级语言 ,底层的东西我们可以不用去管,但也不能什么都不知道。
======================我是分隔符========================
在python中我们用来比较一般用 ‘ == ’ ,但是还有一个我们经常用来进行比较的--‘ is ’,值得注意的是,‘ == ’是比较的值,而‘ is ’是比较的内存地址。
- 字符串中那些细节
字符串拼接的“+”已经在数据类型篇说过了,万恶的“+”。
strip() 方法:我们经常用来去除空格(当然还可以去除别的),所进行的操作是去除字符串两边的空格(不加参数strip默认为去除空格),所以其实我们并不能真正的把空格去掉,因为中间的是没有办法去除的。无论strip、lstrip或rstrip,都没有去除中间字符的功能,因为都是以中心为起点(不包括中心)开始进行迭代去除。
isdigit()方法:仅仅对英文数字有用,对于其他语言数字并没有作用,例如:希腊数字,俄语数字。
======================我是分隔符========================
字符串在判断是否为数字时要注意,对于bytes类型,isdecimal()、isnumberic()是无法操作的,即bytes类型中无这两个操作。
- 数据类型场景运用
我们存多个值的时候,元组会比列表更精简,因为元组是不可变的,所以没有修改的功能。当我们不需要修改的时候元组比列表更适合我们。
======================我是分隔符========================
我们取值操作的时候,列表和字典都可以实现我们的功能,而当数据量少时列表会比字典高效,但是当数据量大的时候用列表就不怎么明智了。因为列表中的值存取的速度会随着元素的增加而逐渐减小(即越靠后的元素存取速度则越慢),而对于字典,所有的值存取速度是一样的(字典是无序的),所以对于数据量大用字典比列表更好。
- 文件操作
文件操作中尤其注意文件句柄
r+虽然可写读,但是并没有像w+那样具有创建文件的能力。
w+可写可读,值得注意的是和 w 一样会清空文件里面的所有内容(没有就创建),所以当我们以w+模式写进去的时候文件句柄是在最后面的,如果我们接着就开始读当然就什么都读不到,所以我们可以利用seek()方法来调整一下这个指针之后再进行读。(PS:遇到需要用 w+ 的特定场景不多)
- range
range这个东西在python2.x会返回一个列表,自然也就是list类型,但是在python3中这个东西返回的是一个range类型 , 而range类型实则就是一个生成器。
- 函数
参数:
在函数头部(定义参数):一般参数 --> 默认参数 --> 非固定参数*args --> 非固定参数**kwargs
在函数调用中(传递参数):位置参数 --> 关键字参数 --> 默认参数 --> 非固定参数*args --> 非固定参数**kwargs
参数组合:
在我们使用过程中,如果没有非固定参数,那么我们的关键参数或者默认参数可以用关键字进行传递。如果有非固定参数,必须按照位置参数的方式进行传递。
======================我是分隔符========================
global
在我们定义全局变量的时候,要注意全局变量的使用,我们会遇到全局变量无法改变的问题,这关系到python的存储机制。我们会发现当全局变量是int和str的时候一旦我们修改全局变量就会出错,有人说是因为可变类型和不可变类型的关系,其实跟类型没有一毛钱关系。而是因为python中int和str在函数中,他和全局变量共用一个内存地址。当你要修改函数中的变量时python解释器并不知道你是要生成一个同名的变量还是修改外面的变量,这句话是什么意思?看下面:
a = 'lyon' def func(): b = a # 引用a a = 'somebody' #写上这一句python解释器就混乱了,下面解释 func() ''' 解释来了: 当你调用func函数时,按照我们的逻辑b会拿到全局变量a,即引用a 但是事实并不是这样,引用的时候b就会去抓这个a,到哪里抓? 到局部命名空间里去抓,而抓的时候又发现了个 a = 'somebody' 注意局部命名空间在调用后就生成了,于是a会抓到a = 'somebody' 一抓发现又出来了个a,于是他就懵逼了,因为他不知道这个a到底 是引用的a,还是我重新定义的重名变量,所以python解释器就骂你 并爆出了一堆错误。 由上我们可以总结出,我们对全局变量要么就只调用,要么就只改变 ,再要么我们改变的时候就换个变量。解释完毕! '''
正则分组的特殊之处
生成器中send