1. 程式人生 > >python之叠代器生成器和內置函數,匿名函數

python之叠代器生成器和內置函數,匿名函數

提取 gen sys 狀態 elf 返回 led rip 獲取

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

  

一、叠代器和生成器
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之叠代器生成器和內置函數,匿名函數