普通函數、參數、匿名函數、高階函數、遞歸函數、閉包、裝飾器

来源:https://www.cnblogs.com/tangyuanzi/archive/2022/09/04/16653067.html
-Advertisement-
Play Games

函數 定義 # 定義函數 def fn(): print("這是函數內部") # 調用 fn() fn() # 區分 fn: 這是真正意義上的函數本身 fn(): 這是調用函數 參數 形參 實參 函數參數可有可無,要看具體使用 形參是定義函數的參數 實參就是調用函數時需要傳遞的參數,函數有多少個形參 ...


函數

定義

# 定義函數
def fn():
   print("這是函數內部")

# 調用
fn()
fn()

# 區分
fn: 這是真正意義上的函數本身
fn(): 這是調用函數

參數

形參 實參

函數參數可有可無,要看具體使用

形參是定義函數的參數

實參就是調用函數時需要傳遞的參數,函數有多少個形參就要傳遞多少個實參

形參的 預設值參數

形參裡面可以設置預設值參數

def fn(a,b=1)
	print(a+b)

fn(1) # 正確 結果: 2
fn(1,2) # 正確 結果: 3

參數的傳遞方式

1.位置參數 
# 根據位置傳遞參數,缺點需要記住每一個參數的位置

2.關鍵字參數
def fn(a,b,c):
    pass
fn(b=1,a=2,c=3)

可變參數

*args: 可接受任意的位置參數,並保存在一個元組中
def fn(*args):
    pass
fn(1,2,3,4,5,6,7)

**kwargs: 可接受任意的關鍵字參數,並保存在一個字典中
def fn1(**kwargs):
    pass
fn(a=1,n=2,c=3,bb=1)

# 可接受任意參數
def fn(*args,**kwargs):
    pass

返回值

函數執行完之後一般都有結果,用return關鍵字來返回值

def fn():
    return 1

print(fn()) # 1
# fn = 返回值

如果函數中不屑返回值預設是None
def fn1():
    pass

print(fn1()) # None

高級用法

1.函數可以被引用

​ 將一個函數賦值給另一個變數,現在改變數相當於那個函數

2.函數可以作文參數傳入另一個函數

def fn():
    print('我是fn')
def fn2(x):  
    x()  # x() == fn()
fn2(fn)  # fn -> x

3.可以將函數作為返回值

def fn():
    print("這是fn")
    return fn1
def fn1():
    print("這是fn1")
fn()() # fn() 返回fn1相當於fn1() 列印'這是fn1'

4.函數可以是容器中的元素

def fn():
    print('這是fn')
list1 = [1,2,'hello',fn]
list1[3]() # 相當於調用fn,列印'這是fn'

匿名函數lambda

匿名函數: 沒有名字的函數

語法: lambda 參數列表:返回值(表達式)

lambda x : x+1 # 這就是一個匿名函數
匿名函數可以賦值給變數
fn = lambda x : x+1
等價於
def fn(x):
    return x+1

高階函數

高階函數: 就是函數作為參數的函數

普通函數:
    abs() # 求數字的絕對值
    round() # 四捨五入,但是準換為二進位的時候精度缺失,實際是 奇數時四捨五入,偶數5舍大於5入
    
定義一個高級函數:
    def func(a,b,fn):
        return fn(a)+fn(b)
    print(func(3,-5,abs)) # 8
    print(func(3.4,4.5,round)) # 7 
高階函數:
    1.map()
    規則: 必須只有一個形參
    語法: map(fn,list)
    # 將fn作用到序列中每一個元素中,結果返回一個迭代器
        list1 = [1,2,3,4]
        print(list(map(lambda x:x*x,list1))) # [1, 4, 9, 16]
        # 註意原列表不會改變
	2.filter()
	語法:filter(fn,list)
	# 將fn作用到序列中每一個元素中,結果返回一個迭代器
	# 用域過濾序列,過濾掉不符合的元素
		list2 = [i for i in range(1,11)]
		print(list(filter(lambda x:x%2==0,list2))) # [2, 4, 6, 8, 10]
	3.sorted()
	語法:sorted(list,key=)
	# 將序列進行排序,返回一個序列
		# 以成績排序降序
		list3 = ["小李子=150","小紅=99","小明=79","小張=89","小川=92"]
		print(sorted(list3,key=lambda x:int(x.split("=")[1])))
		# ['小明=79', '小張=89', '小川=92', '小紅=99', '小李子=150']
	4.reduce() # 該函數需要導入functools
	語法:reduce(fn,list)
	# 把序列中的元素做累計計算,結果返回一個序列
		# 計算從1加到10
		from functools import reduce
		list4 = [i for i in range(1,11)]
		print(reduce(lambda x,y:x+y,list4)) # 55

