學習python第五天

來源:互聯網
上載者:User

標籤:對應關係   hex   問題   pytho   缺點   永久   結束   保留   struct   

一、函數遞迴

二、二分法

三、匿名函數lambda

四、內建函數

五、模組的使用

六、包

 

 

一、函數遞迴

什麼是函數遞迴?

在調用一個函數的時候,直接或者間接調用到自身就是函數遞迴

def salary(n):
if n == 1:
return 100
return salary(n-1)+300 #res=salary(n-1)+300 return res 在res沒有獲得最終值的情況下無法繼續執行return,so res至確定最終值後執行return

print(salary(5))

 

函數遞迴的使用與缺點:

python中的遞迴效率低,需要在進入下一遞迴時儲存當前的狀態,沒有最佳化的方法,而且還針對函數遞迴的層級做了限制預設的層級是1000層,但是這個限制的層級是可以修改的

總結函數遞迴使用的3個先決條件

1.必須要有一個明確的結束條件

2.每次進入更深一層遞迴時,問題的規模相比上次遞迴都應有所減少

3.遞迴效率不高,遞迴層次過多時會導致棧溢出(在電腦中,函數調用是通過棧(stack)這種資料結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回就會減一層棧幀,由於棧的大小不是無限的,so調用的次數過多會導致棧溢出)

修改函數遞迴最大深度

import sys

sys.getrecursionlimit()  #查看最大遞迴深度

sys.setrecursionlimit(3000) #修改最大遞迴深度為3000

 

二、二分法

二分法使用的環境,一個有序並且資料量相對較大的資料類型環境中使用

執行個體:在一個有序的列表中找到需要的值

做法:取列表中間值比較,依次列推。

l=[1,2,3,4,5,6,7,8,9,12,14,100,222,444,555,666,11111]
def s(n,l):
print(l)
if len(l) > 0:
mid=len(l) // 2
if n > l[mid]:
l=l[mid+1:]
elif n < l[mid]:
l=l[:mid]
else:
print("find it")
return
s(n,l) #執行上述語句後會將L進行切片,在把切片後結果交給自身函數處理
s(100,l)

 

 

三、匿名函數lambda

什麼是匿名函數:

就是沒有名字的函數,隨時定義使用,一次使用過後釋放記憶體,清空函數

匿名函數的定義方式:

def func(x,y,z=0):

  return x+y+z

lambda x,y,z=1:x+y+z

lambda是定義匿名函數的關鍵字,xyz是參數後以:分割,預設不用寫return。

匿名函數和有名字的函數的對比:

有名字的函數:迴圈使用,儲存了名字,通過名字就可以重複引用函數功能

匿名函數:一次性使用,隨時定義

 

 

四、內建函數

print(abs(-1))#數字絕對值
print(all([1,23,3,4,0]))#接收的值是產生器對象,判斷裡面加有的值,其中的值包含none,0,false等值時會print false,反之提示true
print(any([1,0]))#接收的值是產生器對象,判斷裡面加有的值,其中所有的值等於none,0,false時會print false,反之提示true(只要有一個正確的值就會顯示true)
print(sorted([1,3,2,5,4,9,6]))#針對資料進行排序
bin()#10進位轉換2進位
oct()#10進位轉換8進位
hex()#10進位轉換16進位
max()#求最大值
min()#求最小值
complex()#複數2-4j print(x.real)實數 print(x.imag)虛數
sorted()#接收的值為可迭代對象功能是針對可迭代對象的排序功能
l=‘adaf‘
reversed(l)
round(1.2345,3)#保留小數點後3位四捨五入
print(sum(range(100)))#求和,遵循迭代器原則,都是取一個值算一次
l=‘adfadfadfadf‘
obj=slice(1,5,2)
print(l[obj])#設定切片規則
bool()#求bool值0 none 空時為假false
chr()#把數字通過accise的對應關係轉換成字母65-90 A-Z
ord()#把字元通過accise碼的對應關係轉換成數字
divmod(10,3)#等於10除3得到(3,1)包含商和餘數
enumerate([1,2,3,4])#接受可迭代對象結果是將可迭代對象的引所和元素組成一個元組
id()#對比資料但是不是真實的記憶體位址,在有記憶體位址的情況下,要以記憶體位址為準
[].index()#尋找列表,字串索引
isinstance()#比較類型
iter()#可迭代
len()#計算長度
open()#開啟檔案
pow(10,2,3)#10的二次方對3取餘
type#查看資料類型
zip()#拉鏈
eval #提取運算式執行,並返回執行結果
s1=‘1+2+3‘
s2="[‘a‘,‘b‘]"
print(eval(s2)) [a,b]
print(eval(s1)) 6

exec:僅僅只是執行字串內的運算式或語句,並且沒有傳回值

 

五、模組的使用

什麼是模組:

#常見的情境:一個模組就是一個包含了python定義和聲明的檔案(檔案名稱就是模組名字加上.py的尾碼),模組可以被匯入使用。

