华南俳烁实业有限公司

python

當(dāng)前位置:中華考試網(wǎng) >> python >> python教程 >> 文章內(nèi)容

Python高階函數(shù)是什么?怎么用?

來(lái)源:中華考試網(wǎng)  [2020年11月3日]  【

  初次了解的小伙伴可能有些疑惑,對(duì)于“高階”不明白,或者高階函數(shù)和函數(shù)兩者之間有什么關(guān)系?要怎么使用呢?有這些疑惑的小伙伴可以看下面內(nèi)容~

  舉一個(gè)最簡(jiǎn)單的高階函數(shù)

  def foo(x, y, f): # f 是一個(gè)函數(shù)

  """

  把 x, y 分別作為參數(shù)傳遞給 f, 最后返回他們的和

  :param x:

  :param y:

  :param f:

  :return:

  """

  return f(x) + f(y)

  def foo1(x):

  """

  返回參數(shù)的 x 的 3次方

  :param x:

  :return:

  """

  return x ** 3

  r = foo(4, 2, foo1)

  print(r) # 72

  說(shuō)明:

  1、這里的 foo 就是高階函數(shù), 因?yàn)樗邮樟艘粋(gè)函數(shù)作為參數(shù).

  2、foo1作為參數(shù)傳遞給了foo, 而且foo中的局部變量f接收了foo傳遞過(guò)來(lái)的數(shù)據(jù), 那么最終是foo和f同時(shí)指向了同一個(gè)對(duì)象。

  總結(jié)

  編寫(xiě)高階函數(shù),就是讓函數(shù)的參數(shù)能夠接收其他的函數(shù)。

  把函數(shù)作為參數(shù)傳入,這樣的函數(shù)稱為高階函數(shù),函數(shù)式編程就是指這種高度抽象的編程范式。

  高階函數(shù)另一種形式:把函數(shù)作為返回值

  高階函數(shù)除了可以接受函數(shù)作為參數(shù)外,還可以把函數(shù)作為結(jié)果值返回。

  def foo():

  x = 10

  def temp():

  nonlocal x

  x += 10 #x=x+10

  return x

  return temp

  f = foo()

  print(f())

  print(f())

  輸出結(jié)果:

  說(shuō)明:

  調(diào)用foo()得到的一個(gè)函數(shù), 然后把函數(shù)賦值給變量f, 這個(gè)時(shí)候f和 foo內(nèi)部的temp其實(shí)指向了同一個(gè)函數(shù)對(duì)象。

python課程免費(fèi)試聽(tīng)預(yù)約

  • 地區(qū):
  • 姓名:
  • 手機(jī):

  返回的函數(shù)每調(diào)用一次都會(huì)把foo 的局部變量x增加 10 .所以兩次調(diào)用分別得到 20 和 30。

  返回訪問(wèn)了外部函數(shù)的局部變量或者全局變量的函數(shù),這種函數(shù)就是閉包。

  內(nèi)置高階函數(shù)

  高階函數(shù)在函數(shù)式編程語(yǔ)言中使用非常的廣泛。

  本節(jié)簡(jiǎn)單介紹幾個(gè)常用的高階函數(shù)。

  列表的排序, map/reduce, filter等。

  map()和filter()

  函數(shù)編程語(yǔ)言通常都會(huì)提供map, filter, reduce三個(gè)高階函數(shù).

  在python3中, map和filter仍然是內(nèi)置函數(shù), 但是由于引入了列表推導(dǎo)和生成器表達(dá)式, 他們變得沒(méi)有那么重要了。

  列表推導(dǎo)和生成器表達(dá)式具有了map和filter兩個(gè)函數(shù)的功能, 而且更易于閱讀。

  代碼展示:

  a = map(lambda x: x ** 2, [10, 20, 30, 40])

  print(list(a))

  print(type(a))

  輸出結(jié)果:

  說(shuō)明:

  1、map函數(shù)是利用已有的函數(shù)和可迭代對(duì)象生成一個(gè)新的可迭代類型:map類型。

  2、map的參數(shù)1是一個(gè)函數(shù), 參數(shù)2是一個(gè)可迭代類型的數(shù)據(jù). map會(huì)獲取迭代類型的每個(gè)數(shù)據(jù), 傳遞給參數(shù)1的函數(shù), 然后函數(shù)的返回值組成新的迭代類型的每個(gè)元素。

  3、也可以有多個(gè)迭代器, 則參數(shù)1的函數(shù)的參數(shù)個(gè)數(shù)也會(huì)增加。

  4、新生成的迭代器類型的元素的個(gè)數(shù), 會(huì)和最短的那個(gè)迭代器的元素的個(gè)數(shù)保持一致。

  a = map(lambda x, y: x + y, [10, 20, 30, 40], [100, 200])

  print(list(a))

  輸出結(jié)果:

  使用列表推倒實(shí)現(xiàn)上面的功能

  使用列表比map優(yōu)雅了很多, 而且也避免了參數(shù)1的函數(shù)

  list1 = [10, 20, 30, 40]

  list3 = [x ** 2 for x in list1]

  print(list3)

  輸出結(jié)果:

  list1 = [10, 20, 30, 40]

  list2 = [100, 200]

  # 注意:列表推倒中這里是使用的笛卡爾積

  list3 = [x + y for x in list1 for y in list2]

  print(list3)

  輸出結(jié)果:

責(zé)編:fushihao
  • 會(huì)計(jì)考試
  • 建筑工程
  • 職業(yè)資格
  • 醫(yī)藥考試
  • 外語(yǔ)考試
  • 學(xué)歷考試
江北区| 平安县| 馆陶县| 松滋市| 永城市| 中牟县| 融水| 广灵县| 滦南县| 湖北省| 灯塔市| 土默特右旗| 绥芬河市| 乡宁县| 德兴市| 神木县| 龙江县| 九寨沟县| 乐都县| 平和县| 监利县| 营山县| 京山县| 略阳县| 剑河县| 高雄市| 武宣县| 惠东县| 江油市| 班戈县| 宁明县| 铁力市| 洛浦县| 宝兴县| 德清县| 万全县| 黄冈市| 隆尧县| 吉安市| 象州县| 中阳县|