zoukankan      html  css  js  c++  java
  • python所遇问题合集(持续更新)

    前言

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

    • 变量存储

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

      

  • 相关阅读:
    Webservice接口
    Loadrunner使用代理录制
    Python学习Collections 模块
    Python学习笔记(八)
    Linux系统部署禅道
    Python学习笔记(七)
    Python学习笔记(六)
    Python学习笔记(五)
    Python学习笔记(四)
    Python学习笔记(三)
  • 原文地址:https://www.cnblogs.com/lyonyang/p/7198049.html
Copyright © 2011-2022 走看看