怎么調(diào)用Python遞歸函數(shù)與匿名函數(shù)-創(chuàng)新互聯(lián)

這篇文章主要講解了“怎么調(diào)用Python遞歸函數(shù)與匿名函數(shù)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么調(diào)用Python遞歸函數(shù)與匿名函數(shù)”吧!

創(chuàng)新互聯(lián)公司從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元武邑做網(wǎng)站,已為上家服務(wù),為武邑各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

一. 遞歸函數(shù)

  a) 引言:在一個(gè)函數(shù)中自己調(diào)用自己會(huì)怎么樣呢?會(huì)陷入無(wú)限的調(diào)用循環(huán)。為了解決該問(wèn)題就需要使用遞歸。

  b) 應(yīng)用:

  i. 案例分析:編寫一個(gè)函數(shù),該函數(shù)接收一個(gè)整數(shù)n,然后計(jì)算輸出n的階乘。

  1. 首先定義一個(gè)一個(gè)函數(shù)def factorial(n),該函數(shù)應(yīng)該怎么實(shí)現(xiàn)呢?我們知道計(jì)算n的階乘有如下規(guī)律:n!=n*[(n-1)*[n-2]…*1]=n*(n-1)!

  2. 函數(shù)實(shí)現(xiàn)步驟可以是:

  def factorial(n):

  1.計(jì)算(n-1)的階乘

  2.返回step1的結(jié)果值*n

  要完成第一步的事情,就是要計(jì)算(n-1)!。由于我們這個(gè)函數(shù)是計(jì)算n!,因此第一步也可以理解為,以n-1為參數(shù),調(diào)用factorial函數(shù)。代碼就會(huì)變成:

  def factorial(n):

  1.factorial(n-1)

  2.返回step1的結(jié)果值*n

  在該代碼中,出現(xiàn)了在factorial函數(shù)中調(diào)用factorial函數(shù)的情況。出現(xiàn)了函數(shù)的遞歸。為了完善上述代碼,可以將代碼中的第二部也翻譯成代碼:

  def factorial(n):

  1. int result=factorial(n-1)

  2. return result*n

  但是問(wèn)題也出現(xiàn)了,加入n=3,在fac(3)的內(nèi)部會(huì)調(diào)用fac(2),在fac(2)中會(huì)調(diào)用fac(1),在fac(1)中會(huì)調(diào)用fac(0)-》fac(-1)……因此我們需要規(guī)定一個(gè)循環(huán)調(diào)用結(jié)束的條件。在當(dāng)前程序中當(dāng)參數(shù)n的值為1時(shí),則計(jì)算1的階乘,到這一步就沒(méi)有必要繼續(xù)遞歸下去的必要了,因此n=1是,應(yīng)當(dāng)直接返回。

  def factorial(n):

  if(n==1):

  return 1

  int result=factorial(n-1)

  return result*n

二. 匿名函數(shù)

  a) 引言:當(dāng)我們?cè)趧?chuàng)建函數(shù)的時(shí),有的時(shí)候不需要顯示的定義函數(shù),直接傳入匿名函數(shù)會(huì)更加的方便,這會(huì)省去我們挖空心思為函數(shù)命名的麻煩,也能少些不少的代碼,很多編程語(yǔ)言都提供匿名函數(shù)這種特性。匿名函數(shù)用好了,會(huì)起到畫龍點(diǎn)睛的效果,沒(méi)用好就容易畫虎不成反類犬,

  b) 在Python中使用lambda關(guān)鍵字來(lái)創(chuàng)建匿名函數(shù)。所謂匿名,即不再使用def這種標(biāo)準(zhǔn)形式定義函數(shù),需要注意的有:

  i. lambda是一個(gè)表達(dá)式而不是一個(gè)代碼塊

  ii. 僅僅能在lambda表達(dá)式中封裝有限的邏輯

  iii. Lambda函數(shù)擁有自己的命名空間

  c) 語(yǔ)法結(jié)構(gòu):lambda 參數(shù):表達(dá)式 例如 lambda x:x*x, 冒號(hào)前的x表示的是參數(shù),后面的表示函數(shù)的執(zhí)行代碼,,它相當(dāng)于下面的函數(shù):

  Def f(x): return x*x

  d) 注意:

  i. 匿名函數(shù)只能有一個(gè)表達(dá)式

  ii. 不用也不能寫return語(yǔ)句,表達(dá)式的結(jié)果就是返回值

  iii. 匿名函數(shù)也是一個(gè)函數(shù)對(duì)象,可以將其賦值給一個(gè)變量,然后通過(guò)變量來(lái)調(diào)用該函數(shù)。f=lambda x:x*x f(6)

