天天看點

python——函數式程式設計,引用全解

9.函數式程式設計

  • 函數式程式設計是種程式設計方式,它将電腦運算視為函數的計算。函數程式設計語言最重要的基礎是λ演算(lambda calculus),而且λ演算的函數可以接受函數當作輸入(參數)和輸出(傳回值)。
  • 函數是組織好的,可重複使用的,用來實作單一,或相關聯功能的代碼段。

    函數能提高應用的子產品性,和代碼的重複使用率。你已經知道Python提供了許多内建函數,比如print()。但你也可以自己建立函數,這被叫做使用者自定義函數。

  • 關鍵字def
  • 定義如下
def function(參數1,參數2,...):
代碼塊
return ???

# 調用 
function(參數1,參數2,...)
      

參數傳

在 python 中,類型屬于對象,變量是沒有類型的:

def sayHello():
print("hello")

sayHello()

def func2(i):
print(type(i))

func2(1)  # <class 'int'>
func2("1")  # <class 'str'>
func2(1.0)  # <class 'float'>
func2(True)  # <class 'bool'>
func2([1, 2, 3, 4])  # <class 'list'>
func2((1, 2, 3))  # <class 'tuple'>
func2({1, 2, 3})  # <class 'set'>
func2({1: "你好", 2: "吃了嘛", 3: "在幹啥"})  # <class 'dict'>
      

傳回值

在python中傳回值可以沒有也可以有多個!沒有傳回值時預設為None

# 以 *開頭的參數叫不定長參數,一個函數的不定長參數隻能有一個且隻能是最後一個參數,調用時會以元組的形式傳入
def func1(a, *args):
print(args)
return a, args


def func2():
return


ret = func1(1, 2)  # (2,)
print(ret)  # (1, (2,))


def func3(*args):
return args


a, b, c = func3(1, 2, 3)  # 可以通過這種方式取出元組裡的值

print(a)
print(b)
print(c)
      

作用域

  • 直接解除安裝外邊的變量和函數等等的一切的命名空間稱之為全局作用域
  • 函數内部定義的變量函數等,命名空間稱之為函數作用域或局部作用域
  • 函數内部可以直接通路全局作用域的變量和函數
a = 10
b = 20


def func1():
b = 10
# print(a)  # 直接通路外部的
print(b)  # 當函數内部有這個變量時會優先使用内部的變量
print(globals())  # 檢視命名空間全局作用域的命名空間

# 如果 要在函數裡頂一個全局變量或者使用全局變量覆寫要先聲明
global c  # 一般不會在這裡定義全局變量
c = 10

# 如果我們希望在函數裡直接修改全局作用的變量需要先聲明否則無法修改,
global a  # 一般放在開頭
a = a - 10


func1()
print(c)
print(a)
      

值傳遞與引用傳遞

  • 值傳遞是指将數值傳遞給參數
  • 引用傳遞是指把變量的引用傳遞給參數
  • 在python中是值傳遞
a = 10

def test(a):
print("修改前a", a)
a = a - 10  # 
print("修改後a", a)

test(a)
print(a)  # 函數内部并不會改變外部的變量
      

函數的引用

  • 函數的引用就是把函數本身作傳遞給某個變量
def function():
print("我是fun1")

a = function  # 函數的引用,将function這個函數像變量一樣指派給a

a()  # 調用 function
      

lambda函數

  • lambda 函數是匿名函數
  • 定義如下
lambda 參數1,參數2...: 語句
      
  • 用法
a = 10
b = 10

fun = lambda x, y: x > 1 and y < 10 

c = fun(a, b)  # False
print(c)

print((lambda x: x > 10)(a))  # False