python高级的相关操作
-
模块的重新导入
# test.py模块 def test(): print("----1----") print("----2----") # 主文件 import sys #这是模块的查找路径 sys.path #这是个变量 是个列表 可以用列表的操作 sys.path.append('/home') #添加模块的搜索路径 print(sys.path) #导入模块 test import test test.test() from imp import * #重新加载模块 reload(test) #更新test模块 test.test() # 运行结果 ['/Users/xiaoge/Downloads/python学习进度/02.核心/01.Python高级编程/01.python高级1', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python35.zip', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/lib-dynload', '/Users/xiaoge/Library/Python/3.5/lib/python/site-packages', '/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages', '/home'] ----1---- ----2---- ----1---- ----2---- -
模块循环导入问题
#两个模块相互导入 形成死循环导入 #例: ''' a模块 from b import b def a(): print("----1----") b() ''' ''' b模块 from a import a def b(): print("----b----") def c(): print("----c----") a() c() ''' -
==.is的作用
a = [11,22,33] b = [11,22,33] print(a == b) print(a is b) # ==:判断两个对象是否相等 # is:判断两个引用是否指向同一个对象(引用比较) # 运行结果 True False -
深拷贝和浅拷贝
#浅拷贝 a = [11,22,33] b = a print(a) print(id(a)) print(b) print(id(b)) print("----1----") #深拷贝 import copy c = copy.deepcopy(a) print(a) print(id(a)) print(c) print(id(c)) # 运行结果 [11, 22, 33] 4320184712 [11, 22, 33] 4320184712 ----1---- [11, 22, 33] 4320184712 [11, 22, 33] 4320633288 -
copy与deepcopy的区别
import copy # copy只拷贝一次 里面的不拷贝 a = [1,2,3] b = [4,5,6] c = [a,b] e = copy.copy(c) a.append(44) print(id(c)) print(c[0]) print(id(e)) print(e[0]) print("*************************") # deepcopy依次拷贝 a = [1,2,3] b = [4,5,6] c = [a,b] e = copy.deepcopy(c) a.append(44) print(id(c)) print(c[0]) print(id(e)) print(e[0]) # 运行结果 4329864008 [1, 2, 3, 44] 4329523528 [1, 2, 3, 44] ************************* 4329865096 [1, 2, 3, 44] 4329864008 [1, 2, 3] -
copy的特点
# copy 是可变类型我考一层 不是可变类型我一层都不考 import copy a = [1,2,3] b = [4,5,6] c = (a,b) print(id(c)) e = copy.copy(c) print(id(e)) # 运行结果 4330462856 4330462856 -
源码-反码-补码-类型转换
# 1的源码:0000 0000 0000 0001 #-1的源码:1000 0000 0000 0001 #-1的反码:1111 1111 1111 1110 #第一位是符号位 符号位不变别的取反 #-1的补码:1111 1111 1111 1111 #如何计算补码 #正数:源码=反码=补码 #负数:反码=符号位不变,其他位取反 # 补码=反码+1 #加-1直接加补码 #从源码变成补码 #-1+1 #相当于 1111 1111 1111 1111--->0000 0000 0000 0000 +1 #负数补码转换成源码: 源码 = 补码的符号不变 --> 数据位取反 --->尾+1 #从补码变成源码 #一样 1111 1111 1111 1111--->0000 0000 0000 0000 +1 #进制转换 #18转换成2进制 print(bin(18)) #18转换成8进制 print(oct(18)) #18转换成16进制 print(hex(18)) #转成十进制 #二进制转10进制 print(int('0b10010',2)) #八进制转10进制 print(int('022',8)) #十六进制转10进制 print(int('0x12',16)) # 运行结果 0b10010 0o22 0x12 18 18 18 -
位运算
#左移右移 a = 5 a = a << 1 #左移一位乘以2 print(a) a = a >> 1 #右移一位除以2 print(a) #按位与 & #案例:1001101 # 1010111 #结果为: 只要有一位是0那就是0 # 1000101 num = 0b1001101 print(num&0b1010111) #按位或 | #案例:1001101 # 1010111 #结果为: 只要有一位是1那就是1 # 1011111 print(num|0b1010111) #按位异或 ^ #案例:1001101 # 1010111 #结果为: 只要不相同时,那就是1 # 0011010 print(num^0b1010111) #按位取反 ~ #案例:1001101 #结果为:是1就是0,是0就是1 # 0110010 print(~num) # 运行结果 10 5 69 95 26 -78 -
私有化
class Test(object): def __init__(self): self.__num = 100 #这里带下划线的变量是私有的 def setNum(self): self.__num = 200 def getNum(self): return self.__num #私有属性访问不了的原因是,它把你这个私有属性的名字改了 你可以用dir(实列对象)查看 #这个Test里的私有属性__num 被 改成_Test(类名)__num test = Test() #print(test.__num) #私有属性不能直接调用 print(test.getNum()) test.setNum() print(test.getNum()) #test.__num = 200 #添加属性的时候是可以用下划线的 #print(test.__num) #这样是可以的 因为你上面定义了一个__num属性 == 200 # 运行结果 100 200 -
property
class Test(object): def __init__(self): self.__num = 100 #这里带下划线的是私有属性 def setNum(self,num_temp): self.__num = num_temp def getNum(self): return self.__num num = property(getNum,setNum) #property根据你下面的实际场合 选择方法 t = Test() print(t.num) t.num = 10 #相当于 t.setNum(10) print(t.num)#相当于 print(t.getNum()) #注意点: #t.num 到底是调用getNum()还是setNum(),要根据实际场景来判断, #1.如果是给t.num赋值,那么一定调用setNum() #2.如果是获取t.num的值,那么就一定调用getNum() # #property的作用:相当于把方法进行了封装,开发者在对属性设置数据的时候更方便 # 运行结果 100 10 -
property-2
class Test(object): def __init__(self): self.__num = 100 #这里带下划线是私有属性 @property def num(self): #这个说明了 num替换了property 这里是num那么下面也必须是num return self.__num #并且是个getNum方法 @num.setter def num(self,num_temp): #这是setNum方法 self.__num = num_temp t = Test() print(t.num) t.num = 10 #相当于 t.setNum(10) print(t.num)#相当于 print(t.getNum()) # 运行结果 100 10 -
siyou
#如果这个模块是被 from siyou import * _num2 和 __num3 是导入不进去的 #import siyou 和 from siyou import _num2,__num3 是可以导入的 num1 = 100 _num2 = 200 __num3 = 300
浙公网安备 33010602011771号