python之迭代器產生器和內建函數,匿名函數

來源:互聯網
上載者:User

標籤:強制   字典   exp   遞迴   程式   key   zip   參數   啟用   

  今天學習了迭代器產生器以及內建函數和匿名函數,說實話有些懵圈,有些難度了。

  

一、迭代器和產生器
1、如何從列表、字典中取值的:
index索引
for迴圈
凡是可以使用for迴圈取值的都是可迭代的
(1)可迭代協議:內部含有__iter__方法的都是可迭代的
(2)迭代器協議:內部含有__iter__方法和__next__方法的都是迭代器
什麼是可迭代的:內部含有__iter__方法的都是可迭代的
什麼是迭代器:迭代器=iter(可迭代的),內建一個__next__方法
可迭代最大的優勢:節省記憶體
py2中的range不管range多少,會產生一個列表,這個列表將用來儲存所有值
py3中的range不管range多少,都不會實際的產生任何一個值
判斷是否可迭代或是否為迭代器:
from collections import Iterable,Iterator
print(range(10000))
print(isinstance(range(10000),Iterable))是否為可迭代
print(isinstance(range(10000),Iterator))是否為迭代器
迭代器的優勢:
節省記憶體
去一個值就能進行接下來的計算,而不需要等到所有的值都 計算出來才開始接下來的運算--速度快
迭代器的特性:惰性運算
2、產生器(Generator)
自己寫的迭代器就是一個產生器
兩種自己寫產生器(迭代器)的機制:產生器函數,產生器運算式
(1)產生器函數:
def cloth_g(num):
  for i in range(num):
  yield ‘cloth%s‘%i

g = cloth_g(100)
print(next(g))
print(next(g))
凡是帶有yield的函數就是一個產生器函數
yiled記錄當前所在的位置,等待下一次next來觸發函數的狀態
產生器函數的調用不會觸發代碼的執行,而是會返回一個產生器(迭代器)
想要產生器函數執行,需要用next。
使用產生器監聽檔案輸入的例子
import time
def listen_file():
  with open(‘file‘) as f:
    while True:
      line = f.readline()
      if line.strip():
        yield line.strip()
      time.sleep(0.1)
g = listen_file()
for line in g:
  print(line)
send關鍵字:在執行next的過程中傳遞一個參數給產生器函數的內部
想產生器中傳遞值,有一個啟用過程,第一次必須使用next觸發這個產生器
如何從產生器中取值
(1)next隨時都可以停止,最後一次會報錯
(2)for迴圈從頭到尾遍曆一次,不遇到break、return不會停止
(3)list tuple資料類型的強轉,會把所有的資料都載入到記憶體,浪費記憶體
產生器函數是我們python程式員實現迭代的一中手段
主要特徵是在函數中含有yield
調用一個產生器函數不會執行這個函數中的代碼,只會獲得一個產生器(迭代器)
只有從產生器中取值的時候,才會執行函數內部的代碼,且每擷取一個資料才執行得到這個資料代碼
擷取資料的方式包括next、send迴圈,資料類型的強制轉化
yield傳回值的簡便方法,如果本身就是迴圈一個可迭代的,且要把可迭代資料中的每一個元素都返回,可以用yield from
使用send的時候,在產生器創造出來之後需要進行預激,這一步可以使用裝飾器完成
產生器特點:節省記憶體,惰性運算
產生器用來解決記憶體問題和程式功能之間的解耦
3、產生器運算式,在龐大資料量的時候使用產生器運算式
list = (out_exp_res for out_exp in input_list if out_exp == 2)
列表推導式,排序的時候用
list = [out_exp_res for out_exp in input_list if out_exp == 2]
out_exp_res:列表產生元素運算式,可以是有傳回值的函數
for out_exp in input_list:迭代input_list將out_exp傳入out_exp_res運算式中
if out_exp == 2:根據條件過濾哪些值可以返回
(1)一個產生器只能取值一次
(2)產生器在不找它要值的時候始終不執行
(3)當他執行的時候,要以執行時候的所有變數值為準


二、內建函數和匿名函數
1、內建函數:
callable(o),o是參數,看這個變數是不是可調用。o是函數名返回Ture
dir()查看一個變數鎖擁有的所有名字
bin():二進位,oct()八進位,hex()十六進位
abs():計算絕對值
divmod():求商和餘數(商餘函數)
enumerate():顯示元素的索引
eval():提取執行
pow():pow(2,3,3) #(2**3)%3對2的三次方取餘
reversed():將列表倒序輸出
.sort():按升序排列
round():預設取整,小數精確,四捨五入
__import__:通過字串導模組
id(o) o是參數,返回一個變數的記憶體位址
hash(o) o是參數,返回一個可hash變數的雜湊值,不可hash的變數被hash之後會報錯。
sum():求和運算
min():計算最小值
max():計算最大值
print(ord(‘a‘))輸入字元找該字元編碼的位置 a-z 97+26
print(chr(97))輸入位置數字找出其對應的字元 A-Z 65+26
ascii:是ascii碼中的返回該值,不是就返回/u
format(‘列印元素‘,‘<20‘):<靠左對齊,>靠右對齊,^置中對齊
repr():返回一個對象的string形式(原形畢露)
enumerate:枚舉接收兩個參數:一個容器類型,一個序號起始值
all():可迭代對象中,全部是Ture才是Ture
any():可迭代對象中,有一個Ture就是Ture
for i in zip():函數用於將可迭代的對象作為參數,將對象中對應的元素大包成一個個元組,然後返回這些元組組成的列表,列表長度與最短的相同
print(self, *args, sep=‘ ‘, end=‘\n‘,file=None,flush=T/F)
file:預設輸出到螢幕,如果設定為檔案控制代碼,輸出到檔案
sep:列印多個值之間的分隔字元,預設為空白格
end:每一次列印的結尾,預設為分行符號
flush:立即把內容輸出到流檔案,不作緩衝
hash雜湊
(1)對可hash的資料類型進行hash之後會得到一個數字
(2)在一次程式的執行過程中,兌相同的可雜湊變數雜湊之後結果永遠相同
(3)在一次程式的執行過程中對不相同的可雜湊變數雜湊之後結果幾乎總是不相同的
(4)hash字典底層的儲存和set集合的去重機制都相關
filter():過濾元素
map:def func(num):
    return num ** 2
  for i in map(func,range(10)):print(i)
sorted(l,key=...):排序
2、匿名函數
lambda:匿名函數關鍵字:函數名 = lambda 參數:傳回值
calc<函數名> = lambda<定義匿名函數關鍵字> n<參數>:n**n<傳回值>
print(calc(10))

三、遞迴調用:
1、遞迴調用在調用一個函數的過程中,直接或間接又調用該函數本身,稱之為遞迴調用
遞迴必備兩個階段:1、遞推 2、回溯
2、遞迴調用必須要有一個明確的結束條件
3、每次進入更深一層遞迴時,問題規模相比上次遞迴都應有所減少
4、遞迴效率不高
修改遞迴最大深度
import sys
print(sys.setrecursionlimit(1000))

四、二分法
l = [18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(l,num):
  mid = len(l) //2 #中間截取
  if num > l[mid]: #判斷所傳數字是否大於mid
    func(l[(mid)+1:],num) #大於從中間往後找
  elif num < l[mid]: #判斷所傳數字是否小於mid
    func(l[0:(mid)],num) #大於從中間往前找
  else:print(‘find it‘)
func(l,66)

python之迭代器產生器和內建函數,匿名函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.