• python——基础排坑+经验总结(持续更新)


    python——基础排坑+经验总结(持续更新)

    一、可变数据类型与不可变数据类型的坑

    • 可变数据类型

      int(整数),string(字符串),float(浮点型)

      a=1
      b=1
      # 这里a与b的地址是一样的(我们可以打印看一下)
      print(id(a))
      print(id(b))
      # 当a=2时,地址将会变化
      a=2
      print(id(a))
      ###
      #原因:
      #万物皆对象---python是将指针指向 数据对象
      #当数据更改时,python创建一个对象,将指针指向新的对象即可
      #(这是地址改变的原因,而不是对原有值进行修改)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

    在函数中的调用也是一样!

    a = 1
    
    def test(a):
    	a = 2
    
    #这里a中在函数中改变了,但是当函数结束后,全局变量a是不会变的,地址也不会变
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    • 不可变数据类型

      list(列表),dict(字典),tuple(元组)

      # 当引用到函数内,修改value,全局的数据类型也会改变!
      
      a = [0,1,2]
      
      def test(a):
      	a.append(3)
      	
      test(a)
      print(a)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9

    注意:这就是为什么在许多函数内,当作者想要使用不可变数据类型时,而且函数内会将变量修改时,但是不想修改全局变量时,就会拷贝一份,再对拷贝出来的变量进行操作!

    #这里进行举例:
    a = [0,1,2]
    
    def test(a):
    	b = a.copy()
    	b.append(3)
    	return b
    
    b = test(a)
    print(a)
    print(b)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    二、数据类型的方法使用问题

    • 为什么可以在数据类型后面加上.get()或.append()方法?

      因为这些数据类型的父类中,已经创建了这些方法,所以创建出来的实例,可以也具有这些方法

      my_list = [0,1,2]    #  实例化
      
      def test(a):
      a.append(3)  # .append()就是继承了父类的方法!
      
      test(my_list) 
      print(my_list)   
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

    三、类的self问题

    class studentInfo:
        school = 'No.1'       # 类属性
        def __init__(self, name, age):
            self.name = name  # 实例属性
            self.age = age
        
            
    stu_1 = studentInfo('小明', 20)
    
    # self表示类创建的实例/对象本身
    
    # 当 stu_1 实例化时,调用__init__初始化方法,需要将实例传入!
    # 所以其中的self就是指实例!
    # 方法内的语句也就顺理成章了!
    # 即可看为: 
    # self.name = name  等于 stu_1.name = name
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    四、python解释器的冲突问题

    问题描述:

    电脑上有手动下载的python3.9与Anaconda自带的python解释器,当需要使用python3.9时,系统使用的是Anaconda自带的python解释器!

    寻找问题:

    pip list命令中查看到,明明有第三方库,但还是报错找不到!

    ImportError: Couldn't import Django.
    
    • 1

    发现问题:

    查看使用的python环境【发现是两个python环境冲突!】

    • 方法一:
      在这里插入图片描述

    • 方法二:
      在这里插入图片描述

      执行命令:

       & 'D:\Program Files\Python39\python.exe' .\manage.py runserver 0.0.0.0:8081
      
      • 1

    五、python导包问题

    在这里插入图片描述

    情境引入:

    如上图所示,当自己写了两个view.py文件,需要在main.py导入myapp中的view.py

    问题描述:

    当在main.py中写入

    import view 
    
    • 1

    发现view文件中没有我们之前设置的方法!

    问题发现:

    通过view的方法查看,原来是导入了与myapp同级目录的view.py文件

    问题分析:

    python解释器找包是从外向内找!

    1、首先从python内置库文件中找

    2、如果没有,则去项目文件中,从主目录一层一层往下找!

    解决方法:

    指定导入位置即可:

    from . import view   # 指定导入同级目录中的view.py文件
    
    • 1
    from project import view   # 指定导入同级目录中的view.py文件
    
    • 1

    总结:因为不了解导包机制,所以造成了错误!唉,基础不牢,地动山摇啊!


    六、python版本与pip下载问题

    情境引入:

    当时同学跑一个项目,用pycharm打开项目后,需要下载一个库

    但是需要3.7版本的python,而他是3.8版本的,为了防止版本冲突和其他的不确定因素,他删掉3.8版本,下载了3.7版本

    ps:【有时pip下载报错,是因为pip过低导致!】

    问题描述:

    然后再去下载库

    但是,当他执行pip命令时:

    pip install xxx
    
    • 1

    pip报错了

    问题发现:

    1、先把之前那些版本的pip版本删除,然后重新执行命令,还是不行!

    2、在cmd中输入:

    pip -V
    
    • 1

    查看到pip的来源是该项目的虚拟环境!【venv即是pycharm创建的虚拟环境】
    在这里插入图片描述

    3、而我们想要的是python3.7版本自己的pip版本

    解决方法:

    将虚拟环境删掉【即:删掉venv文件】,再配置我们自己下载的python3.7版本就可以了!

    总结: 当下载出错的时候,用pip -V 查看这个pip是来自哪里的,想想是不是我们想要配置的路径!


    附:开发经验

    一、在写判断语句的时候,可以将常量写左边,变量写右边

    【因为如果不小心写成了赋值语句,编译器是可以判断出来的】

    例如:if(i=0)对比if(0=i)

    二、在写死循环的时候,可以写while(1 == 1),或需要测试某一个代码段时,可以写if(1 == 1)

    当不需要执行的时候,把1改为0,就可以了!

    如果是while(ture),还需要改成while(false)才可以!

  • 相关阅读:
    Python 文件简单操作
    【css面试题】实现2栏布局 右侧自适应; 3栏布局 中间自适应
    《恋上数据结构与算法》第1季:双向链表实现(超详细笔记,图文并茂)
    (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
    springboot基于web模式的师资管理系统的设计与实现毕业设计源码040928
    10.(vue3.x+vite)组件间通信方式之props与$emit
    ERP采购收货在标准成本和移动平均价下的差别
    带大家来一次全志V853开发板沉浸式开箱
    聊聊Maven的依赖传递、依赖管理、依赖作用域
    转换年金是什么意思呢?
  • 原文地址:https://blog.csdn.net/Pan_peter/article/details/126507304