5.函式和lambda表示式

jason8826發表於2024-05-10
# python函式
def fun():
    return 1,"abcd",2>1
print(fun())
print(type(fun()))
print(fun()[1])

# 值傳遞和引用(地址)傳遞
# 值傳遞:適用於實參型別為不可變型別(字串、數字、元組)
# 引用(地址)傳遞:適用於實參型別為可變型別(列表、字典)
# 區別:值傳遞,形參改變,不會改變實參的值;引用傳遞,形參改變,會改變實參的值。
list1 = [1,2]
def fun(obj):
    obj[0] = 2
    print('形參的值', obj)
fun(list1)
print('實參的值', list1)

# 關鍵字引數
# 特點:1、對引數位置沒有要求;2、但如果位置引數和關鍵字引數混用時,關鍵字引數必須位於所有位置引數之後。
def fun(str1,str2):
    print('str1:', str1, end=' ')
    print('str2:', str2)
fun('111', '222')
fun('111', str2='222')
fun(str2='222', str1='111')

# 預設引數
# 定義函式時,預設引數必須位於所有沒有預設值引數的後面。
def fun(str1,str2='444'):
    print('str1:', str1, end=' ')
    print('str2:', str2)
fun('333','555')
fun('333')

# 可變引數
# 接收的實引數量不確定時,建立形參*obj,相當於建立了一個名為obj的空元組,並將接收到的引數封裝進去
def fun(*obj):
    print('可變引數',obj)
fun('str1','str2')
# 位置引數+可變引數(非關鍵字引數)
# 需要將可變引數的形參放在最後
def fun(str1,*obj):
    print('位置引數',str1,'可變引數(非關鍵字引數)',obj)
fun('str1','str2','str3')
# 位置引數+可變引數(關鍵字引數)
# 建立形參**obj,相當於建立了一個名為obj的空字典,並將接收到的引數封裝進去
def fun(str1,**obj):
    print('位置引數',str1,'可變引數(關鍵字引數)',obj)
fun('str1',str2='2',str3='3')
# 位置引數+可變引數(非關鍵字引數)+可變引數(關鍵字引數)
def fun(str1,*obj1,**obj2):
    print('位置引數',str1,'可變引數(非關鍵字引數)',obj1,'可變引數(關鍵字引數)',obj2)
fun('str1','str2',str3='3')

# 逆向引數收集
# 列表、元組前新增*,字典前新增**
def fun(a,b):
    print(a,b)
list1 = (1,2)
dict1 = {'a':3, 'b':4} # 字典的key必須與函式的形參一致
fun(*list1)
fun(**dict1)

# 多個返回值
# 多個值以元組的方式返回
def fun(a,b):
    return a,b,a+b
print(fun(1,2))

# partial偏函式
from functools import partial
def fun(a,b):
    print(a,b)
fun1 = partial(fun,a=1)
fun2 = partial(fun,1)
fun1(b=2) # 此處必須使用關鍵字引數,使用位置引數為被認為按位置傳參給a,程式會報錯
fun2(2)

# 全域性變數
a = "全域性變數" # 函式外定義的變數,一定是全域性變數
def fun():
    print(a)
fun()
# 函式內定義全域性變數
def fun():
    global a
    a = "函式內的全域性變數"
    print(a)
fun()
print('print自己列印', a)

# 函式賦值給其它變數執行
def fun():
    print("函式賦值給其它變數,使用其他變數來呼叫函式")
fun1=fun
fun1()

# 閉包函式(又稱閉合函式)
# 閉包中外部函式返回的不是一個具體的值,而是一個函式。
# 一般情況下,返回的函式會賦值給一個變數,這個變數可以在後面被繼續執行呼叫。
def fun(a):
    def fun1(b):
        return b**a
    return fun1
square = fun(2) # 計算平方
cube = fun(3) # 計算立方
print(square(10))
print(cube(10))

# lambda表示式(又稱匿名函式),常用來表示內部僅包含1行表示式的函式。
# 格式:name = lambda [list] : 表示式
# [list]:可選引數,函式的引數列表
add = lambda x,y:x+y
print(add(1,2))
'''相當於
def add(x,y):
    return x+y
'''
# 優勢
# 1、對於單行函式,使用lambda表示式可以省去定義函式的過程,讓程式碼更加簡潔;
# 2、對於不需要多次複用的函式,使用lambda表示式可以在用完之後立即釋放,提高程式執行的效能

# eval()和exec(),用於執行字串表示式(字串一定要是可執行的程式碼),在使用Python開發服務端程式時,這兩個函式應用得非常廣泛。
# 區別eval返回結果,exec返回None
# 格式:eval或exec(str[,globals[,locals]])
# globals:變數作用域,全域性名稱空間,如果沒有提供這個引數,預設使用python的全域性名稱空間
# locals:變數作用域,區域性名稱空間,locals的變數與globals衝突時,以locals為準
a=10
b=20
c=30
g={'a':6, 'b':8} #定義一個字典
t={'b':100, 'c':10} #定義一個字典
print('eval返回的結果',eval('a+b+c',g,t))
print('exec返回的結果',exec('a+b+c',g,t))

# 函數語言程式設計
# map(function, iterable, ...)根據提供的函式對指定序列做對映
list1 = [1,2,3,4]
list2 = [2,3,4,5]
newlist = map(lambda x,y:x+y, list1,list2)
print(list(newlist))
# filter(function, iterable)
# 對iterable中的每個元素都用function函式判斷,並返回True或False,最後將返回True的元素組成一個新的可遍歷集合
newlist = filter(lambda x:0==x%2, list1)
print(list(newlist))
# reduce(funtion, iterable)對一個集合做一些累積操作
import functools # reduce()在python3.x中已經被移除,放入functools模組
sum1 = functools.reduce(lambda x,y:x+y, list1)
product = functools.reduce(lambda x,y:x*y, list1)
print(sum1)
print(product)

相關文章