Python 基礎之匿名函數 迭代器和高階函數

一.匿名函數 lambda表達式

用一句話來表達只有返回值的函數,叫匿名函數
特色:簡潔方便
語法:
lambda 參數: 返回值app

1.不帶有參數的lambda表達式

def func():
    return "今天要下雨,天氣挺冷"

#定義一個lambda表達式
func = lambda : "今天要下雨,天氣挺冷"
res = func()
print(res)函數

2.帶有參數的lambda表達式

def func(n):
    return type(n)

func = lambda n : type(n)
res = func(6)
print(res)

def func(n):
    print(n)
res = func(6)
print(res)
res = print(6)
print(res)

func = lambda n : print(n)
res = func(13)
print(res)優化

3.帶有條件分支的lambda表達式

三門運算符:
語法:
真值if條件表達式else 假值
若是條件表達式是真的,返回真值
若是條件表達式是假的,返回假值(else 後面跟的值)

#1:
res = 15 if 5>3 else 6
print(res)
#結果爲: 15
#2:spa

def func(n):
    if n % 2 == 0:
        return "偶數"
    else:
        return "奇數"

n = 15
res = "偶數" if n % 2 == 0 else "奇數"
print(res)

func = lambda n : "偶數" if n % 2 == 0 else "奇數"
res = func(15)
print(res)
#3:
#把兩個值當中較大的數返回出來
def func(x,y):
    if x>y:
        return x
    else:
        return y

func = lambda x,y : x if x>y else y
res = func(3,5)
res = func(3,5)
print(res)對象

 

 

二.迭代器

定義:可以被next 調用,並不斷返回下一個值得對象,叫迭代器(迭代器時對象)
特徵:迭代器會生成惰性序列,它經過計算把值一次的返回,一遍虛幻一遍計算而不是一次性獲得全部數據
優勢: 須要數據的時候,一次取一個,能夠大大節省內存空間,而不是一股腦的把全部數據放進內存

總結:
    1.惰性序列,節省內存空間
    2.遍歷獲取值的時候使用next,方向不可逆
    3.迭代器能夠遍歷無線量大的數據
排序

1.可迭代對象

'''__iter__'''
setvar = {"one",22,"dhqoh",798}
for i in setvar:
    print(i)

#print(dir(setvar))
print("__iter__" in dir(setvar))
#next(setvar)
#for 循環遍歷setvar 這個數據時,先把setvar變成迭代器,並進行取值
內存

2.迭代器

可迭代對象 -> 迭代器 | 不能直接調用 -> 可直接調用
__iter__ __next__ 都包含在當前數據類型當,就是迭代器
若是變成一個迭代器?
    (1)next 能夠調用  (推薦)
    (2)__next__() 也能夠調用
 #:
servar = {"one",13,"aa",56}
it1 = iter(setvar)
print(it1)
res = next(it1)
print(res)
res = next(it1)
print(res)
res = next(it1)
print(res)
res = it1.__next__()
print('============================')
print(res)
#若是調用時,超出了正常的數據範圍,會報越界錯誤.StopIteration
#res = next(it1)
#print(res)

#判斷是不是迭代器
listvar = dir(it1)
print(listvar)
print("__iter__" in listvar and "__next__" in listvar)it

3.判斷是不是迭代器或可迭代對象

#from ...import 從哪裏模塊..引入...
#collections (模塊) Iterator 迭代器模型 Iterable 可迭代對象類型
from collections import Iterator,Iterable
setvar = {"one",14,"dd",80}
res = isinstance(setvar,Iterator)
print(res)
res = isinstance(setvar,Iterable)
print(res)

#判斷range對象的迭代屬性
for i in range(9):
    print(i)

#res = next(range(9))
res1 = isinstance(range(9),Iterable)
print(res1)
res2 = isinstance(range(9),Iterator)
print(res2)

若是是一個迭代器,必定具有可迭代性屬性
若是是可迭代對象,不必定是迭代器
#把range對象變成迭代器
print("----------------")
#iter  __iter__()
it2 = range(9).__iter__()
print(isinstance(it2,Iterator))
print(isinstance(it2,Iterable))io

4.配合for循環遍歷迭代器

for i in it2:
    print(i)

#迭代器在遍歷數據時,要注意方向不可逆
#next(it2)  #越界
#重置迭代器
print("==============")

it2 = iter(range(9))
for i in range(3):
    res = next(it2)
    print(res)

print(next(it2))
print(next(it2))class

 

三.高階函數

定義:可以把函數當成參數傳遞的就是高階函數(map reduce sorted filter)

1.map()

map(func,iterable)
功能:iterable裏面的數據一個個的拿出來放到func函數進行處理,最後把處理的結果返回到迭代器中
參數:
    func:自定義函數或內置函數
    iterable:可迭代性數據(經常使用:容器類型數據,range對象,迭代器)
返回值:迭代器

#:
#1.["1","2","3","4"] =>[1,2,3,4]
listvar = ["1","2","3","4"]
lst = []
for i in listvar:
    res = int(i)
    lst.append(res)
print(lst)
#下面是判斷it是都是可迭代性和是不是迭代器類型數據
from collections import Iterator,Iterable
it = map(int,listvar)
print(isinstance(it,Iterator))
print(isinstance(it,Iterable))
conut = 0
for i in it:
    conut += 1
    if conut == 2:
        break
    print(i)
#
#(2)使用next獲取迭代器中的數據
print("=============")
#next 調用迭代器中的數據,是單向不可逆,一條路走到黑
res = next(it)
print(res)
res = next(it)
print(res)
# res = next(it)
# print(res)
# res = next(it)
# print(res)

結果爲:

1

2

=============

3

4

#由於迭代器不可逆,因此留兩次給next()調用

#(2)使用next獲取迭代器中的數據
it2 = it
#next 調用迭代器中的數據,是單向不可逆,一條路走到黑
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)
res = next(it)
print(res)

#(3)使用list強轉迭代器(瞬間獲得迭代器中的全部數據)
res = list(it)
print(res)

#例2:.[1,2,3,4,5] => [1,4,9,16,25]
listvar = [1,2,3,4,5]
lst = []
for i in listvar:
    res = i**2
    lst.append(res)
print(lst)

#map 若是是自定義函數,必定要有返回值
代碼解析:
首先把listvar當中的第一個值1拿到func當中進行處理,返回1 扔到迭代器裏
而後把listvar當中的第二個值2拿到func當中進行處理,返回4扔到迭代器裏
而後把listvar當中的第三個值3拿到func當中進行處理,返回9扔到迭代器裏
...
依次類推,直到把列表裏面的數據所有拿完爲止.

listvar = [1,2,3,4,5]
def func(n):
    return n**2
it = map(func,listvar)
print(isinstance(it,Iterator))
listvar = list(it)
print(listvar)

#例3:.{97:"a",98:"b",99:'c',100:'d',101:"e"}  {"c","a","b"} => [99,97,98]
dic = {97:"a",98:"b",99:'c',100:'d',101:"e"}
dic2 = {}
for a,b in dic.items():
    dic2[b] = a
print(dic2)
lst = ["c","a","b"]
lst2 = []
#
for i in lst:
    res = dic2[i]
    lst2.append(res)
print(lst2)

def func(n):
    dic = {97:"a",98:"b",99:'c',100:'d',101:"e"}
    dic2 = {}
    for a,b in dic.items():
        dic2[b] = a

    return dic2[n]
it = map(func,["c","a","b"])
print(isinstance(it,Iterator))
lst = list(it)
print(lst)

 

2.reduce()

reduce(func,iterable)
功能:計算
    先把iterable中的前兩個數據拿出來,扔到func當中
    進行計算,把計算的結果在和iterrable當中的第三個數據扔到func
    進行計算,依次類推... ...
    直到iterbale中的數據所有拿出來爲止.
