2025-08-21 Python進階9——__main__與lambda

文章目錄

  • 1 \_\_main\_\_
    • 1.1 name 變量
      • 1.1.1 當模塊作為主程序直接運行時
      • 1.1.2 當模塊被其他模塊導入時
    • 1.2 \_\_main\_\_ 的含義
    • 1.3 if \_\_name\_\_ == \_\_main\_\_
    • 1.5 小結
  • 2 lambda表達式
    • 2.1 基本概念
    • 2.2 lambda 函數語法
    • 2.3 使用示例
    • 2.4 與高階函數結合使用
      • 2.4.1 與 map () 結合
      • 2.4.2 與 filter () 結合
      • 2.4.3 與 reduce () 結合
    • 2.5 lambda 函數 vs 常規函數(def)

1 __main__

1.1 name 變量

__name__ 是 Python 的一個內置變量,用于表示當前模塊的名稱。其值會根據模塊的使用方式而變化:

1.1.1 當模塊作為主程序直接運行時

此時 __name__ 的值被自動設置為 "__main__"

示例:創建一個 module.py 文件,內容如下:

print(f"模塊的 __name__ 值: {__name__}")

直接運行該文件(python module.py),輸出結果為:

模塊的 __name__ 值: __main__

1.1.2 當模塊被其他模塊導入時

此時 __name__ 的值被設置為該模塊的文件名(不包含 .py 擴展名)。

示例:創建另一個文件 import_module.py,內容如下:

import module  # 導入上面創建的 module.py

運行 import_module.py,輸出結果為:

模塊的 __name__ 值: module

1.2 __main__ 的含義

__main__ 是一個特殊的字符串常量,用于表示當前模塊是作為主程序運行的

它通常不單獨使用,而是與 __name__ 結合,用于判斷模塊的運行狀態:

  • __name__ == "__main__" 時,表明模塊是直接運行的
  • __name__ != "__main__" 時,表明模塊是被導入的

1.3 if __name__ == __main__

這是 Python 中一種非常常見的代碼模式,用于控制代碼在不同場景下的執行行為

  • 當模塊作為獨立腳本運行時,執行 if 塊內的代碼
  • 當模塊被其他模塊導入時,不執行 if 塊內的代碼

步驟 1:創建 example.py 文件:

def greet():print("來自 example 模塊的問候!")# 根據模塊運行方式執行不同代碼
if __name__ == "__main__":print("該腳本正在直接運行。")greet()  # 直接運行時調用函數
else:print("該腳本作為模塊被導入。")

步驟 2:直接運行 example.py

python example.py

輸出結果:

該腳本正在直接運行。
來自 example 模塊的問候!

步驟 3:創建 another_script.py 并導入 example

import example  # 導入模塊example.greet()  # 調用模塊中的函數

運行 another_script.py

python another_script.py

輸出結果:

該腳本作為模塊被導入。
來自 example 模塊的問候!

1.5 小結

  1. __name__ 是內置變量,表示當前模塊的名稱
    • 直接運行模塊時,__name__ = "__main__"
    • 模塊被導入時,__name__ = 模塊文件名(不含 .py
  2. if __name__ == "__main__": 是 Python 的常用模式
    • 用于區分模塊的兩種使用方式:直接運行 vs 被導入
    • 使模塊既可以作為獨立程序運行,又可以作為庫被其他模塊導入

2 lambda表達式

2.1 基本概念

lambda 函數是 Python 中一種特殊的函數形式,也被稱為匿名函數,即沒有正式名稱的函數。它旨在快速創建簡單的、單行的函數,尤其適合需要臨時使用的短小功能。

與常規函數(使用 def 定義)相比,lambda 函數的特點:

  • 匿名性:沒有函數名稱,只能通過賦值或作為參數傳遞使用
  • 簡潔性:通常只包含一行代碼和一個表達式
  • 臨時性:適用于短期使用的簡單功能

2.2 lambda 函數語法

lambda arguments: expression
  • lambda:Python 關鍵字,用于定義 lambda 函數
  • arguments:參數列表,可以包含 0 個或多個參數(用逗號分隔)
  • expression:一個表達式,用于計算并返回結果(lambda 函數的返回值)

注意:lambda 函數只能包含一個表達式,不能包含復雜的代碼塊(如循環、條件語句的多行形式等)

2.3 使用示例

無參數的 lambda 函數

# 定義無參數的 lambda 函數
f = lambda: "Hello, world!"# 調用函數
print(f())  # 輸出: Hello, world!

單個參數的 lambda 函數

# 定義接收一個參數的 lambda 函數(計算參數加 10)
x = lambda a: a + 10# 調用函數
print(x(5))  # 輸出: 15
print(x(10))  # 輸出: 20

多個參數的 lambda 函數

# 兩個參數:計算 a 乘以 b
multiply = lambda a, b: a * b
print(multiply(5, 6))  # 輸出: 30# 三個參數:計算 a + b + c
add_three = lambda a, b, c: a + b + c
print(add_three(5, 6, 2))  # 輸出: 13

帶默認參數的 lambda 函數

# 帶默認值的參數
greet = lambda name, greeting="Hello": f"{greeting}, {name}!"
print(greet("Alice"))  # 輸出: Hello, Alice!
print(greet("Bob", "Hi"))  # 輸出: Hi, Bob!

2.4 與高階函數結合使用

lambda 函數最常見的用途是作為參數傳遞給高階函數(接收函數作為參數的函數),如 map()filter()reduce() 等。

2.4.1 與 map () 結合

map(func, iterable) 會將函數應用于可迭代對象的每個元素,返回一個迭代器。

# 計算列表中每個元素的平方
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # 輸出: [1, 4, 9, 16, 25]# 處理多個可迭代對象
a = [1, 2, 3]
b = [4, 5, 6]
sum_list = list(map(lambda x, y: x + y, a, b))
print(sum_list)  # 輸出: [5, 7, 9]

2.4.2 與 filter () 結合

filter(func, iterable) 用于篩選可迭代對象中滿足函數條件的元素,返回一個迭代器。

# 篩選列表中的偶數
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 輸出: [2, 4, 6, 8]# 篩選長度大于 3 的字符串
words = ["apple", "cat", "banana", "dog", "grape"]
long_words = list(filter(lambda s: len(s) > 3, words))
print(long_words)  # 輸出: ['apple', 'banana', 'grape']

2.4.3 與 reduce () 結合

reduce(func, iterable) 用于對可迭代對象中的元素進行累積計算(需從 functools 導入)。

from functools import reduce# 計算列表元素的累積乘積
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product)  # 輸出: 120(1*2*3*4*5的結果)# 計算列表元素的累積和
sum_total = reduce(lambda x, y: x + y, numbers)
print(sum_total)  # 輸出: 15(1+2+3+4+5的結果)

2.5 lambda 函數 vs 常規函數(def)

特性lambda 函數常規函數(def)
名稱匿名,無名稱有函數名
定義使用 lambda 關鍵字使用 def 關鍵字
表達式只能有一個表達式可以包含多個語句和代碼塊
返回值自動返回表達式結果需要顯式使用 return 語句
文檔字符串不支持支持(可通過 doc 訪問)
適用場景簡單的單行功能,臨時使用復雜功能,需要復用的函數

示例對比

# 使用 lambda 定義
add_lambda = lambda a, b: a + b# 使用 def 定義
def add_def(a, b):return a + b# 功能相同
print(add_lambda(2, 3))  # 輸出: 5
print(add_def(2, 3))     # 輸出: 5

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93813.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93813.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93813.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java:將視頻上傳到騰訊云并通過騰訊云點播播放

功能需求:傳入一個videoFile也就是視頻字節流,返回騰訊云點播的視頻保存url需要在騰訊云中尋找的配置信息:導入的依賴:<!--騰訊云點播--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId&…

Unity3D物理游戲網絡同步指南