#但其實import載入的模組分為四個通用類別: 
使用python編寫的.py檔案
已被編譯為共用庫或DLL的C或C++擴充
把一系列模組組織到一起的檔案夾(註:檔案夾下有一個__init__.py檔案,該檔案夾稱之為包)
使用C編寫並連結到python解譯器的內建模組

 

 

為什麼需要模組:

#如果你退出python解譯器然後重新進入,那麼你之前定義的函數或者變數都將丟失,因此我們通常將程式寫到檔案中以便永久儲存下來,需要時就通過python test.py方式去執行,此時test.py被稱為指令碼script。

#隨著程式的發展,功能越來越多,為了方便管理,我們通常將程式分成一個個的檔案,這樣做程式的結構更清晰,方便管理。這時我們不僅僅可以把這些檔案當做指令碼去執行,還可以把他們當做模組來匯入到其他的模組中,實現了功能的重複利用

#同樣的原理,我們也可以下載別人寫好的模組然後匯入到自己的項目中使用,這種拿來主義,可以極大地提升我們的開發效率

 

 

模組的使用:

#模組可以包含可執行檔語句和函數的定義,這些語句的目的是初始化模組,它們只在模組名第一次遇到匯入import語句時才執行(import語句是可以在程式中的任意位置使用的,且針對同一個模組很import多次,為了防止你重複匯入,python的最佳化手段是:第一次匯入後就將模組名載入到記憶體了,後續的import語句僅是對已經載入大記憶體中的模組對象增加了一次引用,不會重新執行模組內的語句),如下

#test.py
import spam #只在第一次匯入時才執行spam.py內代碼,此處的顯式效果是只列印一次‘from the spam.py‘,當然其他的頂級代碼也都被執行了,只不過沒有顯示效果.
import spam
import spam
import spam

‘‘‘
執行結果:
from the spam.py
‘‘‘

 

首次import時,系統的操作:

#1.為源檔案(spam模組)建立新的名稱空間,在spam中定義的函數和方法若是使用到了global時訪問的就是這個名稱空間。

#2.在新建立的命名空間中執行模組中包含的代碼,見初始匯入import spam
提示:匯入模組時到底執行了什嗎?
In fact function definitions are also ‘statements’ that are
‘executed’; the execution of a module-level function definition
enters the function name in the module’s global symbol table.
事實上函數定義也是“被執行”的語句,模組層級別函數定義的執行將函數名放
入模組全域名稱空間表,用globals()可以查看

#3.建立名字spam來引用該命名空間
這個名字和變數名沒什麼區別,都是‘第一類的’,且使用spam.名字的方式
可以訪問spam.py檔案中定義的名字,spam.名字與test.py中的名字來自
兩個完全不同的地方。

 

特性:

1.每個模組都是一個獨立的名稱空間,定義在這個模組中的函數,把這個模組的名稱空間當做全域名稱空間,這樣我們在編寫自己的模組時,就不用擔心我們定義在自己模組中全域變數會在被匯入時,與使用者的全域變數衝突

2.import模組時可以修改模組名稱 import spam as sm

3.模組的尋找順序是:記憶體中已經載入的模組——》內建模組——》sys.path包含的模組

 

六、包

什麼是包:

#官網解釋
Packages are a way of structuring Python’s module namespace by using “dotted module names”
包是一種通過使用‘.模組名’來組織python模組名稱空間的方式。

#具體的:包就是一個包含有__init__.py檔案的檔案夾,所以其實我們建立包的目的就是為了用檔案夾將檔案/模組組織起來

#需要強調的是:
  1. 在python3中,即使包下沒有__init__.py檔案,import 包仍然不會報錯,而在python2中,包下一定要有該檔案,否則import 包報錯

  2. 建立包的目的不是為了運行,而是被匯入使用,記住,包只是模組的一種形式而已,包的本質就是一種模組

為什麼要有包:

包的本質就是一個檔案夾,那麼檔案夾唯一的功能就是將檔案組織起來隨著功能越寫越多,我們無法將所以功能都放到一個檔案中,於是我們使用模組去組織功能,而隨著模組越來越多,我們就需要用檔案夾將模組檔案組織起來,以此來提高程式的結構性和可維護性

注意事項:

#1.關於包相關的匯入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什麼位置,在匯入時都必須遵循一個原則:凡是在匯入時帶點的,點的左邊都必須是一個包,否則非法。可以帶有一連串的點,如item.subitem.subsubitem,但都必須遵循這個原則。但對於匯入後,在使用時就沒有這種限制了,點的左邊可以是包,模組,函數,類(它們都可以用點的方式調用自己的屬性)。

#2、import匯入檔案時,產生名稱空間中的名字來源於檔案,import 包,產生的名稱空間的名字同樣來源於檔案,即包下的__init__.py,匯入包本質就是在匯入該檔案

#3、包A和包B下有同名模組也不會衝突,如A.a與B.a來自倆個命名空間

 

學習python第五天

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.