參數:
    func:內置函數 或者自定義函數
    iterable:可迭代性數據(經常使用:容器類型數據,range對象,迭代器)
返回值:
    計算最終的結果


#1:[5,4,8,8,] => 5488
#方法一:
lst = [5,4,8,8]
strvar = ''
for i in lst:
    strvar +=str(i)
print(strvar,type(strvar))
res = int(strvar)
print(res,type(res))

#方法二
'''

分析:
5*10 + 4 = 54
54*10 + 8 = 548
548*10 + 8 = 5488
'''
lst = [5,4,8,8]
it = iter(lst) #強轉成迭代器
num1 = next(it)
num2 = next(it)
total = num1 * 10 + num2
print(total)
for i in it:
    total = total*10 +i
print(total,type(total))

#法三:
#使用reduce實現
#from ..import 從哪一個模塊...導入...
#functools 是一個模塊文件(文件)
from  functools import reduce
lst = [5,4,8,8]
def func(x,y):
    return x*10 + y
res = reduce(func,lst)
print(res)

'''

代碼分析:
首先把5,4拿到func函數當中,進行運算獲得54
而後把54和lst當中的第三個元素8拿到func當中進行運算獲得548
而後把548和list當中的第四個元素8拿到func當中進行運算獲得5488
到此,全部數據運算完畢,返回5488
'''

#2:"987" => [9,8,7]
#法一:

str = "987"
lst = []
for i in str:
    lst.append(int(i))
print(lst)

#法二:
#"987" => [9,8,7]
#不使用int強轉的方法下
print("=============================")
def func3(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,"987")
#print(list(it))
res = reduce(func3,it)
print(res,type(res))

 

3.sorted()

參數:
        sorted(iterable,reverse=False,key="函數")
        reverse = False 從小到大排序(升序,正序)
        reverse = Ture  從大到小排序(降序,倒序)
        key = 內置函數 自定義函數
返回值:
    排序後的結果

#(1) 從小到大排序
# listvar = [-99,13,24,0]
# listvar.sort()
# print(listvar)

listvar = [-99,13,24,0]
res = sorted(listvar)
print(res)

#(2)從大到小排序
listvar = [-99,-13,24,0]
res = sorted(listvar,reverse=True)
print(res)

#(3)利用內置函數進行排序
abs 絕對值函數
listvar = [-99,-13,24,0]

res = sorted(listvar,key=abs)
print(res)
'''
0     => 0
-13   => 13
'''
#(4) 利用自定義函數進行排序

listvar = [-99,-13,24,0]
def func(n):
    return n % 10

listvar = [23,98,44,16]
res = sorted(listvar,key=func)
print(res)

'''
23 => 3
44 => 4
16 => 6
98 => 8
'''
sort  sorted 用法是同樣的,只是注意語法的格式不一樣
sort 是直接更改原有列表
sorted 是產生一個新的副本,新的數據(推薦)

listvar = [23,98,44,16]
listvar.sort(key=func)
print(listvar)

 

4.filter()

filter(func,iterable)
功能:過濾數據
參數:
    func 自定義函數(return Ture 保留數據, return False 捨棄數據)
    iterable: 可迭代性數據(經常使用:容器類型數據 range對象 迭代器)
返回值:
    迭代器
#保留奇數,不要偶數def func(n):    if n % 2 == 1:        return True    else:        return Falselst = {1,2,3,4,4,5,6,65,7,8}it = filter(func,lst)from collections import Iterator,Iterableprint(isinstance(it,Iterator))#使用list強轉迭代器(瞬間拿到全部數據)res = list(it)print(res)#經過lambda表達式來優化代碼it2 = filter(lambda n : True if n % 2 ==1 else False,lst)print(list(it2))

相關文章
相關標籤/搜索