前言 Unity3D 物理游戲的網絡同步是一個復雜但非常核心的話題。要實現一個流暢、公平且可擴展的多人物理游戲&#xff0c;需要深入的理解和精心的設計。 下面我將為你全面解析 Unity3D 物理游戲的網絡同步&#xff0c;包括核心概念、主流方案、實現細節以及最佳實踐。 對惹&…

Amazon Redshift 訪問配置完整指南

概述 Amazon Redshift 是 AWS 提供的云端數據倉庫服務,支持多種訪問方式。本文將詳細介紹如何配置 IAM 權限、使用 AWS 控制臺 Query Editor v2,以及通過 SQL Workbench/J 等第三方工具連接 Redshift 集群。 目錄 環境準備 IAM 權限配置 Redshift 用戶管理 AWS 控制臺訪問 …

electron-vite_19配置環境變量

前端配罟環境變量主要通過項目根目錄下的.env系列文件實現&#xff0c;不同框架(如Vue、React)或構建工具(如Vite、Webpack)的具體操作略有差異&#xff0c;但核心邏輯均為通過環境變量文件區分開發、測試、生產等環境。方案1: 直接在根目錄新建.env文件 1.在根目錄新建 .env.d…

【python】arange用法

1. NumPy 里的 np.arangeimport numpy as np# 語法 np.arange([start, ]stop, [step, ], dtypeNone)參數說明&#xff1a;start&#xff1a;起始值&#xff08;默認 0&#xff09;stop&#xff1a;終止值&#xff08;不包含這個值&#xff09;step&#xff1a;步長&#xff08;…

力扣1005:k次取反后最大化的數組和

力扣1005:k次取反后最大化的數組和題目思路代碼題目 給你一個整數數組 nums 和一個整數 k &#xff0c;按以下方法修改該數組&#xff1a; 選擇某個下標 i 并將 nums[i] 替換為 -nums[i] 。 重復這個過程恰好 k 次。可以多次選擇同一個下標 i 。 以這種方式修改數組后&…

國產數據庫管理工具 CloudDM 2.7.1.0 發布,OceanBase 等數據源支持復雜 SQL 脫敏數據

CloudDM 是 ClouGence 公司推出的面向團隊使用的數據庫管理工具&#xff0c;支持云上、云下、多云等多種環境&#xff0c;并且提供多達 23 種數據源的支持。CloudDM 還支持數據庫 DevOps CI/CD 功能&#xff0c;將用戶產品發布流程中數據庫發布和程序發布無縫串聯起來。 更新亮…

AI大模型實戰:用自然語言處理技術高效處理日常瑣事

引言在數字化時代&#xff0c;我們每天都會面對大量的瑣碎事務&#xff1a;整理會議記錄、處理名單數據、撰寫學習筆記等等。這些工作不僅耗時&#xff0c;而且容易出錯。幸運的是&#xff0c;隨著人工智能技術的發展&#xff0c;特別是大語言模型&#xff08;LLM&#xff09;的…

【spring security】為什么要使用userdetailservice

Spring Security UserDetailsService 深度解析&#xff1a;從401到認證成功的完整實現 &#x1f4cb; 目錄 問題背景Spring Security認證架構UserDetailsService的作用完整實現過程常見問題與解決方案最佳實踐 &#x1f3af; 問題背景 在開發B2B采購平臺時&#xff0c;我們…

機器學習中的數據處理技巧

一、Pandas處理丟失數據&#xff08;一&#xff09;判斷缺失值??isnull()函數??&#xff1a;用于判斷數據框&#xff08;DataFrame&#xff09;中各個單元格是否為空&#xff0c;可幫助我們識別出存在缺失數據的單元格位置。&#xff08;二&#xff09;處理缺失值的方法??…

田野科技“一張皮”,“AI+虛擬仿真”推動考古教學創新發展

文運同國運相牽&#xff0c;文脈同國脈相連。考古不僅關系到我們對古代文化的認知、發掘、保護、利用&#xff0c;關系到考古學學科體系、學術體系、話語體系的建設&#xff0c;更是關系到我國考古學的國際影響力&#xff0c;對增強世界不同地區古代文明的比較研究有著十分重要…