遞歸函數

如果一個函數在自己的內部調用了他自己,就叫做遞歸

先進後出,後進先出

使用遞歸必須設置出口

# 設計一個階乘
def fn(x):
    if x == 1 : # 1的階乘結果等於1
        return 1
    return x*fn(x-1) # 如果不是1那麼就等於這個數乘這個數減一的階乘

# 例如5的階乘推導
f(5) = 5 * f(4)
     = 5 * 4 * f(3)
     = 5 * 4 * 3 * f(2)
     = 5 * 4 * 3 * 2 * f(1)
     = 5 * 4 * 3 * 2 * 1
        

閉包

閉包:如果在一個內部函數,對在外作用域(但不是全局作用域)的變數進行了引用,呢麽內部函數就叫做閉包

是一個內部函數

使用了外部環境(非全局)

閉包 = 內部函數 + 定義函數的環境

裝飾器

作用: 在不修改原來函數的情況下, 拓展功能

開放封閉原則:

​ 開放: 對於拓展功能進行開放

​ 封閉: 不可修改原函數

def new_fn(func):
    def inner(*args,**kwargs):
        ...
        res = func(*args,**kwargs)
        ...
        return res
    reutrn inner

@new_fn # a = new_fn(a)
def a():
    pass
a() -> new_fn(a)() -> inner() 中間有閉包環節

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • http請求調用是開發中經常會用到的功能。在內,調用自有項目的Web Api等形式介面時會用到;在外,調用一些第三方功能介面時,也會用到,因為,這些第三方功能往往是通過http地址的形式提供的,比如:簡訊服務、線上翻譯、地圖服務、語音智能、等… http請求調用,主要又分為Post與Get兩種形式。 ...
  • 代理模式、適配器模式與裝飾器模式 這三種設計模式在代碼形式上十分相似。但是為瞭解決不同的問題而提出的: 代理模式 代理模式在不改變原始介面的條件下,為原始類控制訪問、新增一些業務無關的功能。 適配器模式 將不相容的介面轉換為可相容的介面。(一種以修正為目的的設計模式)。 裝飾器模式 裝飾器模式是對原 ...
  • SaaS產品就像一座冰山,冰山以上的部分是功能、數據(可見部分)、用戶界面,冰山以下是系統架構、完整的數據模型、開放體系、非功能性需求(擴展性、可維護性、性能、安全等)。 短期內想要快速上線產品,可能只需關註冰山以上的部分就夠了,但是SaaS公司想要在市場上建立長期的競爭優勢,比拼的一定是冰山以下的 ...
  • 以下內容為本人的著作,如需要轉載,請聲明原文鏈接 微信公眾號「englyf」https://www.cnblogs.com/englyf/p/16656222.html 大小端存儲的劃分是為瞭解決長度大於一個位元組的數據類型內容在存儲地址上以不同順序分佈的問題。 比如16位的short整形,32位的i ...
  • 線程基礎02 3.繼承Thread和實現Runnable的區別 從java的設計來看,通過繼承Thread或者實現Runnable介面本身來創建線程本質上沒有區別,從jdk幫助文檔我們可以看到Thread類本身就實現了Runnable介面 實現Runnable介面方式更加適合多個線程共用一個資源的情 ...
  • 內置函數 # 1.abs函數 print(abs(-1)) # 絕對值方法 # 2.all函數 print(all([1,'aaa',''])) # false print(all([])) # true #all方法裡面是一個可迭代對象,all會自動將這個對象for迴圈一下,如果所有的值為true ...
  • 簡介 本項目是在newbee-mall項目的基礎上改造而來, 使用mybatis-plus,集成RedisSearch作為商城搜索中間件,商城首頁集成tianai-captcha作為滑塊驗證碼,還添加了高級秒殺、優惠劵以及完善可用的後臺全部功能,喜歡的話麻煩給我個star 商城集成RedisSear ...
  • 目錄 一.OpenGL ES圖像對比度調節 1.原始圖片 2.效果演示 二.OpenGL ES 圖像對比度調節源碼下載 三.猜你喜歡 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...