函式是程式設計(functional programming)
python函式式程式設計只是借鑑函式式程式設計的一些特點,可以理解成一般函式式一般python
需要講述
lambda表示式
lambda表示式(匿名函式):
# lambda表示式的用法
# 1.以lamnda開頭
# 2.緊跟一定的引數(有的話)
# 3.引數後用冒號和表示式主題隔開
# 4.只是乙個表示式,所以沒有return
# 計算乙個數字的100倍數
stm = lambda x: 100 * x
print(stm(89))
stm2 = lambda x,y,z: x + y * 10 + z * 100
print(stm2(4,5,6))
高階函式# 函式名稱是變數
# 函式名稱就是乙個變數
# 既然函式名稱是變數,則應該可以被當做引數傳入另乙個函式
'''# 高階函式舉例
# funa是普通函式,返回乙個傳入數字的100倍數字
def funa(n):
return n * 100
# 再寫乙個函式,把傳入引數乘以300倍,利用高階函式
def funb(n):
# 最終是想返回300n
return funa(n) * 3
print(funb(9))
# 寫乙個高階函式
def func(n,f):
# 假定函式是把n擴大100倍
return f(n) * 3
print(func(9,funa))
系統高階函式-map# 利用map
l1=[i for i in range(11)]
print(l1)
def multen(n):
return n*10
l3 = map(multen, l1)
print(list(l3))
reducefrom functools import reduce
# 定義乙個操作函式
# 加入操作做函式只是相加
def myadd(x,y):
return x * y
# 對於列表[1,2,3,4,5,6]執行myadd的reduce操作
rst = reduce(myadd,[1,2,3,4,5])
print(rst)
filter過濾函式
filter函式怎麼寫
# filter案例
# 對於乙個列表,對其進行過濾,偶數組成乙個新列表
# 需要定義過濾函式
# 過濾函式要求有輸入,返回布林值
def iseven(a):
return a % 2 == 0
l = [3,4,64,4322,6554,342,65,867]
rst = filter(iseven, l)
# 返回的filter內容是乙個可迭代物件
print(list(rst))
高階函式-排序sorted# 排序的案例
a = [-21,321,432242,-4322,21,43,-564,2334]
al = sorted(a)
print(al)
# 按照絕對值進行排序
# abs是求絕對值的意思
# 即按照絕對值的倒序排序
a1 = sorted(a, key=abs, reverse=true)
print(a1)
astr = ['dana', 'danaa', 'jjc', 'wcx']
str1 = sorted(astr)
print(str1)
str2 = sorted(astr, key=str.lower)
print(str2)
返回函式# 定義乙個普通函式
def myf(a):
print('in myf')
return none
a = myf(8)
print(a)
# 函式作為返回值返回,被返回的函式在函式體內定義
def myf2():
def myf3():
print("in myf3")
return 3
return myf3
# 使用上面定義
# 呼叫myf2,返回乙個函式myf3,賦值給f3
f3 = myf2()
print(f3())
def myf4( *args):
def myf5():
rst = 0
for n in args:
rst += n
return rst
return myf5
f5 = myf4(1,2,3,4,5,6,7)
print(f5())
閉包# 閉包常見坑
def count():
# 定義列表
fs =
for i in range(1,4):
def f():
return i*i
return fs
f1,f2,f3 = count()
print(f1())
## 出現的問題:
- 造成上述狀況的原因是,返回函式引用了變數i,i並非立即執行,而是等到三個函式都返回的時候才統一使用,此時i已經變成了3,最終呼叫的時候,都返回的是3*3
- 此問題描述成:返回閉包時,返回函式不能引用任何迴圈變數
- 解決方案:在建立乙個函式,用該函式的引數繫結迴圈變數的當前值,無論該迴圈變數以後如何改變,已經繫結的函式引數值不再改變
def count1():
def f(j):
def g():
return j*j
return g
fs =
for i in range(1,4):
return fs
f1,f2,f3 = count1()
print(f1())
print(f2())
print(f3())
裝飾器(decrator)import time
# 高階函式,以函式作為引數
def printtime(f):
print("time:", time.ctime())
return f(*args, **kwargs)
# 上面定義了裝飾器,使用的時候需要用到@,此符號是python的語法糖
@printtime
def hello():
print("hello world")
hello()
# 裝飾器的好處是,一點定義,則可以裝飾任意函式
# 一旦被其裝飾,則把裝飾器的功能直接新增到定義函式的功能上
# 上面對函式的裝飾使用了系統定義的語法糖
hello =printtime(hello)
hello()
偏函式#
i = int("100e", base=32)
print(i)
# 新建乙個函式,此函式是預設輸入的字串是16進製制數字
# 把次字串返回十進位制的數字
def int16(x, base=16):
return int(x,base)
t = int16("12345")
print(t)
import functools
# 實現上面int16的功能
int16 = functools.partial(int, base=16)
print(int16("12345"))
zipl1 = [1,2,3,4,5,6,7]
l2 = [11,12,13,14,15,16]
z = zip(l1,l2)
print(tuple(z))
enumeratel1 = [1,2,3,4,5,6,7]
em = enumerate(l1)
l3 = [i for i in em]
print(l3)
collections模組
deque
counter
# cellections
import collections
point = collections.namedtuple("point",['x', 'y'])
p = point(11,22)
print(p.x)
print(p[0])
circle = collections.namedtuple("circle", ['x', 'y', 'r'])
c = circle(100,150,10)
print(c)
# deque
from collections import deque
q = deque(['a', 'b', 'c'])
print(q)
print(q)
print(q)
# counter
from collections import counter
c = counter('dghasjkdahduqahwfh')
print(c)
s = ['jjc', 'jjc', 'jjc', 'sdaa', 'wsd', 'wcx', 'wcx']
d = counter(s)
print(d)
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
函式式程式設計
最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...
函式式程式設計
維基百科 函式式程式設計 英語 functional programming 或者函式程式設計,又稱泛函程式設計,是一種程式設計范型,它將計算機運算視為數學上的函式計算,並且避免使用程式狀態以及易變物件。函式程式語言最重要的基礎是 演算 lambda calculus 而且 演算的函式可以接受函式當...