day13:迭代器&高階函數(map,reduce,filter,sorted)

迭代器app

1.迭代器的定義: 能被next調用,並不斷返回下一個值的對象,叫作迭代器(對象)ssh

2.迭代器的概念:函數

  迭代器指的是迭代取值的工具,迭代是一個重複的過程,
  每次重複都是基於上一次的結果而繼續的,
  單純的重複並非迭代工具

3.迭代器的特徵: 並不依賴索引,而經過next指針迭代全部數據,一次只取一個值,大大節省空間spa

4.dir: 獲取當前類型對象中的全部成員指針

其中,裏面有一個魔術方法,叫作__iter__方法,code

__iter__方法用來判斷是不是可迭代性數據orm

setvar = {"a","b","c","d"}
lst = dir(setvar) # 獲取setvar對象中的全部成員
print(lst)
'''
['__and__', '__class__', '__contains__', '__delattr__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', 
'__getattribute__', '__gt__', '__hash__', '__iand__', '__init__',
'__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', 
'__le__', '__len__', '__lt__', '__ne__', '__new__', 
'__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__',
'__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', 
'__str__', '__sub__', '__subclasshook__', '__xor__', 'add',
'clear', 'copy', 'difference', 'difference_update', 'discard',
'intersection', 'intersection_update', 'isdisjoint', 'issubset',
'issuperset', 'pop', 'remove', 'symmetric_difference', 
'symmetric_difference_update', 'union', 'update']
'''

5.關於迭代器,須要注意的點:對象

for 循環可以遍歷一切可迭代性數據的緣由在於,底層調用了迭代器,經過next方法中的指針實現數據的獲取blog

可迭代對象(不能夠被next直接調用)  -> 迭代器(能夠被next直接調用的過程) 

一個可迭代對象不必定是迭代器

一個迭代器就必定是一個可迭代對象

 

6.定義一個迭代器

定義迭代器須要使用iter()方法

setvar = {"a","b","c","d"}
it = iter(setvar) # 將可迭代對象setvar變成了迭代器
print(it) # <set_iterator object at 0x000002142D1108B8>

7.判斷一個迭代器

迭代器必需要有__iter__方法和__next__方法

res = "__iter__" in dir(it) and "__next__" in dir(it)
print(res) #True

8.調用迭代器

next在調用迭代器中的數據時,是單向不可逆,一條路走到黑的過程

當沒有可迭代的數據後,拋出一個StopIteration的異常,而且中止迭代

setvar = {"a","b","c","d"}
it = iter(setvar) # 將可迭代對象setvar變成了迭代器
res = next(it)
print(res) # c
res = next(it)
print(res) # d
res = next(it)
print(res) # a
res = next(it)
print(res) # b
res = next(it)
print(res) # 當沒有可迭代的數據後,拋出一個StopIteration的異常,而且中止迭代

9.重置迭代器

重置迭代器,只須要再次調用iter()方法便可

it = iter(setvar) # 重置迭代器
res = next(it)
print(res)

10.使用其餘方式判斷是不是可迭代對象/迭代器

"""Iterator 迭代器 Iterable 可迭代對象"""
from collections import Iterator,Iterable
it = iter(setvar)
res = isinstance(it,Iterator)
print(res)
res = isinstance(it,Iterable)
print(res)

11.除了next(),也可使用如下兩種方式調用迭代器中的數據

# 1. for 循環
print("<=>")
for i in it:
    print(i)

# 2. for + next
print("<=>")
lst = [1,2,3,4,5,6,7,7,8,9,10]
it = iter(lst)
for i in range(10):
    res = next(it)
    print(res)

print(next(it))
print(next(it))

高階函數

高階函數的定義:可以把函數當成參數傳遞的就是高階函數

經常使用的四大高階函數:map filter reduce sorted

1.map

map(func,Iterable)
  功能:處理數據
    把Iterable中的數據一個一個拿出來,扔到func函數中作處理
    把處理以後的結果放到迭代器當中,最後返回迭代器
  參數:
    func : 自定義函數 或 內置函數
    Iterable : 可迭代性數據(容器類型數據 range對象 迭代器)
  返回值:
    迭代器

示例1:將["1","2","3","4"]轉化成[1,2,3,4]

常規寫法:

lst = ["1","2","3","4"]
# 常規寫法
lst_new = []
for i in lst:
    lst_new.append(int(i))
print(lst_new)

用map改造的寫法:

# map改造
it = map(int,lst) # it是一個map對象
print(list(it)) # [1,2,3,4]

map(int,lst)的實現過程:

  首先把"1" 扔到int當中作處理,將強轉後的結果扔到迭代器中
  而後把"2" 扔到int當中作處理,將強轉後的結果扔到迭代器中
  而後把"3" 扔到int當中作處理,將強轉後的結果扔到迭代器中
  而後把"4" 扔到int當中作處理,將強轉後的結果扔到迭代器中
  最終返回迭代器

