12函數進階

来源:https://www.cnblogs.com/daguo118/archive/2023/04/13/17314962.html
-Advertisement-
Play Games

函數進階 函數的作用域 作用域又可以被稱為命名空間,指變數起作用的範圍。Python變數作用域可以分為四種,分別為局部作用域、嵌套作用域、全局作用域、內置作用域。 | 作用域 | 英文 | | | | | 局部作用域 | Local | | 嵌套作用域 | Enclosing | | 全局作用域 | ...


函數進階

函數的作用域

作用域又可以被稱為命名空間,指變數起作用的範圍。Python變數作用域可以分為四種,分別為局部作用域、嵌套作用域、全局作用域、內置作用域。

作用域 英文
局部作用域 Local
嵌套作用域 Enclosing
全局作用域 Global
內置作用域 Buiit-in

內建作用域是特質python api內置的一些操作,例如 len 、max等函數,無需聲明就可使用。

變數作用域

一個程式的所有的變數並不是在哪個位置都可以訪問的。訪問許可權決定於這個變數是在哪裡賦值的。變數的作用域決定了在哪一部分程式你可以訪問哪個特定的變數名稱。兩種最基本的變數作用域如下:

  • 全局變數:定義在函數內部的變數擁有一個局部作用域,定義在函數外的擁有全局作用域。
  • 局部變數:局部變數只能在其被聲明的函數內部訪問,而全局變數可以在整個程式範圍內訪問。
x = 2

def func():
    x = 3  # 局部變數    
    return x

result = func()
print(result)  # 3
print(x)  # 2

當我們在代碼里使用變數時,Python創建對象,改變對象或查找對象都是在一個所謂命名空間下進行的(一個保存變數名的地方)。而函數除了打包代碼之外,還定義了一個新的變數空間,一個函數所有的變數,都與函數的命名空間相關聯:

  • def 內定義的變數名能夠被 def內的代碼使用,不能在函數外部引用這樣的變數名
  • def之中的變數名與def之外的變數名並不衝突

也就是說:

  • 如果一個變數在def內被賦值,它就被定義在這個函數之內
  • 如果在def之外賦值,它就是整個文件全局的

回到上面的那個例子:

x = 2
def func(x):
    x = 3 
"""
儘管這兩個變數名都是x,但是他們作用域(命名空間)可以把他們區別開。
作用域(命名空間)有助於防止程式之間變數名的衝突,而且,有助於函數成為更加獨立的單元。
在Python中,函數定義了一個函數本地內的作用域,
而像x = 2這樣賦值語句定義了一個全局作用域(模塊級別的變數,使用範圍僅限於單個文件)。
而像x = 3這樣賦值語句定義了一個局部作用域(範圍僅限於函數內部)。
"""

global關鍵字

函數中修改不了全局作用域的變數如需修改,加global關鍵字,聲明變數為全局變數

y = 10
def func():
    global y
    y = 5
    print('y1 =', y)

func()	# y1 = 5
print('y2 =', y)  # y2 = 5
"""
函數體中使用了global關鍵字,聲明y為全局變數,故在函數中就改變了y的值
若函數體中沒有global y 語句,最後的結果就是y1 = 5,y2 = 10 4;這就跟上面的那個案例相同了
"""

nonlocal關鍵字

# E(enclosing):嵌套的父級函數的局部作用域
def mytest1():
    b = 6   # 局部變數    相對而言 我們的b是函數mytest2的全局變數
    def mytest2():
        #
        nonlocal b  # nonlocal 關鍵字用於在嵌套函數內部使用變數 瞭解即可 用的時候比較少
        b = 7  # 重新開闢了記憶體空間  註釋掉直接列印b
        print(b, id(b))

    mytest2()
    print(b, id(b))

mytest1()
"""
7 1440395648
7 1440395648 
"""

函數作用域的優先順序

高階函數

概念與調用

