python學習筆記之裝飾器、遞歸、算法(第四天)

?

? ? ?參考老師的博客:

? ? ? ? ? 金角:http://www.cnblogs.com/alex3714/articles/5161349.html

? ? ? ? ? 銀角:http://www.cnblogs.com/wupeiqi/articles/4963027.html

?

一、冒泡算法實例:

a = [32,5,22,41,7,31,12,102,74,37,9,25]

? ?1、方法1:


?

count = 0
for i in range(len(a)):
for j in range(len(a)-1):
if a[j] > a [j+1]:
tmp = a[j]
a[j] = a[j+1]
a[j+1] = tmp
count += 1
count += 1
print('count is %d' % count)
print(a)
注:此方法會循環12*11次,會進行多次不必要的判斷

2、方法2:(此方法是將大的數字逐步往后移)

count = 0
for i in range(1,len(a)):
for j in range(len(a)-i):
if a[j] > a [j+1]:
tmp = a[j]
a[j] = a[j+1]
a[j+1] = tmp
        count += 1
count += 1
print(a)

 
3、方法3:(注:此方法是將找到小的數字往前移)

for i in range(len(a)-1):
for j in range(i+1,len(a)):
if a[i] > a[j]: #小于號表示遍歷一遍找到最大值放到第一位,依次查找;如果是大于號則相反
tmp = a[i]
a[i] = a[j]
a[j] = tmp
print(a)



二、遞歸

特點

遞歸算法是一種直接或者間接地調用自身算法的過程。在計算機編寫程序中,遞歸算法對解決一大類問題是十分有效的,它往往使算法的描述簡潔而且易于理解。
遞歸算法解決問題的特點:
(1) 遞歸就是在過程或函數里調用自身。
(2) 在使用遞歸策略時,必須有一個明確的遞歸結束條件,稱為遞歸出口。
(3) 遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運行效率較低。所以一般不提倡用遞歸算法設計程序。
(4) 在遞歸調用的過程當中系統為每一層的返回點、局部量等開辟了棧來存儲。遞歸次數過多容易造成棧溢出等。所以一般不提倡用遞歸算法設計程序。

要求

遞歸算法所體現的“重復”一般有三個要求:
一是每次調用在規模上都有所縮小(通常是減半);
二是相鄰兩次重復之間有緊密的聯系,前一次要為后一次做準備(通常前一次的輸出就作為后一次的輸入);
三是在問題的規模極小時必須用直接給出解答而不再進行遞歸調用,因而每次遞歸調用都是有條件的(以規模未達到直接解答的大小為條件),無條件遞歸調用將會成為死循環而不能正常結束。
實例:
對一個數字進行除2求值,直到小于等于1時退出并輸出結果:
1、遞歸時不return:
def divide(n,val):n += 1print(val)if val / 2 > 1:aa = divide(n,val/2)print('the num is %d,aa is %f' % (n,aa))print('the num is %d,val is %f' % (n,val))return(val)divide(0,50.0)結果說明(不return時相當于嵌套循環,一層層進入在一層層退出):
50.0
25.0
12.5
6.25
3.125
1.5625
the num is 6,val is 1.562500
the num is 5,aa is 1.562500
the num is 5,val is 3.125000
the num is 4,aa is 3.125000
the num is 4,val is 6.250000
the num is 3,aa is 6.250000
the num is 3,val is 12.500000
the num is 2,aa is 12.500000
the num is 2,val is 25.000000
the num is 1,aa is 25.000000
the num is 1,val is 50.0000002、遞歸時return:
def divide(n,val):n += 1print(val)if val / 2 > 1:aa = divide(n,val/2)print('the num is %d,aa is %f' % (n,aa))return(aa)print('the num is %d,val is %f' % (n,val))return(val)divide(0,50.0)結果說明(return時就直接結束本次操作):
50.0
25.0
12.5
6.25
3.125
1.5625
the num is 6,val is 1.562500
the num is 5,aa is 1.562500
the num is 4,aa is 1.562500
the num is 3,aa is 1.562500
the num is 2,aa is 1.562500
the num is 1,aa is 1.562500
除2實例

?

要求:
通過遞歸實現2分查找
現有列表primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 21, 37, 41, 43, 47, 53, 18, 61, 67, 71, 73, 39, 83, 49, 97], 要求爾等 用最快的方式 找出23
 
def find(val,find_list):find_list.sort()print(find_list)if len(find_list) > 1:a = len(find_list) / 2if val < find_list[a]:temp = find_list[:a]find(val,temp)elif val > find_list[a]:temp = find_list[a:]find(val,temp)else:print('the val %d is in list' % val)else:print('the val %d is not in list' % val)primes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
find(32,primes)
遞歸
 
斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368

如何用遞歸實現:
def feibo(first,second,stop,list):if first >= stop or second >= stop:return listelse:sum = first + secondlist.append(sum)if sum <= stop:return feibo(second,sum,stop,list)return listif __name__ == '__main__':first = int(raw_input('please input the first number:'))second = int(raw_input('please input the second number:'))stop = int(raw_input('please input the stop number:'))l = [first,second]a = feibo(first,second,stop,l)print(a)
斐波那契
 

?算法基礎:

要求:生成一個4*4的2維數組并將其順時針旋轉90度

1、簡單順時針輸出:
a = [i for i in range(4) for j in range(4)]
b = [[i for i in range(4)] for j in range(4)]
print(a)
print(b)for i in range(len(b)):c = [bb[i] for bb in b]print(c)2、對稱互換輸出:
for r_index,row in enumerate(b):for c_index in range(len(row)):temp = b[c_index][r_index]b[c_index][r_index] = b[r_index][c_index]b[r_index][c_index] = tempprint(row)結果:
[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
[0, 0, 0, 0]
[1, 1, 1, 1]
[2, 2, 2, 2]
[3, 3, 3, 3]
2組數據旋轉

?

三、裝飾器

? ? ? 參考銀角大王的裝飾器:http://www.cnblogs.com/wupeiqi/articles/4980620.html

? ? ? 裝飾器的語法以@開頭,接著是裝飾器要裝飾的函數的申明等。
?????? 其實總體說起來,裝飾器其實也就是一個函數,一個用來包裝函數的函數,裝飾器在函數申明完成的時候被調用,調用之后申明的函數被換成一個被裝飾器裝飾過后的函數。

?????? 當原函數有形參時,在裝飾的函數中也需要有相應的形參func(args);

?????? 當原函數有return返回值時,在裝飾的函數中也必須有returne func(args);

?????? 裝飾器分為無參裝飾和有參裝飾:

★無參裝飾
定義方法如下:
比如先定義一個裝飾方法:


def deco(func):
??? """無參數調用decorator聲明時必須有一個參數,這個參數將接收要裝飾的方法"""
??? print('第一個裝飾器') ? ? ? ? ? ?#進行額外操作
??? return func??????????????????????? #返回一個可調用對象(此例還是返回作為輸入參數的方法),返回一個新函數時,新函數可以是一個全局方法或者decorator函數的內嵌函數,只要函數的簽名和被裝飾的函數相同

@deco
def MyFunc(args):? ? ? ? ? ? ? ?? #應用@deco修飾的方法
??? print('my first decorator',args)

????return('nihao',args)


MyFunc('wangkai')?? ? ? ? ? ? ? ? #調用被裝飾的函數
MyFunc('kevin')?

info = MyFunc('gonghui')
print(info)

??????? 注意:當使用上述方法定義一個decorator方法時,函數體內的額外操作只在被裝飾的函數首次調用時執行;


?????? 如果要保證額外操作在每次調用被裝飾的函數時都執行,需要換成如下的寫法:
def deco(func):
??? def replaceFunc(args):???? #定義一個內嵌函數,此函數包裝了被裝飾的函數,并提供額外操作的代碼
??????? print('第一個裝飾器')???? #進行額外操作
??????? return func(args)????????? #產生對被裝飾函數的調用
??? return replaceFunc?????????? #由于返回的是這個新的內嵌函數,所以確保額外操作每次調用得以運行

@deco
def MyFunc(args):???????????????? #應用@deco修飾的方法
??? print('my first decorator',args)
??? return('nihao',args)

MyFunc('wangkai') #調用被裝飾的函數
MyFunc('kevin')
info = MyFunc('gonghui')
print(info)



有參裝飾:


def decoWithArgs(arg):
??? """由于有參數的decorator函數在調用時只會使用應用時的參數而不接收被裝飾的函數做為參數,
?????? 所以必須返回一個decorator函數, 由它對被裝飾的函數進行封裝處理"""
??? def newDeco(func):????????????????????????? #定義一個新的decorator函數
??????? def replaceFunc(args):???????????????? #在decorator函數里面再定義一個內嵌函數,由它封裝具體的操作
??????????? print('第一個裝飾器')???????????????? #進行額外操作
??????????? aa = func(args)??????????????????????? #對被裝飾函數進行調用

????????????print('再見')?

????????????return aa
??????? return replaceFunc
??? return newDeco??????????????????????????????? #返回一個新的decorator函數

@decoWithArgs("demo")
def MyFunc(args):???????????????????????????????? #應用@decoWithArgs修飾的方法
??? print('my first decorator',args)? ?
??? return('nihao',args)

MyFunc('wangkai')??????????????????????????????? #調用被裝飾的函數
MyFunc('kevin')
info = MyFunc('gonghui')
print(info)


?????? 當我們對某個方法應用了裝飾方法后, 其實就改變了被裝飾函數名稱所引用的函數代碼塊入口點,使其重新指向了由裝飾方法所返回的函數入口點。由此我們可以用decorator改變某個原有函數的功能,添加各種操作,或者完全改變原有實現。

多參數函數的裝飾器:


?

def Before(request,kargs):
print 'before:%s==%s' % (request,kargs)
return(kargs)

def After(request,kargs):
print 'after:%s==%s' % (request,kargs)
return(kargs)


def Filter(before_func,after_func):
def outer(main_func):
def wrapper(request,kargs):
before_result = before_func(request,kargs)
main_result = main_func(request,kargs)
after_result = after_func(request,kargs)
return wrapper
return outer

@Filter(Before, After)
def Index(request,kargs):
print 'index:%s==%s' % (request,kargs)
return(kargs)


Index('nihao','aaa')

 

轉載于:https://www.cnblogs.com/wushank/p/5174206.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257738.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257738.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257738.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數字信號處理筆記1-信號與常見操作

年輕人&#xff0c;你對數學一無所知&#xff0c;你只是習慣了而已。 —馮諾伊曼 前言 本學期開始跟著實驗室學習計算機視覺領域&#xff0c;而一個重要的基礎知識就是《數字圖像處理》&#xff0c;而數字信號處理作為一個大類&#xff0c;可以將數字圖像處理理解為數字信號處…

[linux驅動]linux驅動模塊

一&#xff0c;內核模塊的概念 經常在內核驅動代碼看到類似fs_init()等驅動初始化函數&#xff0c;那么這個和module_init()函數的差別在哪里&#xff0c;宏定義__define_initcall(level,fn)對于內核的初始化很重要&#xff0c;他指示編譯器在編譯的時候&#xff0c;將一系列初…

看我如何基于PythonFacepp打造智能監控系統

由于種種原因&#xff0c;最近想親自做一個基于python&facepp打造的智能監控系統。 000&#xff1a;萌芽 1&#xff1a;暑假在家很無聊 想出去玩&#xff0c;找不到人。玩個lol&#xff08;已卸載&#xff09;&#xff0c;老是坑人。實在是無聊至極&#xff0c;不過&#x…

c++ 遍歷所有點且距離最短_編程小白暑期進階筆記41-C語言數據結構與算法圖遍歷的應用...

基于廣度優先遍歷算法的應用思考題&#xff1a;&#xff08;思考題答案&#xff1a;BFS(廣度優先遍歷)在一般的帶權圖中是不能解決最短路問題&#xff0c;了解BFS的都知道&#xff0c;BFS是根據節點到源節點之間的節點數遍歷的&#xff0c;也就是先訪問離源節點節點數最少的點。…

underscorejs-groupBy學習

2.18 groupBy 2.18.1 語法 _.groupBy(list, iteratee, [context]) 2.18.2 說明 把list分為多個集合&#xff0c;iterator為分組的依據,返回值為Object list可以是數組、對象、字符串或arguments等iteratee為分組的依據.iterator的參數(value, key, list)iterator如果是function…

關于@WebServlet(“LoginServlet“)404 報錯的解決辦法 “請求的資源[/test/LoginServlet] 不可用”

關于WebServlet&#xff08;“LoginServlet”&#xff09;404 報錯的解決辦法 “請求的資源[/test/LoginServlet] 不可用” *一切事物的開頭總是困難這句話&#xff0c;在任何一種科學上都是適用的。 * ——馬克思 一個困擾了我n天的問題&#xff0c;終于終于還是解決了&#…

ASP.NET MVC+EF框架+EasyUI實現權限管理系列(14)-主框架搭建

ASP.NET MVCEF框架EasyUI實現權限管理系列(14)-主框架搭建 原文:ASP.NET MVCEF框架EasyUI實現權限管理系列(14)-主框架搭建ASP.NET MVCEF框架EasyUI實現權限管系列 (開篇) (1):框架搭建 (2):數據庫訪問層的設計Demo (3):面向接口編程 (4 ):業務邏輯層的封裝 (5):前臺…

常用事務代碼 sap_SAP_PS_事務代碼

[轉]SAP PS常用事務代碼T-CODESAP項目系統(Project System&#xff0c;以下簡稱PS)模塊作為傳統的非常規模塊(除FI、CO、MM、PP、SD之外的模塊)之一&#xff0c;在最近幾年在國內也得到的較為廣泛的應用,與PS應用火熱場景相對應的是PS內外部顧問的極度缺乏。這種缺乏一方面表現…

Java 冒泡排序的實現

實現原理&#xff1a; 比較相鄰的元素。如果第一個比第二個大&#xff0c;就交換他們兩個。 對每一對相鄰元素作同樣的工作&#xff0c;從開始第一對到結尾的最后一對。在這一點&#xff0c;最后的元素應該會是最大的數。 針對所有的元素重復以上的步驟&#xff0c;除了最后一個…

CLion for mac安裝配置

前言 本文詳細多圖介紹 IntelliJ IDEA For Mac的激活教程&#xff0c;相當于永久激活 文件包百度云下載&#xff1a;(通過與熊論道網站解密&#xff09; 熊曰&#xff1a;呋溫捕嘿誘襲氏樣溫住既非破哮誒襲非捕溫肉性盜森魚非襲啽蜜呦訴嘿溫類盜山寶住出森非喜誘捕發嗥既肉嗅…

solr后臺界面介紹——(十一)

1.加一個collection的方法 復制solr-home下的collection1&#xff0c;修改名字為collection2。并且修改collection2文件夾中配置文件core.properties中的名字為collection2&#xff0c;重啟服務器。 2.后臺界面介紹 Dashboard 儀表盤&#xff0c;顯示了該Solr實例開始啟動運行的…

功率信號與能量信號的超棒理解!

功率信號與能量信號的理解&#xff01; 功率信號和能量信號一直是一個令我疑惑的概念&#xff0c;一個無限一個為零。但是下面令我茅塞頓開&#xff01; &#xff5e;&#xff5e;&#xff5e;分割線啊分割線&#xff5e;&#xff5e;&#xff5e;

vscode終端不識別python_VSCode無法識別我的已安裝Python包

Windows上的VSCode與Python。 Don安裝的Python擴展&#xff0c;不確定它有什么不同&#xff0c;但考慮給我的環境使用VSCode for Python&#xff0c;在那個過程中&#xff0c;我安裝了metapy包。我能夠在VSCode中的終端窗口內運行此metapy&#xff0c;但不能在編輯器中運行PS C…

現在也是只能謝謝隨筆了,但是在以后收貨的日子里會有更多的感想記下

每天雖然都會在各個方面都記下一點日常事務的說明&#xff0c;但是會有重復&#xff0c;以后工作了向高中一樣一定會有許多的話&#xff0c;但是我不希望這是一些抱怨&#xff0c;更多的應該是收貨&#xff0c;這幾天也是早上不知怎么會有點頭疼&#xff0c;加上每天取暖口有點…

[轉載]AngularJS之Factory vs Service vs Provider

http://www.oschina.net/translate/angularjs-factory-vs-service-vs-provider http://tylermcginnis.com/angularjs-factory-vs-service-vs-provider/ 要注意的文章中&#xff0c;app.provider(...)里的代碼有點出處&#xff0c;之后作者改過&#xff0c;但是轉載的網站上圖片…

C#學習筆記:預處理指令

C#和C/C一樣&#xff0c;也支持預處理指令&#xff0c;下面我們來看看C#中的預處理指令。 #region 代碼折疊功能&#xff0c;配合#endregion使用&#xff0c;如下&#xff1a; 點擊后如下&#xff1a; 條件預處理 條件預處理可以根據給出的條件決定最終進行編譯的代碼&#xff…

android sh 指令_Java/Android中實現Shell命令

有時候我們需要實現一個功能。不過這個功能用我們傳統的Java代碼實現起來會有一些困難&#xff0c;這時我們可以嘗試利用Shell命令來實現。你可以按照下面的代碼模塊來進行你想要實現的Shell命令(注&#xff1a;也不是所有的Shell命令都能用Java代碼來實現)。public class Main…

【數字信號處理】 第二章、時域中的離散時間信號

前言 學而時習之,不亦樂乎&#xff1f; ——《論語學而》 Is it not pleasant to learn with a constant perseverance and application? 。 第二章 時域中的離散時間信號 一、離散信號的基本定義 1、兩個基本類型 抽樣數據類型&#xff1a;即模擬信號通過定周期進行采樣…

開機流程與主引導分區(MBR)——鳥哥私房菜

在前篇隨筆中&#xff0c;已經談到了CMOS與BIOS&#xff0c;CMOS是記錄各項硬件參數&#xff08;包括系統時間、設備的I/O地址、CPU的電壓和頻率等&#xff09;且嵌入到主板上面的存儲器&#xff0c;BIOS是一個寫入到主板上的韌體&#xff08;韌體是寫入到硬件上的一個軟件程序…

整車廠核心制造系統及數據流

轉載于:https://www.cnblogs.com/tallrain/p/MES_Auto_Core_System.html