import 导入模块
1.import导入模块
- import 导入模块(搜索路径)
import sys
sys.path
从列出的目录里依次查找要导入的模块文件
- 程序导入路径
因为sys.path返回的是一个列表,那么就可以用sys.path.append("需要导入的模块路径"),相对路径不用/,绝对路径/开头
- 重新导入模块
模块被导入后,如果某一方更新了这个模块,但是import module不能重新导入模块,重新导入需用from imp import *,然后再使用reload(test)即可重新导入
2.循环导入
循环导入就是程序在导入某个模块的过程中,该模块里的函数又需要导入自身的这个模块,如此进入死循环,
避免循环导入:所有在开发的过程中,开发者们写的模块不能相互调用,即应该相互隔开,然后由架构师来负责整体的模块调用使用,也就是上下设计分层,降低耦合
3.在一般情况下,如果仅仅是用作模块引入,不必写if __name__ =="__main__":
==和is
1.==和is
- is 是比较两个引用是否指向了同一个对象(引用比较)。a is b :返回False
- == 是比较两个对象是否相等 a ==b:返回True
- 总结:判断两者内容用==,判断两者是否指向同一个用is,如果是数字则在一个负数到正的一百二十多,==和is都为True,过了这个范围两者就不指向一个对象了
浅拷贝和深拷贝
1.浅拷贝和深拷贝
- 浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容
- 相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a=b
- 深拷贝首先要import copy,然后c = copy.deepcopy(a),就表示把a的内容深拷贝到c中,如果发现了a中也存在引用的内容,则递归拷贝,也就是把当前的这个引用的对象继续深拷贝
- copy和deepcopy的区别
copy:浅拷贝,里面如果有可变类型,修改这个可变类型(如list),被拷贝的对象也会相应改变,仅仅拷第一层,如果是不可变类型,就一层都不拷,如果是可变类型就拷一层
deepcopy:深拷贝,里面不管是可变类型和不可变类型,被拷贝的对象都不会受到影响,递归拷贝
- copy和deepcopy拷贝元组的特点
使用copy模块的copy功能的时候,它会根据当前拷贝的数据类型是可变类型还是不可变类型有不同的处理方式,如元组是不可变类型,拷贝多份没有用,对copy来说,如果是可变类型就拷一层,如果是不可变类型,就一层都不拷
进制丶位运算
1.进制间的转换
bin(10) #10进制转为2进制
int("1001",2) #2进制转为10进制
hex(10) #10进制转为16进制
int('ff',16) #16进制转为10进制
bin(0xa) #16进制转为2进制
oct(8) #10进制转为8进制
hex(0b1001) #2进制转为16进制,0b表示二进制
2.位运算的介绍
- & 按位与
- | 按位或
- ^ 按位异或
- ~ 按位取反
- << 按位左移
- >> 按位右移
私有化
1.私有化
- xx: 公有变量
- _x: 单前置下划线,私有化属性或方法,from somemodule import *禁止导入,类对象和子类可以访问
- __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问(名字重整所以访问不到)
- __xx__:双前后下划线,用户名字空间的魔法对象或属性。例如:__init__ , __ 不要自己发明这样的名字
- xx_:单后置下划线,用于避免与Python关键词的冲突
总结:
- 父类中属性名为__名字的,子类不继承,子类不能访问
- 如果在子类中向__名字赋值,那么会在子类中定义的一个与父类相同名字的属性
- _名的变量、函数、类在使用from xxx import *时都不会被导入
属性property
1.属性property-1
- 私有属性添加getter和setter方法
- 使用property升级getter和setter方法
#num = property(getNum,setNum)
#将方法转换为只读
#注意点:
#1.Num到底是调用getNum()还是setNum(),要根据实际的场景来判断,值得注意的是一定要先填getNum后setNum
#2.如果是给t.num赋值,那么一定调用setNum()
#3.如果是获取t.num的值,那么就一定调用getNum()
#property的作用:相当于把方法进行了封装,开发者在对属性设置数据的时候更方便
2.属性property-2
第二种的property的方法
@property #修饰器
def num(self):
print("------getter-----")
return self.__num
@num.setter #修饰器
def num(self,new_num):
print("------setter------")
self.__num = new_num
t.num = 20
print(t.num)
迭代器
1.迭代器
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
2.可迭代对象
可以直接用 for 循环遍历的数据类型有以下几种:一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
一类是 generator(列表生成式,生成器) ,包括生成器和带 yield 的generator function。
这些可以直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
3.判断是否可以迭代
可以使用 isinstance() 判断一个对象是否是 Iterable 对象:
from collections import Iterable
isinstance([ ], Iterable),如果可以迭代就返回True
而生成器不但可以作用于 for 循环,还可以被 next() 函数不断调用并返回下一个值,直到最后抛出 StopIteration 错误表示无法继续返回下一个值了。
4.迭代器
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。可以使用 isinstance() 判断一个对象是否是 Iterator 对象:
生成器(i for i in range(10))一定是迭代器,但迭代器不一定是生成器
from collections import Iterator
isinstance((x for x in range(10)), Iterator),如果是的话就返回True
5.iter( )函数
生成器都是 Iterator(迭代器)对象,但 list 、 dict 、 str 虽然是 Iterable (可迭代),却不是 Iterator (迭代器)
把 list 、 dict 、 str 等 Iterable(可迭代) 变成 Iterator(迭代器) 可以使用 iter() 函数,就好比人可以游泳,但不是天生就会,可迭代对象就好比人,迭代器就好比会游泳的人,