遞迴,遞是遞進的意思,歸是歸來的意思
遞迴就是用函式在呼叫乙個函式的過程中,又直接或間接地呼叫了它自身。這樣函式會一層一層的遞進進去,如果沒有條件的話,他就會無限迴圈。如果有條件的話,當執行到條件中斷時,它就會一層一層的回來,直到最初的函式
直接呼叫指的是直接在函式內部呼叫函式自身
mport sys
# 修改遞迴層數
sys.setrecursionlimit(10000)
def foo(n):
print('from foo',n)
foo(n+1)
foo(0)
這個函式會遞迴10000次
間接呼叫指的是不在原函式體內呼叫函式,而是通過其他方法間接呼叫函式自身
def bar():
print('from bar')
foo()
def foo():
print('from foo')
bar()
bar()
這段**會無限迴圈 from foo from bar 直至到達python最大遞迴深度的時候,後面就會迴圈報錯
遞迴本質上還是解決問題的,並不為了讓一段**陷入死迴圈。所以一般在遞進的時候,為了達到乙個結果,使問題規模越來越小(不一定要真正達到),可以設定乙個條件,能夠讓最後偶一次函式呼叫結束
所以,遞迴更多的是一種思想
下面就用遞迴來實現幾個簡單的功能
遞迴實現從0到100的列印
count = 1 # 2 # 3
def f1():
global count # 下面的count是全域性的count
if count > 100:
return
count += 1 # 2 # 3
print(count) # 2 # 3
f1()
f1()
遞迴實現函式,年齡從16依次加2,輸入多少次就列印對應的年齡
def age_func(x): # x的規模在減小 # x = 5 # x =4 # x =3 # x =2 # x = 1 # x = 0
global age
if x == 0:
return age # 終止函式,age=26,這是age_func(0)
return age_func(x - 1) + 2 # 每次加2,向上回歸
res = age_func(5)
print(res) # 26
當然簡單的函式不用遞迴也可以,甚至更加的簡單
def func(n):
age = 16
age = age + 2 * n
return age
res = func(5)
print(res)
但是當你遇到一些複雜的函式,甚至爬蟲的時候,遞迴就會方便很多
print(abs(-10)) # 絕對值
print(bin(97)) # 二進位制
print(hex(97)) # 十六進製制
print(oct(97)) #八進位制
def func():
pass
print('callable(func):', callable(func)) # 是否能夠呼叫
print('callable([1,]):', callable([1, ]))
print('chr(97):', chr(97))
print(ord('a'))
callable返回true或者false
chr()參考ascii碼表將數字轉成對應字元
ord()將字元轉換成對應的數字
for ind, value in enumerate([1, 2, 3]):
print(ind, value)
# enumerate()帶有索引的迭代
print("eval('1+1'):", eval('1+1')) # 執行括號內部**
exec('print("1234234234")') # 執行括號內部**
結果為:
0 11 2
2 3eval('1+1'): 2
1234234234
print(all([1, 2, 3])) # 如果列表內所有元素的bool值都為真則為真
print(any([1, 2, 3])) # 如果列表內只要有乙個元素的bool值為真則為真
print(ascii([1, 234])) # 如果為ascii編碼則直接返回,否則轉二進位制
print(bytearray([1, 2, 3])) # 轉二進位制
print(bytes([1, 2, 3])) # 轉二進位制
結果為:
true
true
[1, 234]
bytearray(b'\x01\x02\x03')
b'\x01\x02\x03'
import time
print(dir(time)) # 列舉time所有功能
print(divmod(10, 3)) # 分欄(除之後數字,餘數)
s = frozenset() # 不可變集合
print(id(s))
print('globals():', globals()) # 全域性
print(hash('234234234')) # 無論你放入什麼字串,永遠返回乙個固定長度的隨機字串
print(pow(2, 3)) # 2的3次方
print(round(3.55)) # 取整
range(1,2,3)
s = slice(0,2,1)
lis = [1,1,23]
print(lis[s]) # lis[0:2:1]
print(sum([1,2,23])) # 相加
time = __import__('time') # 匯入模組的另外一種方式
print(time.time())
按照流程(流水線的思想)碼**
一堆變數/引數 --> 函式1(過程1) --> 函式2(過程2) --> 結果
函式3(過程3) --> 函式2(過程2)
優點:思路清晰
功能與功能之間相互不獨立
牽一髮而動全身,不方便進行修改,可擴充套件性差
可以將函式分為好幾個模組,模組之間相互關聯
def input_username_pwd():
username = input('username:')
pwd = input('pwd:')
return username, pwd
def read_file(filename):
with open(filename, 'r', encoding='utf8') as fr:
data = fr.read()
return data
def write_file(filename, data):
with open(filename, 'w', encoding='utf8') as fw:
fw.write(data)
def register():
username, pwd = input_username_pwd()
with open('user_info.txt', 'a', encoding='utf8') as fa:
fa.write(f':|')
def login():
username, pwd = input_username_pwd()
user_info = f':'
data = read_file('user_info.txt')
user_info_list = data.split('|')
if user_info in user_info_list:
print('登入成功')
else:
print('登入失敗')
register()
login()
物件導向方法與物件導向測試
物件導向 object oriented,oo 方法認為,客觀世界是由各種物件組成的,任何事物都是物件,每乙個物件都有自己的運動規律和內部狀態,都屬於某個物件類,是該物件類的乙個元素。複雜的物件可由相對簡單的各種物件以某種方式而構成,不同物件的組合及相互作用就構成了系統。oo方法是當前的主流開發方法...
php物件導向之建構函式作用與方法
什麼是建構函式呢?建構函式又有什麼作用呢?建構函式 是一種特殊的方法。主要用來在建立物件時初始化物件,即為物件成員變數賦初始值,總與new運算子一起使用在建立物件的語句中。特別的乙個類可以有多個建構函式 可根據其引數個數的不同或引數型別的不同來區分它們 即建構函式的過載。可能上面的描述大家還是不能很...
物件導向及屬性與方法
就是把一類具有相同屬性和動作的實體抽象成為計算機裡面的類,也就是物件的模板 圖紙 把屬性和方法封裝成乙個類中。處理業務的流程就是物件之間的資訊傳遞,把程式中的所有東西當做物件來進行處理。物件是記憶體中儲存指定資料的一塊區域,實際上物件就是乙個容器,專門用來儲存資料。由id 標識 type 型別 va...