python核心心得筆記
一.模塊重新導入
1.當你導入的模塊(.py文件)時,系統怎麽查找呢?
import sys
sys.path #顯示的是你導入模塊時,系統查找模塊的路徑
2.當你導入模塊不在系統路徑下,怎麽辦?
import sys
sys.path.append("你模塊所在的路徑")
3.當你導入A模塊後,A模塊裏面新增功能。你是用不了的,除非是重新導入模塊。怎麽辦?
from imp import *
reload(A) #相當於重新加載這個模塊
二. == is
==用於判斷數值是否相等
is用於判斷是否指向同一個地址
三.深拷貝和淺拷貝
1.深拷貝:拷貝的是所指向內存空間的內容
import copy
copy.deepcopy()
2.淺拷貝:淺拷貝僅僅是拷貝內存空間地址,不拷貝內容(不可變類型)
淺拷貝只會拷貝第一層。如果裏面還有引用,它是不會拷貝的(可變類型)
import copy
copy.copy()
四.私有化
1.x_:僅僅是避免和python關鍵字重復
2._x: 在模塊中定義,但是別人導入模塊調用不來。除非使用 import 模塊名 模塊名._x
3.__x__:系統中的方法
五.property屬性
property屬性會將方法封裝。僅僅方便開發者設置數據
第一種: property(getNum,setNum)
class Test(object):
def __init__(self):
self.__num = 100
def setNum(self,num):
self.__num = num
def getNum(self):
return self.__num
num = property(getNum,setNum)
t = Test()
t.num = 200 #t.setNum(200)
print(t.num)
第二種: @property設置在getNum方法上
@num.setter
六.生成器
它就是一個保存特殊數值的算法,什麽時候用什麽時候執行.
1.第一種方法:
a = (i for i in range(10))
2.第二種方法:
在函數裏面加上關鍵字yield.但是next()函數執行的時候取數值,碰到yield 就停止執行。下一next()函數會從上次停止的地方繼續執行
第一種方法要想取裏面的數值,需要next(a)一個個去取。取到最後就報錯了,所以推薦for循環去取.
註意:next() 等價於 生成器對象.__next__()
def creatNum():
print("---start---")
a,b = 0,1
for i in range(10):
print("---1---")
yield b
print("---2---")
a,b = b,a+b
print("---3---")
print("---end---")
#創建生成器對象
a = creatNum()
for num in a:
print(num)
七.可叠代對象 iterable
1.凡是能用for循環出來的都是可叠代對象 比如:列表,字典,生成器
2.判斷是否是可叠代對象Iterable,用isinstance()。前提是 from collections import Iterable
3.如果一個對象實現了__iter__方法,那麽這個對象也是可叠代對象
八.叠代器
主要作用是列表占用大量內存,當你想用的時候轉化成叠代器。
1.可以被next()函數調用並且不斷返回數值 就是叠代器
2.可以用isinstance()判斷是否是叠代器Iterator
3.如果不是叠代器對象,可以使用iter()函數轉換成叠代器
九.作用域
1.命名空間:在一段生效的範圍就是命名空間
2.globals:在當前命名空間查找所有全局變量
3.locals:在當前命名空間查找所有局部變量
4.LEGB原則: python找變量順序遵循legb原則
l:locals
e:閉包函數
g:global
b:builtin 內嵌。python解釋器自帶一些常用的東西
十.元類
實例對象是由class創建的,那麽創建class的type叫做元類.
1.類也是對象
2.使用type創建類
type(類名,繼承的父類名,{屬性})
3.如何驗證type是元類?
類名.__class__
十一.垃圾回收
1.小整數對象池
小整數在-5到256之間,python已經開辟內存空間進行存儲了。不需要在創建對象
2.大整數對象池
不在小整數範圍內的,每次使用都要創建對象
3.intern機制
a= "hello"
b= "hello"
那麽a,b都指向同一內存地址,共用一份
如果裏面包含特殊字符,那麽每份地址空間不同
4.gc垃圾回收
引用計數機制為主,隔代回收機制為輔.
1.引用計數機制: python代碼執行是由python解釋器來完成的.python解釋器主要是由c語言來編寫的,在編寫的代碼裏有一句語句 int = ob_refcnt 表示計數。如果為0表示生命周期結束了
2.隔代回收主要是解決引用計數解決不了的循環問題。
隔代回收主要由 0 1 2三條鏈組成
第一條鏈子主要放剛創建的所有對象。
主要通過減1,如果為0。則去清理。減1的前提是第一條鏈子有相互引用,那麽減1.如果對象之間不存在互相引用,那麽扔到第二條鏈子裏去
第二條鏈子存放第一條清理完畢後剩下的對象.
第三條鏈子存放第二條清理完畢後剩下的對象.
十二.gc模塊
1.引用計數+1的情況
對象被當作參數 func(a)
對象被創建 a = 100
對象被引用 b = a
2.引用計數-1的情況
對象被當作參數傳入函數中,函數執行完畢
對象被清空. del a
3.gc.threshold(). 結果是(700,10,10)
700:表示創建對象的數值-回收的對象數>700。那麽開始清理第一次鏈條
10 :如果清理第一次鏈條的數值達到10次時,那麽也要清理第二次鏈條和第一次鏈條
10 :如果清理第二次鏈條數值達到10次,那麽清理第一次和第二次和第三次鏈條
4.gc.get_count() 表示你去不去清理時候的那個數值。 結果是三個數值。第一個數值如果大於700,那麽清理第一個鏈條 第二數字大於10 清理第一和第二個鏈條
十三.內建屬性
1.__getattribute__屬性
只要你去調用屬性,就會調用getattribute方法! 禁止在getattribute中再次調用self.xxx。 如果你想讓屬性夠到方法,那麽直接return object.__getattribute__(self,obj) 就可以了
十四.集合
set 返回值是{}類型。它除了有去重還有其他功能
1.交集
a&b
2.並集
a|b
3.差集
a-b
十五.內建方法
1.range() 在python2中返回時列表 在3中返回叠代值
2.filter() 主要作用對指定序列進行篩選,返回值為true就打印出來
3.map()主要作用是相對映射。給你一個數值,你給我返回一個
4.reduce()用於兩個數相加.
5.sort()主要是用於排序。從小到大排序。如果括號裏面有reverse = True 則表示按照從大到小排序
6.sorted()主要作用也是按照從小到大排序。如果括號裏面reverse = 1 則表示從大到小排序
十六.functools
1.partial函數 是偏函數。 相當於第一次給數值之後一直都存在
2.wraps函數 用於消除閉包副作用
python核心心得筆記