面向過程與函數式 面向過程 ”面向過程“核心是“過程”二字,“過程”指的是解決問題的步驟,即先乾什麼再乾什麼......,基於面向過程開發程式就好比在設計一條流水線,是一種機械式的思維方式,這正好契合電腦的運行原理:任何程式的執行最終都需要轉換成cpu的指令流水按過程調度執行,即無論採用什麼語言、 ...
面向過程與函數式
面向過程
”面向過程“核心是“過程”二字,“過程”指的是解決問題的步驟,即先乾什麼再乾什麼......,基於面向過程開發程式就好比在設計一條流水線,是一種機械式的思維方式,這正好契合電腦的運行原理:任何程式的執行最終都需要轉換成cpu的指令流水按過程調度執行,即無論採用什麼語言、無論依據何種編程範式設計出的程式,最終的執行都是過程式的。
1、優點
將複雜的問題流程化,進而簡單化
2、缺點
程式的可擴展性極差,
3、應用場景
面向過程的程式設計一般用於那些功能一旦實現之後就很少需要改變的場景, 如果你只是寫一些簡單的腳本,去做一些一次性任務,用面向過程去實現是極好的,但如果你要處理的任務是複雜的,且需要不斷迭代和維護, 那還是用面向對象最為方便。
函數式
函數式編程並非用函數編程這麼簡單,而是將電腦的運算視為數學意義上的運算,比起面向過程,函數式更加註重的是執行結果而非執行的過程,代表語言有:Haskell、Erlang。而python並不是一門函數式編程語言,但是仍為我們提供了很多函數式編程好的特性,如lambda,map,reduce,filter
匿名函數lambda
對比使用def關鍵字創建的是有名字的函數,使用lambda關鍵字創建則是沒有名字的函數,即匿名函數,語法如下
lambda 參數1,參數2,...: expression
案例:
# 1、定義
lambda x,y,z:x+y+z
#等同於
def func(x,y,z):
return x+y+z
# 2、調用
# 方式一:
res=(lambda x,y,z:x+y+z)(1,2,3)
# 方式二:
func=lambda x,y,z:x+y+z # “匿名”的本質就是要沒有名字,所以此處為匿名函數指定名字是沒有意義的
res=func(1,2,3)
print(res)
匿名函數與有名函數有相同的作用域,但是匿名意味著引用計數為0,使用一次就釋放,所以匿名函數用於臨時使用一次的場景,匿名函數通常與其他函數配合使用
案例
salaries={
'siry':3000,
'tom':7000,
'lili':10000,
'jack':2000
}
要想取得薪水的最大值和最小值,我們可以使用內置函數max和min(為了方便開發,python解釋器已經為我們定義好了一系列常用的功能,稱之為內置的函數,我們只需要拿來使用即可)
print(max(salaries))
print(min(salaries))
#預設根據字元比較大小
"""結果如下"""
tom
jack
內置max和min都支持迭代器協議,工作原理都是迭代字典,取得是字典的鍵,因而比較的是鍵的最大和最小值,而我們想要的是比較值的最大值與最小值,於是做出如下改動
max1=max(salaries,key=lambda k:salaries[k])
print(max1)
min1=min(salaries,key=lambda k:salaries[k])
print(min1)
"""結果如下"""
lili
jack
直接對字典進行排序,預設也是按照字典的鍵去排序的
print(sorted(salaries))
"""結果如下"""
['jack', 'lili', 'siry', 'tom']
根據值的最大值與最小值排序
res=sorted(salaries,key=lambda k:salaries[k])
print(res)
"""結果如下"""
['jack', 'siry', 'tom', 'lili']
-
特點
- 使用lambda關鍵字創建函數
- 沒有名字的函數
- 匿名函數冒號後面的表達式只有一個,註意:是表達式,而不是語句
- 匿名函數自帶return,而這個return的結果是表達式計算後的結果
-
缺點
- lamdba只能是單個表達式:不是一個代碼塊,lamdba的設計就是為了滿足簡單的函數場景
- 僅僅能封裝有限的邏輯,複雜邏輯實現不了,必須使用def來處理
#匿名函數
m=lambda x,y:x+y
#通過變數去調用匿名函數
print(m(23,19))
M=lambda a,b,c:a*b*c
print(M(1,2,3))
age =15
print('可以繼續參軍,'if age>18 else'繼續上學')
C=lambda x,y:x if x>y else y
print(C(1,5))
re=(lambda x,y:x if x<y else y)(16,12)
print(re)
Rs=lambda x:(x**2)+890
print(Rs(10))
map、filter、reduce(瞭解)
l = ['zhoa', 'lisi', 'wangwu ']
res = map(lambda name: name + '_dsb', l)
print(res) # 生成器
res1 = filter(lambda name: name.endswith('u'), l)
print(res1)
from functools import reduce
res3=reduce(lambda x, y: x + y, [1, 2, 3],10)
print(res3)
"""結果如下"""
<map object at 0x0000014D2CDF7E80>
<filter object at 0x0000014D2CDF7D60>
16
本文來自博客園,作者:Expiredsaury,轉載請註明原文鏈接:https://www.cnblogs.com/saury/p/16739187.html