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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...