獲取迭代器中的數據的方法:1.next()  2.for循環遍歷  3.for+next  4.list(it)強轉

 

示例2:[1,2,3,4] => [2,8,24,64]

# map改造
'''參數和返回值return必定要寫'''
def func(n):
    return n << n 
lst = [1,2,3,4]    
it = map(func,lst)
print(list(it))

# lambda + map 
it = map(lambda n : n << n , lst)
print(list(it))

示例3:dic = {97:"a",98:"b",99:"c"} # ["a","b","c"] => ascii [97,98,99]

# map改造
def func(n):
    # 原字典
    dic = {97:"a",98:"b",99:"c"}
    # 新字典
    dic_new = {}
    # 遍歷原字典
    for k,v in dic.items():
        # 更換鍵值對
        dic_new[v] = k
    print(dic_new) # {'a': 97, 'b': 98, 'c': 99}
    # 經過鍵來獲取值
    return dic_new[n]
    
lst = ["a","b","c"]
it = map(func,lst)
print(list(it))

2.filter

filter(func,iterable)
  功能: 過濾數據
    return True 當前這個數據保留
    return False 當前這個數據捨棄
  參數:
    func : 自定義函數
    iterable : 可迭代型數據(容器類型數據,range對象,迭代器)
  返回值:
    迭代器

lst = [1,2,3,4,5,6,7,8,9,10]

# 常規寫法
lst_new = []
for i in lst:
    if i % 2 == 0:
        lst_new.append(i)
        
print(lst_new)

# filter改寫
def func(i):
    if i % 2 == 0:
        return True
    else:
        return False
it = filter(func,lst)

# filter + lambda 改寫
it = filter(lambda i : True if i % 2 == 0 else False , lst )
print(list(it))

3.reduce

reduce(func,iterable)

  功能:計算數據
    先把iterable中的前兩個值拿出來,扔到func當中作運算,
    把計算的結果和iterable中的第三個元素在扔到func當中作運算,
    再把結果算出來,和第四個元素作運算,以此類推
    直到全部結果運算完畢.返回該結果
  參數:
    func : 自定義函數
    iterable : 可迭代型數據(容器類型數據,range對象,迭代器)
  返回值:
    計算以後的結果

示例1:lst = [5,4,8,8]  => 整型5488

常規寫法1:

strvar = ""
for i in lst:
    strvar += str(i)
print(strvar , type(strvar))
res = int(strvar)
print(res , type(res))

常規寫法2:

from collections import Iterator,Iterable
lst = [5,4,8,8]
it = iter(lst)
print(isinstance(it , Iterator)) # True
print(isinstance(it , Iterable)) # True

num1 = next(it) # 5
num2 = next(it) # 4
num = num1 * 10 + num2 # 54

for i in it:
    num = num * 10 + i # 54*10+8=548  548*10+8=5488
print(num, type(num)) # 5488 <class 'int'>

reduce改造:

def func(x,y):
    return x*10 + y
lst = [5,4,8,8]
res = reduce(func,lst)
print(res , type(res))

reduce(func,lst)實現的過程:

先拿出5和4兩個元素,扔到func當中作運算,結果是54
在拿54和8兩個元素,扔到func當中作運算,結果548
在拿548和8兩個元素,扔到func當中作運算,結果5488
返回最終的結果: 5488 程序結束

 

reduce+lambda:

res = reduce(lambda x,y:x*10+y,lst)
print(res)

示例2:"789"=>789 禁止使用int強制轉換

def func1(x,y):
    return x*10 + y
def func2(n):
    dic = {"0":0,"1":1,"2":2,"3":3,"4":4,"5":5,"6":6,"7":7,"8":8,"9":9}
    return dic[n]
it = map(func2,"789") # [7,8,9]
res = reduce(func1,it)
print(res,type(res))

4.sorted

sorted(iterable,key=函數,reverse=False)
  功能:排序
  參數:
    iterable:可迭代型數據(容器類型數據,range對象,迭代器)
    key :指定自定義函數或內置函數
    reverse :表明升序或者降序 , 默認是升序(從小到大排序) reverse=False
  返回值:
    排序後的結果

# 1.默認是從小到大排序
lst = [1,2,3,4,5,-90,-4,-1,100]
res = sorted(lst)
print(res)

# 2.reverse 從大到小排序
res = sorted(lst,reverse=True)
print(res)

# 3.指定函數進行排序
# 按照絕對值排序 abs
lst = [-10,-1,3,5]
res = sorted(lst,key=abs)
print(res)

# 4.使用自定義函數進行排序
lst = [19,21,38,43,55]
def func(n):
    return n % 10
lst = sorted(lst,key=func)
print(lst)

sort和sorted的區別:

(1) sorted能夠排序一切容器類型數據, sort只能排列表
(2) sorted返回的是新列表,sort是基於原有的列表進行修改
(3) 推薦使用sorted

相關文章
相關標籤/搜索