函式方法與物件導向

2022-02-16 13:09:40 字數 4209 閱讀 4406

遞迴,遞是遞進的意思,歸是歸來的意思

遞迴就是用函式在呼叫乙個函式的過程中,又直接或間接地呼叫了它自身。這樣函式會一層一層的遞進進去,如果沒有條件的話,他就會無限迴圈。如果有條件的話,當執行到條件中斷時,它就會一層一層的回來,直到最初的函式

直接呼叫指的是直接在函式內部呼叫函式自身

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...