三. 推導(dǎo)式:是一種獨(dú)特的推導(dǎo)式語(yǔ)法,可幫我們?cè)谀承﹫?chǎng)合寫出比較精簡(jiǎn)炫酷的代碼。但是沒(méi)有它,也不會(huì)有太多的影響。

  a) 分類:

  i. 列表推導(dǎo)式

  ii. 字典推導(dǎo)式

  iii. 集合推導(dǎo)式

  iv. 元組推導(dǎo)式?

  b) 列表推導(dǎo)式:是一種快速生成列表的方式,其形式使用方括號(hào)括起來(lái)的一段語(yǔ)句。

  i. 案例:lis=[x*x for x in range(1,10) ] 首先執(zhí)行for循環(huán),對(duì)于每一個(gè)x帶入x*x中進(jìn)行運(yùn)算,將運(yùn)算的結(jié)果值逐一添加到一個(gè)新的列表內(nèi)(x*x的式子中使用的變量必須為for中的x)。尤其可見(jiàn),列表推導(dǎo)式為我們提供了一種在一行內(nèi)實(shí)現(xiàn)較為復(fù)雜邏輯的生成列表的方法。其核心語(yǔ)法就是用中括號(hào)將生成的邏輯封裝起來(lái)。

  ii. 案例:[x*x for x in range(1,11) if x%2==0] 通過(guò)增加if語(yǔ)句對(duì)x進(jìn)行過(guò)濾

  iii. 案例:dic={“k1”:”v1”,”k2”:”v2”} a=[k+”:”+v for k,v in dic.items()]

  c) 字典推導(dǎo)式:列表推導(dǎo)式使用的是中括號(hào),那么如果使用大括號(hào)則可以制造字典推導(dǎo)式

  i. 案例:dic={x:x*2 for x in(2,4,6)} x:x*2中間的冒號(hào)左邊表示key右邊表示value

  ii. 案例:也可以添加if子句

  d) 集合推導(dǎo)式:大括號(hào)除了可以用作字典推導(dǎo)式還可以用作集合推導(dǎo)式,注意兩者差別。

  i. 案例:a={x for x in “abcdefg” if x not in “abc”}

  e) 元組推導(dǎo)式:那是用小括號(hào)的是不是元組推導(dǎo)式呢?no。在python中使用小括號(hào)的被叫做生成器的語(yǔ)法,在python中沒(méi)有元組推導(dǎo)式。

  i. 如果想通過(guò)上述類似的方法生成元組,需要顯示調(diào)用元組的類型轉(zhuǎn)換函數(shù)tuple。t=tuple(x for x in range(10))

  f) 面試題:

  result = [lambda x: x + i for i in range(10)]

  print(result[0](10))

  答案是19,并且result[0~9](10)的結(jié)果都是19。這是因?yàn)楹瘮?shù)具有調(diào)用時(shí)才查找變量的特性。在你沒(méi)調(diào)用它之前,它不會(huì)保存也不關(guān)心它內(nèi)部變量的具體值。只有等到你調(diào)用它的時(shí)候,它才逐一去找這些變量的具體值。這里的result[0]被調(diào)用的時(shí)候,變量i已經(jīng)循環(huán)完畢,變成9了,而不是想象中的動(dòng)態(tài)0-9值。

  那如果不想要這樣的結(jié)果,想要i是循環(huán)的值怎么辦?不要直接引用上層變量,把變量直接傳進(jìn)來(lái)。

  result = [lambda x, i=i: x + i for i in range(10)]

  print(result[0](10))

