程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> 第 4 天 迭代器、生成器、裝飾器、正則表達式

第 4 天 迭代器、生成器、裝飾器、正則表達式

編輯:Python

一、迭代器

迭代器 適合遍歷一些巨大或無限的集合,如幾個G的文件!

迭代器的特點:

1、訪問者不用關心迭代器的內部結構,僅需要通過next()方法不斷地去取下一個內容! 2、不能隨機訪問集合中的,某個值,只能從頭到尾訪問! 3、訪問到一半時不能往回退! 4、便於循環比較大的數據集合,節省了內存!
 >>> name = iter(['jiac','piter','kuga']) ##創建一個迭代器
 >>> name.__next__()
 'jiac'
 >>> name.__next__()
 'piter'
 >>> name.__next__()
 'kuga'
 >>> name.__next__()##當遍歷完集合中的元素後!
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 StopIteration
 >>>

 

二、生成器

一個函數被調用時返回一個迭代器,那這個函數就叫生成器(generator); 如果函數中包含yield語法,那這個函數就會變成生成器!
  生成器cash_miney                                      
  def cash_money(arg):                                  
      while arg > 0:                                    
          arg -= 100                                    
          yield 100                                     
          print("來要錢了!")                           
                                                        
  a = cash_money(500)                                   
  print(type(a))                                        
 ## 返回迭代器                                          
 print(a.__next__()) #100                               
 print(a.__next__()) #100                               
 print(a.__next__()) #100                               
 print(a.__next__()) #100                               
 print(a.__next__()) #100                               
 print(a.__next__())#執行時報錯如下:(迭代完成後)        
 Traceback (most recent call last):                     
   File "F:/51python/day4/demo.py", line 16, in <module>
     print(a.__next__())                                
 StopIteration                                          

yield實現單線程的異步並發:(串行的程序中實現並行的效果!)

 #消費者
 def consumer(name):
     print("%s准備吃包子!"%name)
     while True:
         b = yield ##接收send()方法的值
         print("包子[%s]來了!被[%s]吃了"%(b,name))
 
 #生產者
 def producer(name):
     c1 = consumer("A")
     c2 = consumer("B")
     c1.__next__() ##輸出yield的返回值
     c2.__next__() ##輸出yield的返回值
     print("老子開始准備做包子啦!")
     for i in range(10):
         time.sleep(1)
         print("已經做了2 個包子了!")
         c1.send(i) ##把i的值發送給yield
         c2.send(i) ##把i的值發送給yield
 
 producer("me")
 
 ###打印輸出如下:###
 A准備吃包子!
 B准備吃包子!
 老子開始准備做包子啦!
 已經做了2 個包子了!
 包子[0]來了!被[A]吃了
 包子[0]來了!被[B]吃了
 已經做了2 個包子了!
 包子[1]來了!被[A]吃了
 包子[1]來了!被[B]吃了
 已經做了2 個包子了!
 包子[2]來了!被[A]吃了
 包子[2]來了!被[B]吃了
 已經做了2 個包子了!
 包子[3]來了!被[A]吃了
 包子[3]來了!被[B]吃了
 已經做了2 個包子了!
 包子[4]來了!被[A]吃了
 包子[4]來了!被[B]吃了
 已經做了2 個包子了!
 包子[5]來了!被[A]吃了
 包子[5]來了!被[B]吃了
 已經做了2 個包子了!
 包子[6]來了!被[A]吃了
 包子[6]來了!被[B]吃了
 已經做了2 個包子了!
 包子[7]來了!被[A]吃了
 包子[7]來了!被[B]吃了
 已經做了2 個包子了!
 包子[8]來了!被[A]吃了
 包子[8]來了!被[B]吃了
 已經做了2 個包子了!
 包子[9]來了!被[A]吃了
 包子[9]來了!被[B]吃了

 

三、裝飾器

 def login(func):
     print("登陸驗證!")
 
 def login(func):
     print("登陸驗證!")
     return func ##返回內存地址!
 
 def tv():
     print("tv模塊!")
 
 tv()#結果
 tv #表示函數的內存地址!
 
 ##打印輸出###
 tv模塊!
 def login(func):
     print("登陸驗證!")
     return func ##返回內存地址!
 
 @login
 def tv(name):
     print("this [%s] pages"%name)
 
 tv("alex") ##結果
 
 ##打印輸出##
 登陸驗證!
 this [alex] pages
 def login(func):
     def inner(arg):
         print("登陸驗證!")
         func(arg)
     return inner ##返回內存地址!
 
 @login
 def tv(name):
     print("this [%s] is TV pages"%name)
 
 @login
 def move(name):
     print("this [%s] Move pages"%name)
 
 
 tv("alex") ##結果
 move('keke')
 
 ##打印輸出##
 登陸驗證!
 this [alex] is TV pages
 登陸驗證!
 this [keke] Move pages

算法之二分查找:

 def mid_search(data_source,find_n):
 
     mid = int(len(data_source)/2)
     if len(data_source) >= 1:
         if data_source[mid] > find_n:
             print("數據[%s]在右邊"%data_source[mid])
             mid_search(data_source[:mid],find_n)
         # print(data_source[:mid])
         elif data_source[mid] < find_n:
             print("數據[%s]在左邊"%data_source[mid])
             mid_search(data_source[mid:],find_n)
         else:
             print("found find_s",data_source[mid])
     else:
             print("cannot found find_s",data_source[mid])
 
 if __name__ == "__main__":
     data = list(range(1,6000000))
 
     mid_search(data,1) ##數據源,查找的值
 
 ##打印輸出##
 數據[3000000]在右邊
 數據[1500000]在右邊
 數據[750000]在右邊
 數據[375000]在右邊
 數據[187500]在右邊
 數據[93750]在右邊
 數據[46875]在右邊
 數據[23438]在右邊
 數據[11719]在右邊
 數據[5860]在右邊
 數據[2930]在右邊
 數據[1465]在右邊
 數據[733]在右邊
 數據[367]在右邊
 數據[184]在右邊
 數據[92]在右邊
 數據[46]在右邊
 數據[23]在右邊
 數據[12]在右邊
 數據[6]在右邊
 數據[3]在右邊
 數據[2]在右邊
 found find_s 1

四、遞歸操作

遞歸操作,自身調用自身的函數.

 def calc(arg):
     print(arg)
     if arg/2 >1:
         res = calc(arg/2) ##遞歸調用calc()函數自己
         return res ##
 
 calc(100)
 
 ##打印輸出##
 100
 50.0
 25.0
 12.5
 6.25
 3.125
 1.5625

 

五、正則表達式

(匹配規程,數據源) re.match(pattern,data_source)
 import re
 
 m = re.match("abc","abcdfe")
 
 print(m.group()) ##返回匹配的值
 
 ##打印輸出##
 abc
 
 m = re.match("[0-9][0-9]","41ab56cd") #匹配所有的數字
 #match 方法從頭開始匹配
 if m:
     print(m.group())
 
 ##打印輸出##
 41
 
 m = re.findall("[0-9]{0,10}","41ab56cd") #匹配所有的數字使用findall方法(匹配0次到10次)
 if m:
     print(m)
 
 ##打印輸出##
 ['41', '', '', '56', '', '', '']
 
 
 m = re.findall("[0-9]{1,10}","41ab56cd") #匹配所有的數字使用findall方法匹配1次到10次)
 if m:
     print(m)
 
 ##打印輸出##
 ['41', '56']
 
 m = re.findall("[a-zA-Z]{1,10}","41ab56cd") #匹配所有的字母使用findall方法
 if m:
     print(m)
 
 ##打印輸出##
 ['ab', 'cd']
 
 m = re.findall(".*","41ab56cd") #匹配所有的字符0次或多次使用findall方法
 if m:
     print(m)
 
 ##打印輸出##
 ['41ab56cd', '']
 
 m = re.findall("[a-zA-Z]+","41ab@#56。.cd") #匹配所有的字母一個或多個使用findall方法
 if m:
     print(m)
 
 ##打印輸出##
 ['ab', 'cd']
 
 m = re.search("@","41ab@#56。.cd") #匹配指定字符一個或多個使用search方法
 if m:
     print(m.group())
 
 ##打印輸出##
 @
 
 m = re.search("\d+","41ab@#56。.cd") #匹配所有的字符一個或多個使用findall方法
 if m:
     print(m.group())
 
 ##打印輸出##
 41
 
 m = re.sub("\d+","|","sad41ab@#56。.cd") #替換所有的數字一個或多個使用sub方法
 if m:
     print(m)
 
 ##打印輸出##
 sad|ab@#|。.cd
 
 m = re.sub("\d+","|","sad41ab@#56。.cd",count=1) #替換第一個含有數字的字符串,替換一次或多次使用sub方法
 if m:
     print(m)
 
 ##打印輸##
 sad|ab@#56。.cd
 
 
#匹配小數出## a = "-8.0*173545.88095238098"
 print(re.findall("\d+\.\d+",a))
   
 ##打印輸出##
 ['8.0', '173545.88095238098']

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved