python 高階知識

  1. python運行原理
    使用cpython解釋器創(chuàng)建棧幀(堆)寨昙,建立上下文装获,字節(jié)碼對象
    由于棧幀分配在內(nèi)存中篙梢,所以棧幀可以獨立于調(diào)用者存在吼砂,即使調(diào)用完畢依然可以訪問
import dis
dis.dis(object) #查看棧幀
------------
def foo(): bar()
def bar(): 
     global frame
     frame = inspect.currentframe()
frame.f_back #調(diào)用函數(shù)  foo()
frame.f_code.co_name # 內(nèi)部執(zhí)行函數(shù)  bar()
  1. 迭代器對象逆航,可迭代對象
    迭代器 iter, next
    可迭代對象 iter, getitem
l = [1,2,3]
for i in l: print i
s = '2323'
for x in s: print x

可迭代對象得到迭代器對象
iter(l)
<listiterator at 0x...>
iter(l) 調(diào)用了 l.__iter__() 
---------
s.__getitem__() #獲取序列
----------
# 得到一個迭代器
t = iter(l) 
t.next()
-----------
#實現(xiàn)一個迭代器對象next
#實現(xiàn)一個可迭代對象__iter__方法返回一個迭代器對象
from collections import Iterable, Iterator
# 抽象接口
Iterator.__abstractmethods__ #next
Iterable.__abstractmethods__ #__iter__

#迭代器
class MyIterator(Iterator):
    def __init__(self, cities):
         self.cities  = cities
         self.index = 0
    def getcity(self, city):
         # 處理
         return city
    def next(self):
         if self.index == len(self.cities):
             raise StopIteration
         city = self.cities[self.index]
         """
         try:
              city = self.cities[self.index]
         except IndexError:
              raise StopIteration
         """
         self.index += 1
         return  self.getcity(city)

#可迭代對象
class MyIterable(Iterable):
     def __init__(self, cities):
          self.cities = cities
     def __iter__(self):
          return MyIterator(self.cities)
     #def __getitem__(self, item):
     #     return self.cities[item]

#實例化
for i in MyIterable(['beijing','xian']):
     print i
# for 實現(xiàn)
myIter = iter(MyIterable(['beijing','xian']))
while True:
     try:
          print next(myiter)
     except Stoplteration:
          pass
  1. 生成器(協(xié)程) yield 既有可迭代對象,又有迭代器的特性
    使用生成器函數(shù)實現(xiàn)可迭代對象
def f():
    print 'in f()', 1
    yield 1
    print 'in f()', 2
    yield 2

g = f() #生成器對象渔肩,在編譯字節(jié)碼的使用處理
g.next() #1
g.next() #2 
#Stopltreation
------------
for x in g:
     print x
------------
g.__iter__() is g # True
__iter__() 還是生成器類型因俐,使用yield進行迭代器next
------------
def fib(index):
     if index <= 2:
         return 1
     else:
          return fib(index-1) + fib(index-2)  #只有最后結果

def fib(index):
     ans = []
     n, a, b = 0,0,1
     while n < index:
          ans.append(b)
          a, b = b, a+b
          n += 1
     return ans

def fib2(index):
     n, a, b = 0,0,1
     while n < index:
          yield b  #得到每步的值
          a, b = b, a+b
          n += 1
for i in fib2(10):
     print i
--------------
def gen_func():
     yield 1
     print "hello"
gen = gen_func()
print gen.gi_frame.f_lasti  #記錄執(zhí)行最后位置,函數(shù)運行控制
print gen.gi_frame.f_locals  #維護著當前生成器中的屬性字段
image.png

image.png

生成器案例:看源碼 from collections import UserList
大文件讀取寫入數(shù)據(jù)庫, 100g周偎,只有一行抹剩,特殊分隔符;

def myreadline(f, newline):
     buf = ""
     while True:
          while newline in buf:
             pos = buf.index(newline)
             yield = buf[:pos]
             #解析讀取文件過長
             buf = buf[pos+len(newline):]
          chunk = f.read(4096)
          # 文件結尾
          if not chunk:
              yield buf
              break
          # 讀取短
          buf += chunk
        
with open('a') as f:
     for line in myreadline(f, '{|}'):
         print line
  1. 線程(io密集)蓉坎,進程(cpu密集)澳眷,gil(global interpreter lock 全局解釋鎖),協(xié)程
    GIL: 一個線程對應c語言一個線程 cpython
    同一時刻只有一個線程在一個cpu上執(zhí)行字節(jié)碼蛉艾,無法多個線程映射多個cpu钳踊,為了保障線程安全,但不是絕對勿侯,因為gil對于cpu的占用會有釋放(根據(jù)字節(jié)碼行數(shù)|時間片)拓瞪,io操作會釋放
    https://zhuanlan.zhihu.com/p/110406882
    http://www.dabeaz.com/python/UnderstandingGIL.pdf
    死鎖:1. 不釋放 2. 資源競爭
    demo:
