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创建一个对象,将指针指向新的对象即可 #(这是地址改变的原因,而不是对原有值进行修改)
在函数中的调用也是一样!
a = 1 def test(a): a = 2 #这里a中在函数中改变了,但是当函数结束后,全局变量a是不会变的,地址也不会变
-
不可变数据类型
list(列表),dict(字典),tuple(元组)
# 当引用到函数内,修改value,全局的数据类型也会改变! a = [0,1,2] def test(a): a.append(3) test(a) print(a)
注意:这就是为什么在许多函数内,当作者想要使用不可变数据类型时,而且函数内会将变量修改时,但是不想修改全局变量时,就会拷贝一份,再对拷贝出来的变量进行操作!
#这里进行举例:
a = [0,1,2]
def test(a):
b = a.copy()
b.append(3)
return b
b = test(a)
print(a)
print(b)
二、数据类型的方法使用问题
-
为什么可以在数据类型后面加上.get()或.append()方法?
因为这些数据类型的父类中,已经创建了这些方法,所以创建出来的实例,可以也具有这些方法
my_list = [0,1,2] # 实例化 def test(a): a.append(3) # .append()就是继承了父类的方法! test(my_list) print(my_list)
三、类的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
四、python解释器的冲突问题
问题描述:
电脑上有手动下载的python3.9与Anaconda自带的python解释器,当需要使用python3.9时,系统使用的是Anaconda自带的python解释器!
寻找问题:
从pip list命令中查看到,明明有第三方库,但还是报错找不到!
ImportError: Couldn't import Django.
发现问题:
查看使用的python环境【发现是两个python环境冲突!】
- 方法一:
-
方法二:
执行命令:
& 'D:\Program Files\Python39\python.exe' .\manage.py runserver 0.0.0.0:8081
五、python导包问题
情境引入:
如上图所示,当自己写了两个view.py文件,需要在main.py导入myapp中的view.py
问题描述:
当在main.py中写入
import view
发现view文件中没有我们之前设置的方法!
问题发现:
通过view的方法查看,原来是导入了与myapp同级目录的view.py文件
问题分析:
python解释器找包是从外向内找!
1、首先从python内置库文件中找
2、如果没有,则去项目文件中,从主目录一层一层往下找!
解决方法:
指定导入位置即可:
from . import view # 指定导入同级目录中的view.py文件
from project import view # 指定导入同级目录中的view.py文件
总结:因为不了解导包机制,所以造成了错误!唉,基础不牢,地动山摇啊!
六、python版本与pip下载问题
情境引入:
当时同学跑一个项目,用pycharm打开项目后,需要下载一个库
但是需要3.7版本的python,而他是3.8版本的,为了防止版本冲突和其他的不确定因素,他删掉3.8版本,下载了3.7版本
ps:【有时pip下载报错,是因为pip过低导致!】
问题描述:
然后再去下载库
但是,当他执行pip命令时:
pip install xxx
pip报错了
问题发现:
1、先把之前那些版本的pip版本删除,然后重新执行命令,还是不行!
2、在cmd中输入:
pip -V
查看到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)才可以!