高階函數:一個函數可以作為參數傳給另外一個函數,或者一個函數的返回值為另外一個函數(若返回值為該函數本身,則為遞歸),滿足其一則為高階函數。

  • 一個函數的函數名作為參數傳給另外一個函數
# 頻繁的使用 需要其他的功能結合使用
def func():
    print("定義一個普通函數")

def high_level(func):
    print("定義一個高階函數")  # 此函數的功能
    # 在函數內部,通過傳入的函數參數調用
    func()  # 調用我傳入的函數名的函數

high_level(func)
"""
定義一個高階函數
定義一個普通函數
"""
  • 一個函數返回值(return)為另外一個函數(返回為自己,則為遞歸)
def func():
    print("定義一個普通函數")

def high_level(func):
    print("定義一個高階函數")
    return func  # high_level
    #  return func() 這個是直接返回函數調用,遞歸函數就是如此

res = high_level(func)
# 高階函數返回函數之後在調用func函數
res()
"""
定義一個高階函數
定義一個普通函數
"""

遞歸

  • 函數內部自己調用自己
  • 必須要有出口
# 列印1-9(range)
def func(start, end, step=1):
    print(start)
    if start >= end:
        return  # 結束函數運行,停止遞歸
    func(start + step, end, step)

func(1, 9)

3、內置高階函數

1)lambda函數

  • 匿名函數
  • 優點:節省記憶體空間,優化代碼
# lambda函數
# 當函數裡面只有一行代碼時,可以轉換為匿名函數
# 實際中,只使用一次,不需要考慮函數的名字,只需要功能
# lambda 傳入的參數:返回的數據
def add(a, b):
    return a + b

print(add(1, 2))

print((lambda a, b: a + b)(1, 2))
add1 = (lambda a, b: a + b)  # 定義名字,重覆使用

print(add1(2, 2))
print(add1(2, 3))
  • lamada參數實例
import random

# 無參數
sdds = lambda: random.random()
sdds()

# 一個參數
fun1 = lambda x: x
print(fun1('hello python'))

# 預設參數 (預設參數)
fun2 = lambda a, b, c=100: a + b + c
print(fun2(10,19,1000))

# 可變參數之args
fun3 = lambda *args: args
print(fun3((1,2,3,4,5)))

# 可變參數之kwargs
fun4 = lambda  **kwargs: kwargs
print(fun4(name='yueyue',age=18,height='178cm'))

# 帶判斷的lambda表達式
asd = lambda x: x if (x > 10) else 10
print(asd(5))
#### 它是以下帶有def和return 關鍵字的普通函數的更簡單版本:
def fun(x):
    if x > 10:
        return x
    else:
        return 10
print(fun(5))
  • 列表中字典數據排序
# 列表中的字典排序
# 需求:假設我們需要對字典中的年齡進行排序
user_list = [
    {"name": 'zhangsan1', 'age': 18},
    {"name": 'lisi1', "age": 19},
    {"name": 'wangwu1', "age": 17}
]

def getAge(element):
    return element['age']

# 傳遞給key參數的是一個函數,它指定可迭代對象中的每一個元素來按照該函數進行排序
user_list.sort(key=getAge,reverse=True)
print(user_list)


# 我們需要使用匿名函數,使用sort函數中的key這個參數,來指定字典比大小的方法
# reverse參數控制升序與降序排列
user_list.sort(key=lambda x:x['age'],reverse=True)
print(user_list)

2)map函數

  • 語法:map(function, iterable, ...)
  • 參數:function —— 函數;iterable —— 可迭代對象
  • 作用:通過將指定的function函數依次作用在給定序列iterable中的每一個元素上,得到一個新的list並返回。註意,map不改變原list,而是返回一個新list。
# map函數 映射
# 列表數據轉為字元串
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(map(lambda i: str(i), list1)))   # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

print(list(map(str, list1)))    # ['1', '2', '3', '4', '5', '6', '7', '8', '9']