#加鎖 from threading import Lock,RLock 
#可重入的鎖,同一個線程里可以助琐,可以多次調(diào)用acquire,配合使用release
#lock = Lock()
total = 0 
def add():
     global total
     # global lock
     for i in range(1000000):
          #lock.acquire()
          total += 1
          #lock.release() #不釋放死鎖

def desc():
     global total
     #加鎖
     for i in range(1000000):
          total -= 1

import threading
t1 =threading.Thread(target=add)
t2 =threading.Thread(target=desc)
t1.start()
t2.start()
t1.join()
t2.join()
#total 隨機

還有線程同步祭埂,線程池,進程通信兵钮,進程池

線程:threading
    thread = threading.Thread(target=test)
    thread.start()
    thread.join()
進程:mutilprocess
    jobs = []
    for i in range(5):
        p = multiprocessing.Process(target=worker, args=(i,))
        jobs.append(p)
        p.start()

協(xié)程:

  1. 阻塞(函數(shù)調(diào)用蛆橡,函數(shù)被當前線程掛起)舌界,非阻塞(立即返回),并發(fā)航罗, 并行禀横,同步(發(fā)送消息,等待IO)粥血,異步

  2. IO多路復用 socket柏锄,select,epoll复亏,poll
    io模型:阻塞io趾娃,非阻塞io, io多路復用,信號驅動io缔御,異步io

  3. 匿名函數(shù)lambda

  4. 列表表達式

  5. 裝飾器 *args *kargs
    為多個函數(shù)添加同一個功能

def fib(n):
     if n <=1:
          return 1
     return fib(n-1) + fib(n-2)
----------
def fib(n):
    if cache is None:
         cache = {}
     if n in cache:
          return cache[n]
    if n <= 1:
        return 1:
     cache[n] = fib(n-1, cache) + fib(n-2, cahce)
     return cache[n]
------
def memo(func):
    cache = {}
    def warp(*args):
        if args not in cache:
             cache[args] = func(*args)
        return cache[args]
     return warp

#fib = memo(fib)
@memo
def fib(n):
     ...
9-4_Moment.jpg
  1. 單例模式
class single(object):
     _instances = None
     def __new__(cls, *args, **kargs):
         if cls._instances is None:
             cls._instances = object.__new__(cls, *args, **kargs)
             return cls._instances
     def __init__(self):
         pass
  1. 類的加載
  2. 常用庫 requests, collections, re, MySQLdb,
    https://docs.python.org/zh-cn/3.7/library/index.html
  3. 常用框架 celery , django
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抬闷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子耕突,更是在濱河造成了極大的恐慌笤成,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件眷茁,死亡現(xiàn)場離奇詭異炕泳,居然都是意外死亡,警方通過查閱死者的電腦和手機上祈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門培遵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人登刺,你說我怎么就攤上這事籽腕。” “怎么了纸俭?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵皇耗,是天一觀的道長。 經(jīng)常有香客問我揍很,道長廊宪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任女轿,我火速辦了婚禮,結果婚禮上壕翩,老公的妹妹穿的比我還像新娘蛉迹。我一直安慰自己,他們只是感情好放妈,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布北救。 她就那樣靜靜地躺著荐操,像睡著了一般。 火紅的嫁衣襯著肌膚如雪珍策。 梳的紋絲不亂的頭發(fā)上托启,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音攘宙,去河邊找鬼屯耸。 笑死,一個胖子當著我的面吹牛蹭劈,可吹牛的內(nèi)容都是我干的疗绣。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼铺韧,長吁一口氣:“原來是場噩夢啊……” “哼多矮!你這毒婦竟也來了?” 一聲冷哼從身側響起哈打,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤塔逃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后料仗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體湾盗,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年罢维,在試婚紗的時候發(fā)現(xiàn)自己被綠了淹仑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡肺孵,死狀恐怖匀借,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情平窘,我是刑警寧澤吓肋,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站瑰艘,受9級特大地震影響是鬼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜紫新,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一均蜜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧芒率,春花似錦囤耳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽德玫。三九已至,卻和暖如春椎麦,著一層夾襖步出監(jiān)牢的瞬間宰僧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工观挎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留琴儿,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓键兜,卻偏偏與公主長得像凤类,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子普气,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容