溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Pyhton學(xué)習(xí)之 函數(shù)式編程

發(fā)布時間:2020-07-11 18:16:18 來源:網(wǎng)絡(luò) 閱讀:185 作者:nineteens 欄目:編程語言

  函數(shù)式編程

  面向過程的程序設(shè)計(jì)

  基本單元,函數(shù)

  函數(shù)時編程:允許把函數(shù)本身作為參數(shù)傳入另一個函數(shù),還允許返回一個函數(shù)!

  高階函數(shù)

  abs(-10)是函數(shù)調(diào)用,abs是函數(shù)本身

  要獲得調(diào)用結(jié)果,我們可以把結(jié)果賦值給變量

  也可以把函數(shù)本身賦給變量,即變量指向函數(shù),這樣可以實(shí)現(xiàn)通過變量來調(diào)用函數(shù)

  >>> abs

  >>> f=abs

  >>> f(-10)

  10

  說明變量f現(xiàn)在已經(jīng)指向了abs函數(shù)本身,直接調(diào)用abs()函數(shù)和調(diào)用f()完全相同

  函數(shù)名也是變量

  函數(shù)名就是指向函數(shù)的變量,

  如果把a(bǔ)bs指向其他對象呢?

  >>> abs(-2)

  Traceback (most recent call last):

  File "", line 1, in

  TypeError: 'int' object is not callable

  指向其他對象后,就暫時沒有原來功能了

  傳入函數(shù)

  高階函數(shù),在一個函數(shù)中能調(diào)用另一個函數(shù)

  map/reduce

  map

  >> def f(x):

  ... return x * x

  ...

  >>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])

  >>> list(r)

  [1, 4, 9, 16, 25, 36, 49, 64, 81]

  map()傳入的第一個參數(shù)是函數(shù)對象f,

  L = []

  for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]:

  L.append(f(n))

  print(L)

  reduce 看官網(wǎng)吧

  filter

  正確實(shí)現(xiàn)篩選功能

  用于過濾序列,例如刪掉偶數(shù)只保留奇數(shù),把一個序列的空字符串去掉

  def not_empty(s):

  return s and s,strip()

  list(filter(not_empty,['A','','B',None ,'c','d']))

  #結(jié)果是 ['A','b','c']

  sorted(排序算法)

  內(nèi)置sorted()函數(shù)可以對list排序

  >>> sorted([1,2,7,6,5,4])

  [1, 2, 4, 5, 6, 7]

  sorted()函數(shù)也是一個高階函數(shù),他還可以接收一個key函數(shù)來實(shí)現(xiàn)自定義的排序,例如按照絕對值大小排序

  >>> sorted([3,5,-1,-2],key=abs)

  [-1, -2, 3, 5]

  key指定的函數(shù)將作用在list的每一個元素上,并根據(jù)key函數(shù)返回的結(jié)果進(jìn)行排序,對比原來的list和經(jīng)過key=abs處理過的lsit:

  >>> sorted([3,5,-1,-2],key=abs)

  [-1, -2, 3, 5]

  然后按照key進(jìn)行排序

  sort也可以給字符串排序

  >>> sorted(['bob', 'about', 'Zoo', 'Credit'])

  ['Credit', 'Zoo', 'about', 'bob']

  按照accii碼值來排序的

  >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower)

  ['about', 'bob', 'Credit', 'Zoo']

  要進(jìn)行反向排序,不必改動key,可以傳入的三個參數(shù)reverse=Ture

  >>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)

  ['Zoo', 'Credit', 'bob', 'about']

  高階函數(shù)的抽象能力是非常強(qiáng)大的,而且核心代碼可以保持非常簡潔

  函數(shù)作為返回值

  寫完一個求和函數(shù)后,不需要立刻求和,而是在后面的代碼中根據(jù)需要再計(jì)算怎么辦,可以不返回求和的結(jié)果,而是返回求和的函數(shù)

  返回函數(shù)沒有立刻執(zhí)行,而是在主函數(shù)中調(diào)用了才被執(zhí)行

  閉包無錫看婦科的醫(yī)院 http://www.ytsgfk120.com/

  在IDLE中寫程序的時候要在最后加上print(),因?yàn)樗皇墙换キh(huán)境!!!

  def count():

  fs = []

  for i in range(1, 4):

  def f():

  return i*i

  fs.append(f)

  return fs

  f1,f2,f3= count()#借用count來調(diào)用函數(shù)!!!

  print(f1())

  print(f2())

  print(f3())

  牢記:

  返回函數(shù)不要引用任何的循環(huán)變量,或者后續(xù)會發(fā)生變化的變量

  如果一定要引用循環(huán)變量,需要再創(chuàng)建一個函數(shù),用該函數(shù)的參數(shù)綁定循環(huán)變量的值

  def count():

  def f(j):

  def g():

  return j*j

  return g

  fs=[]

  for i in range(1,4):

  fs.append(f(i))#f立刻被執(zhí)行,因此i的當(dāng)前值被傳入f()

  return fs

  f1,f2,f3 = count()

  print(f1())

  print(f2())

  缺點(diǎn):代碼較長,可利用lambda函數(shù)縮短代碼

  小結(jié):

  一個函數(shù)可以返回一個計(jì)算結(jié)果,也可以返回一個函數(shù)。

  返回一個函數(shù)時,牢記該函數(shù)并未執(zhí)行,返回函數(shù)中不要引用任何可能會變化的量。

  匿名函數(shù)

  好處:因?yàn)楹瘮?shù)沒有名字,不必?fù)?dān)心函數(shù)名沖突

  沒有return語句

  s=list(map(lambda x:x*x,[1,2,3,4,5,6,7,8,9]))

  print(s)

  實(shí)際上就是

  def f(x):

  return x*x

  關(guān)鍵字lambda表示匿名函數(shù),冒號前面的x表示函數(shù)參數(shù)

  匿名函數(shù)有個限制,就是只能有一個表達(dá)式,不用寫return語句,返回值就是該表達(dá)式的結(jié)果

  匿名函數(shù)也是一個函數(shù)對象,可以把匿名函數(shù)賦給一個變量,再利用變量+參數(shù) 來調(diào)用函數(shù),

  f=lambda x:x*x

  print(f(4))

  可以把匿名函數(shù)作為返回值返回

  裝飾器

  在代碼運(yùn)行期間動態(tài)增加功能的方式,稱之為“裝飾器”decoator

  偏函數(shù)

  int轉(zhuǎn)換其他類型的時候,默認(rèn)按十進(jìn)制轉(zhuǎn)換

  要想轉(zhuǎn)化為二進(jìn)制 int(x,base=2)

  如果嫌一直寫太麻煩,可以定義一個函數(shù)啊

  def int2(x,base=2):

  return int(x,base)

  偏函數(shù)

  functools.partial幫助我們創(chuàng)建一個偏函數(shù),不需要我們自己定義int2(),可以直接使用下面的代碼創(chuàng)建一個新的函數(shù)

  import functools

  int2=functools.partial(int base=2)

  int2('100000')

  64

  funtools.partial的作用就是,把一個函數(shù)的某些參數(shù)給固定住(也就是設(shè)置默認(rèn)值),返回一個新的函數(shù),調(diào)用這個新函數(shù)會更簡單。

  小結(jié):

  當(dāng)函數(shù)的參數(shù)過多,需要簡化時,使用functools.partial可以創(chuàng)建一個新的函數(shù),這個新函數(shù)可以固定住原函數(shù)的部分參數(shù),從而在調(diào)用的時候更簡單。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI