前言

  学习过程中难免会遇到问题,将所遇到的一些小问题解决并整理起来。就像写日记一样的来写这篇博客。

 

  • 变量存储

  python中变量赋值并不是一种内存操作 , 而是一种绑定关系




爱存钱的小明python python存钱问题_全局变量

爱存钱的小明python python存钱问题_内存地址_02

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存到内存 , 然后等变量来绑定他 , 没人绑定他就会被内存机制清空 , 有多人绑定 , 那么他们的内存地址将会是一样的


View Code


  我们通常利用 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解释器并不知道你是要生成一个同名的变量还是修改外面的变量,这句话是什么意思?看下面:

 



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