為什么我的UI界面會突然卡頓,失去響應

有操作都應是“非阻塞”的&#xff0c;以確保能隨時響應用戶的輸入。導致主線程阻塞的常見“元兇”主要涵蓋五個方面&#xff1a;主線程被“長時間”的同步計算所“阻塞”、單次渲染的界面節點過多或過于復雜、內存中存在“未釋放”的巨大對象或“內存泄漏”、響應了“高頻率”…

大規模IP輪換對網站的影響(服務器壓力、風控)

在當下的互聯網環境中&#xff0c;代理IP輪換已經成為爬蟲、SEO、數據采集等行業的常見手段。尤其是大規模數據抓取時&#xff0c;通過代理池實現IP輪換&#xff0c;可以有效避免因單一IP請求過于頻繁而被目標網站封禁。 然而&#xff0c;大規模IP輪換雖然對采集方有利&#xf…

4. STM32 vscode 環境, 官方插件

文章目錄1. 新建配置2. 安裝插件3. 新建工程1. 新建配置 新建vscode 配置&#xff0c; 因為stm32插件比較多&#xff0c; 避免和其他插件沖突。 激活環境&#xff1a; 這里可快速切換&#xff1a; 2. 安裝插件 可選擇安裝最新預覽版&#xff1a; 等待依賴安裝完成后重啟…

【動態規劃:路徑問題】最小路徑和 地下城游戲

最小路徑和&#xff08;medium&#xff09; 64. 最小路徑和 ? 給定一個包含非負整數的 m x n 網格 grid &#xff0c;請找出一條從左上角到右下角的路徑&#xff0c;使得路徑上的數字總和為最小。 ? **說明&#xff1a;**每次只能向下或者向右移動一步。 示例 1&#xff…

SQL詳細語法教程(七)核心優化

以下對 SQL 優化 涉及的關鍵場景&#xff08;含 update 行鎖優化&#xff09;進行極致詳細的拆解&#xff0c;從底層原理、執行流程到實戰代碼、避坑指南全維度覆蓋&#xff0c;搭配表格對比讓邏輯更清晰&#xff1a;一、SQL 優化 - COUNT 優化1. 底層原理&#xff1a;COUNT() …

Tomcat 的核心腳本catalina.sh 和 startup.sh的關系

catalina.sh 和 startup.sh 都是 Tomcat 的核心腳本&#xff0c;但它們的角色和使用場景有所不同。以下是它們的主要區別和適用場景&#xff1a;1. 功能區別腳本主要用途底層調用關系startup.sh一個快捷入口腳本&#xff0c;用于快速啟動 Tomcat&#xff08;后臺模式&#xff0…

飛算JavaAI:簡易貪吃蛇小游戲

目錄先確定核心功能技術選型核心功能實現過程1. 數據模型設計2. 游戲界面和繪制邏輯3. 游戲主框架和事件處理飛算JavaAI在開發中的應用體驗可以進一步優化的地方作為Java課程的小作業&#xff0c;不想做太復雜的管理系統&#xff0c;就選了貪吃蛇這個經典小游戲。全程用Swing做…

如何保障內部網絡安全前提下,實現與外部互聯網之間的文件傳輸?

在數字化時代&#xff0c;企業網絡環境日益復雜&#xff0c;普遍采用“內外網隔離”的安全架構&#xff1a;內部辦公網承載業務系統與數據&#xff0c;外部互聯網則用于對外溝通與信息獲取。這種隔離有效抵御了外部攻擊&#xff0c;但也帶來了“信息孤島”問題——如何在保障內…

計算機視覺 圖片處理 在骨架化過程中,每次迭代都會從圖像的邊緣移除一層像素,直到只剩下單像素寬度的骨架

你說得對&#xff0c;if cv2.countNonZero(binary) 0: break 這個條件確實表示圖像中已經沒有非零像素&#xff0c;即圖像完全變為空白。這并不是骨架化完成的標志&#xff0c;而是表示圖像已經被腐蝕到沒有任何內容了。 在骨架化過程中&#xff0c;我們需要一個更合適的停止條…