日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python (第八章)补充-可迭代对象(补充高阶函数,以及常用的高阶函数)

發布時間:2023/12/10 python 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python (第八章)补充-可迭代对象(补充高阶函数,以及常用的高阶函数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 可迭代對象
    • 迭代器
      • 什么是迭代器
      • 什么是生成器
      • 生成器的作用
      • 生成器的注意事項
    • 總結:
    • 高階函數
      • 什么是高階函數?
      • map()函數
      • filter()函數
      • reduce()函數
    • 參考

可迭代對象

我們已經知道,可以直接作用于for循環的數據類型有以下幾種:
一類是集合數據類型,如list、tuple、dict、set、str等;
一類是generator,包括生成器和帶yield的generator function。
這些可以直接作用于for循環的對象統稱為可迭代對象:Iterable。
可以使用isinstance()判斷一個對象是否是Iterable對象。

>>> isinstance([], Iterable) True >>> isinstance(range(1),Iterable) True

range() 函數可創建一個整數列表,一般用在 for 循環中。

迭代器

什么是迭代器

可以被next()函數調用并不斷返回下一個值的對象稱為迭代器:Iterator。
可以使用isinstance()判斷一個對象是否是Iterator對象:
生成器都是Iterator對象,但list、dict、str雖然是Iterable,卻不是Iterator。
把list、dict、str等Iterable變成Iterator可以使用iter()函數。

對于list、string、tuple、dict等這些容器對象,使用for循環遍歷是很方便的。在后臺for語句對容器對象調用iter()函數。iter()是python內置函數。 iter()函數會返回一個定義了next()方法的迭代器對象,它在容器中逐個訪問容器內的元素。next()也是python內置函數。在沒有后續元素時,next()會拋出一個StopIteration異常,通知for語句循環結束。

迭代器是用來幫助我們記錄每次迭代訪問到的位置,當我們對迭代器使用next()函數的時候,迭代器會向我們返回它所記錄位置的下一個位置的數據。實際上,在使用next()函數的時候,調用的就是迭代器對象的_next_方法(Python3中是對象的_next_方法,Python2中是對象的next()方法)。所以,我們要想構造一個迭代器,就要實現它的_next_方法。但這還不夠,python要求迭代器本身也是可迭代的,所以我們還要為迭代器實現_iter_方法,而_iter_方法要返回一個迭代器,迭代器自身正是一個迭代器,所以迭代器的_iter_方法返回自身self即可。

而生成器不但可以作用于for循環,還可以被next()函數不斷調用并返回下一個值,直到最后拋出StopIteration錯誤表示無法繼續返回下一個值了。

什么是生成器


生成器的作用

首先,生成器的好處是延遲計算,一次返回一個結果。也就是說,它不會一次生成所有的結果,這對于大數據量處理,將會非常有用。

除了延遲計算(減少內存使用),生成器還能有效調高代碼可讀性。

生成器的注意事項

生成器的唯一注意事項是:生成器只能遍歷一次。

總結:

凡是可作用于for循環的對象都是Iterable類型;

凡是可作用于next()函數的對象都是Iterator類型,它們表示一個惰性計算的序列;

集合數據類型如list、dict、str等是Iterable但不是Iterator,不過可以通過iter()函數獲得一個Iterator對象。

Python的for循環本質上就是通過不斷調用next()函數實現的。

高階函數

什么是高階函數?

高階函數:一個函數可以作為參數傳給另外一個函數,或者一個函數的返回值為另外一個函數(若返回值為該函數本身,則為遞歸),滿足其一則為高階函數。

實例1(參數為函數):

def bar():print('in the bar') def foo(func):func()print('in the foo...') foo(bar) """ in the bar in the foo... """

實例2(返回值為函數)

def bar():print("in the bar...") def foo(func):print("in the foo")return func res = foo(bar) res()""" in the foo in the bar... """

map()函數

map()函數接收兩個參數,一個是函數,一個是Iterable。

例子1:

def f(x):return x * x r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]) print(list(r)) # [1, 4, 9, 16, 25, 36, 49, 64, 81]

例子2:

print(list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))) # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

例子3:加入生成器表達式

def f(x):return x * x r = map(f, (x for x in range(1, 10))) print(list(r)) # [1, 4, 9, 16, 25, 36, 49, 64, 81]

filter()函數

filter函數也是接收一個函數和一個序列的高階函數,其主要功能是過濾。其返回值是迭代器對象。

names = ["Alex", "amanda", "xiaowu"] #filter函數機制 def filter_test(func, iter):names_1 = []for i in iter:if func(i): #傳入的func函數其結果必須為bool值,才有意義names_1.append(i)return names_1 #filter_test函數 print(filter_test(lambda x: x.islower(), names)) #filter函數 print(list(filter(lambda x: x.islower(), names)))

reduce()函數

reduce:把一個函數作用在一個序列[x1, x2, x3, …]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

例子1:

from functools import reduce def add(x, y):return x + y print(reduce(add, [1, 3, 5, 7, 9])) #25

例子2(計算階乘):

from functools import reduce def fact(n):return reduce(lambda a, b: a*b, range(1, n+1)) print(5) #120

附例子2:
這里使用到了一個包operator

from functools import reduce from operator import mul def fac1(n):return reduce(mul, range(1, n+1))

點進去,我們發現這個包里有很多的方法;

例子3(字符串轉化為數字):

from functools import reduce DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} def str2int(s):def fn(x, y):return x * 10 + ydef char2num(s):return DIGITS[s]return reduce(fn, map(char2num, s)) print(str2int('123')) # 123

例子4(使用lambda函數修改一下例子3):

from functools import reduce DIGITS = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} def char2num(s):return DIGITS[s] def str2int(s):return reduce(lambda x, y: x * 10 + y, map(char2num, s)) print(str2int('123'))

例子5(把字符串’123.456’轉換成浮點數123.456):

from functools import reduce def str2float(s):def fn(x,y):return x*10+yn=s.index('.')s1=list(map(int,[x for x in s[:n]]))s2=list(map(int,[x for x in s[n+1:]]))return reduce(fn,s1)+reduce(fn,s2)/10**len(s2)

參考

(1)https://www.zhihu.com/question/20829330(如何更好地理解Python迭代器和生成器?)

總結

以上是生活随笔為你收集整理的python (第八章)补充-可迭代对象(补充高阶函数,以及常用的高阶函数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。