四. 迭代器

  a) 迭代:通過(guò)for循環(huán)遍歷對(duì)象的每一個(gè)元素的過(guò)程。For可以遍歷任何可迭代的對(duì)象。

  b) 可迭代對(duì)象類型:list/tuple/string/dict/set/bytes??梢酝ㄟ^(guò)collections模塊的Iterable類型來(lái)判斷一個(gè)對(duì)象是否可迭代:

  from collections import Iterable

  isinstance('abc', Iterable) # str是否可迭代

  c) 迭代器:是一種可以被遍歷的對(duì)象。特點(diǎn)如下:

  i. 能調(diào)用next()函數(shù)。

  ii. 使用iter()函數(shù)創(chuàng)建迭代器對(duì)象

  iii. 迭代器對(duì)象從集合的第一個(gè)元素開始訪問(wèn),直到所有元素被訪問(wèn)結(jié)束

  iv. 只能往后遍歷,不能回溯

  v. 案例:

  >>> lis=[1,2,3,4]

  >>> it = iter(lis) # 使用Python內(nèi)置的iter()方法創(chuàng)建迭代器對(duì)象

  >>> next(it) # 使用next()方法獲取迭代器的下一個(gè)元素

  1

  >>> next(it)

  2

  >>> next(it)

  3

  >>> next(it)

  4

  >>> next(it) # 當(dāng)后面沒(méi)有元素可以next的時(shí)候,彈出錯(cuò)誤

  或者使用for循環(huán)遍歷迭代器:

  lis = [1,2,3,4]

  it = iter(lis) # 創(chuàng)建迭代器對(duì)象

  for x in it: # 使用for循環(huán)遍歷迭代對(duì)象

  print (x, end=" ")

  迭代器的作用:除了可迭代的類型可以進(jìn)行迭代外,在開發(fā)中也會(huì)遇到一些自定義的類型也有迭代的需求,即將自定義類型定義成迭代器類型即可(需要在類里實(shí)現(xiàn)__iter__()和__next__()方法,可供next和iter函數(shù)調(diào)用該對(duì)象)。for循環(huán)本質(zhì)上就是通過(guò)不斷調(diào)用next()函數(shù)實(shí)現(xiàn)的

  def iter(obj):

  return obj.__iter__()

  def next(obj):

  return obj.__next__()

  自定義迭代器類:

  import random

  class demo_iterator(object):

  def __next__(self):

  v = random.randint(0,10)

  if v < 5:

  raise StopIteration()

  else:

  return v

  def __iter__(self):

  return demo_iterator()

  迭代作用:可以把這個(gè)元素流看做是一個(gè)有序序列,但卻不能提前知道序列的長(zhǎng)度,只能不斷通過(guò)next()函數(shù)得到下一個(gè)元素,所以迭代器可以節(jié)省內(nèi)存和空間。

五. 生成器

  a) 引言:有時(shí)候,序列或集合內(nèi)的元素的個(gè)數(shù)非常巨大,如果全制造出來(lái)并放入內(nèi)存,對(duì)計(jì)算機(jī)的壓力是非常大的。比如,假設(shè)需要獲取一個(gè)10**20次方如此巨大的數(shù)據(jù)序列,把每一個(gè)數(shù)都生成出來(lái),并放在一個(gè)內(nèi)存的列表內(nèi),這是粗暴的方式,有如此大的內(nèi)存么?如果元素可以按照某種算法推算出來(lái),需要就計(jì)算到哪個(gè),就可以在循環(huán)的過(guò)程中不斷推算出后續(xù)的元素,而不必創(chuàng)建完整的元素集合,從而節(jié)省大量的空間。在Python中,這種一邊循環(huán)一邊計(jì)算出元素的機(jī)制,稱為生成器:generator。

  b) 語(yǔ)法格式:類似推導(dǎo)式,使用小括號(hào)

  c) 案例:

  >>> g = (x * x for x in range(1, 4))

  >>> g

  at 0x1022ef630>

  可以通過(guò)next()函數(shù)獲得generator的下一個(gè)返回值,這點(diǎn)和迭代器非常相似:

  >>> next(g)

  1

  但更多情況下,我們使用for循環(huán)。

  for i in g:

  print(i)

  d) 關(guān)鍵字yield:

  1. 用法:使用yield返回的函數(shù)會(huì)變成一個(gè)生成器。在調(diào)用生成器的過(guò)程中,每次遇到y(tǒng)ield時(shí),函數(shù)會(huì)暫停并保存當(dāng)前所有的運(yùn)行信息,返回yeild值。并在下一次運(yùn)行next方法時(shí)從當(dāng)前位置繼續(xù)執(zhí)行。

感謝各位的閱讀,以上就是“怎么調(diào)用Python遞歸函數(shù)與匿名函數(shù)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么調(diào)用Python遞歸函數(shù)與匿名函數(shù)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站題目:怎么調(diào)用Python遞歸函數(shù)與匿名函數(shù)-創(chuàng)新互聯(lián)
本文路徑:http://bm7419.com/article34/cdedpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、靜態(tài)網(wǎng)站、網(wǎng)站導(dǎo)航自適應(yīng)網(wǎng)站、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化