12 函式式程式設計

2022-08-19 20:18:09 字數 4919 閱讀 6716

函式是程式設計(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))

reduce
from 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"))

zip
l1 = [1,2,3,4,5,6,7]

l2 = [11,12,13,14,15,16]

z = zip(l1,l2)

print(tuple(z))

enumerate
l1 = [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 而且 演算的函式可以接受函式當...