3)reduce函數

  • reduce() 函數來自 functools 模塊。使用 reduce() 函數,需要在代碼開始時使用以下語句導入 functools 模塊:
from functools import reduce

關於模塊(module)的知識和使用方法後續會進行深入學習。

  • 作用:先從列表(或序列)中取出2個元素執行指定函數,並將輸出結果與第3個元素傳入函數,輸出結果再與第4個元素傳入函數,…,以此類推,直到列表每個元素都取完。
from functools import reduce  # 導入內置reduce函數

def fn(x, y):
    return x + y

res = reduce(fn, [1, 3, 5, 7, 9])
print(res)	# 25

4)filter函數

  • 語法:reduce(function, iterable)
  • 參數:function —— 函數;iterable —— 可迭代對象
  • 作用:filter函數也是接收一個函數和一個序列的高階函數,其主要功能是過濾。
# 在一個list中,刪掉偶數,只保留奇數
def is_odd(n):
    return n % 2 == 1

print(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))  # <filter object at 0x00000193E06AE860>
print(list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])))  # [1, 5, 9, 15]

學員管理系統

這個建議自行去寫一下,除了這個系統,還有圖書館管理系統,宿舍管理系統等,網路上都有許多教程,換湯不換藥的,有需要可以聯繫。

本文來自博客園,作者:大-鍋,轉載請註明原文鏈接:https://www.cnblogs.com/daguo118/p/17314962.html


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

-Advertisement-
Play Games
更多相關文章
  • 說下場景,我的程式在多線程場景下一個迴圈體中處理業務數據,其中需要調用一個外部http介面去獲取一些數據,程式總會在在本地執行一段時間後會拋出Address already in use: no further information錯誤。 這是大量併發場景下出現的問題,經過查閱原因是OkHttp的 ...
  • 文件操作 文件讀寫 語法:open(file, mode, encoding) 參數:file —— 文件所在位置(相對路徑、絕對路徑) mode —— 操作文件的模式 encoding —— 文件的編碼格式 相對路徑:基於目前的路徑獲取 絕對路徑:一個完整的路徑 操作文件的模式:r-讀 w-寫 a ...
  • 前言 做了個python的小項目,需要打包為桌面端的exe使用,結果一打包,體積直接上百兆了,研究了下,使用虛擬環境打出的包會更乾凈小巧。 安裝anaconda(用作python的虛擬環境管理工具) 安裝:https://repo.anaconda.com/archive/Anaconda3-202 ...
  • 判斷閏年 初始版本 year = input('請輸入一個年份:') while not year.isdigit(): year = input("抱歉,您的輸入有誤,請輸入一個整數:") year = int(year) if year % 400 == 0: print(year, "是閏年! ...
  • 在工作中,我們會將重要的文檔進行加密,並且設置用戶的訪問許可權,其他外部人員均無法打開,只有獲取該許可權的用戶才有資格打開文檔。此外,限制用戶的使用許可權,極大程度上阻止了那些有意要篡改、拷貝其中內容的人,提高文檔的安全性。與此同時,文檔加密的另一大作用是為了防止丟失,因為可能存在員工出差或離職時,將文檔 ...
  • 聲明 本文章中所有內容僅供學習交流使用,不用於其他任何目的,不提供完整代碼,抓包內容、敏感網址、數據介面等均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關! 本文章未經許可禁止轉載,禁止任何修改後二次傳播,擅自使用本文講解的技術而導致的任何意外,作者均不負責,若有侵權, ...
  • Vue3的UI Framework中有Element-Plus、BalmUI、Quasar、PrimeVue、Ant Design Vue等UI Framework. Element-Plus是Element-UI的Vue3版,Element-UI的使用人數的基數較大,Github上的Star數也較 ...
  • 大數據時代,各行各業對數據採集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實現從易到難全方位覆蓋,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為數據存儲。 概述 上期我們介紹到了文件存儲,講到瞭如何將數據存 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...