python基礎-函數

来源:https://www.cnblogs.com/white-list/archive/2022/11/01/16841112.html
-Advertisement-
Play Games

1.函數定義 函數就是將完成一件事情的步驟封裝在一起並得到最終的結果; 函數名代表了這個函數要做的事情; 函數體是實現函數功能的流程; 添加一個函數也被叫做實現了一個方法或功能; 函數可以幫助我們重覆使用一些操作步驟; 2.def 通過關鍵字def定義函數; def name(args...): p ...


1.函數定義

  函數就是將完成一件事情的步驟封裝在一起並得到最終的結果;

  函數名代表了這個函數要做的事情;

  函數體是實現函數功能的流程;

  添加一個函數也被叫做實現了一個方法或功能;

  函數可以幫助我們重覆使用一些操作步驟;

 

2.def

  通過關鍵字def定義函數;

  def  name(args...):

    print('')

  return 是將函數結果返回的關鍵字;

  return只能在函數體中使用;

  return支持返回所有python類型;

  有返回值的函數可以直接賦值給一個變數;

  def add(a, b):

    c=a+b

     return c    # 出現retuen代表函數執行結束,後面有語句也不會執行了

def multiplication(a, b):
    re = a * b
    return re
    print('test')


result = multiplication(3, 4)  # 函數返回值可以直接賦值給變數
print(result)
'''
12   return後的語句不會被執行
'''


def no_re():
    print('無返回的函數')


no_r = no_re()
print(no_r)  # 函數無返回時,預設是None
'''
無返回的函數
None
'''


def test():
    for i in range(4):
        print(i)
        if i == 2:
            return i

t = test()
print(t)
'''
0
1
2
2
# return後迴圈結束,函數結束;只列印到2,且函數返回值2
'''

 

3.函數的參數

  必傳參數(位置參數),函數中定義的沒有預設值的參數,在調用函數時若不傳則會報錯;

  在定義函數時,參數後無等號和預設值;

  且傳參時,實際值的順序與定義的參數順序要一致;

    def add(a, b)

  預設參數,定義函數時,定義的參數有預設值,通過賦值語句給他一個值;

  如果調用函數時,為預設參數傳遞了新值,函數會使用新傳入的值;

    def add(a, b=1)

def add(a, b, c=4):
    return a+b+c


re = add(1, 2)  # 使用c的預設值
print(re)  # 7

re2 = add(1, 2, 5)  # 使用c的新值
print(re2)  # 8


# 註意,預設參數一定在位置參數之後,否則會報錯
def add2(a, b=3, c):
    return a+b+c

add2(1, 3, 2)
'''
  File "D:\python_exercise\test.py", line 566
    def add2(a, b=3, c):
                     ^
SyntaxError: non-default argument follows default argument
'''

  不確定參數--可變參數,沒有固定的參數名和數量(提前不知道要傳的參數名和數量);

  def add(*args, **kwargs) 

  *args保存多餘實參,保存為元組、**kwargs保存多餘的帶有變數名的實參,保存為字典;

def add(a, b, c=4, *args, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args, type(args))
    print(kwargs, type(kwargs))


add(1, 2, 3, 4, 5, d=3, e=4)
'''
1
2
3  # 3給了預設參數c,後面再有的剩餘實際參數保存為元組了
(4, 5) <class 'tuple'>
{'d': 3, 'e': 4} <class 'dict'>
# 後面就可以使用元組、字典的方法處理args和kwargs了
'''


def test(*args, **kwargs):
    print(args)
    print(kwargs)


test((2, 3), {'name': 'll', 'age': 23})
'''
((2, 3), {'name': 'll', 'age': 23})
{}
'''
# 可以發現*args是將多餘實參都放到了元組中
# 如果就想對應傳遞元組和字典,可以在實參前加*和**
test(*(2, 3), **{'name': 'll', 'age': 23})
'''
(2, 3)
{'name': 'll', 'age': 23}
'''


def add3(a, b, c):
    return a+b+c


tuple_test = (23, 45, 0)
re = add3(*tuple_test)  # 此時也可以藉助*tuple對實參進行解包
print(re)  # 68

  參數的規則,

  多參數一般添加順序 :def add(a, b=1, *args, **kwargs)  。

  

  上面的例子可以看到python中函數參數沒有定義類型,

  其實在py3.7後可以為參數定義類型,但只是用於肉眼上的查看;

  def person(name:str, age:int=33):

    print(name, age)

def add(a: int, b: int, *args: int):
    print(a, b, args)


add(1, 2, 4, 'rt')  # 1 2 (4, 'rt')  
# 雖然傳遞的參數不符合數據類型的要求,但可以正常執行,指定類型只是起提示功能

  且pycharm中也會有提示標註

  

 

4.全局變數和局部變數

  python腳本最上層代碼塊的變數,就是全局變數;全局變數可以在函數中讀取使用;

  局部變數:只能在局部使用的變數,比如函數體內的變數只能在函數內使用;

name = 'll'  # 定義一個全局變數


def test():
    print('函數體內'+name)


test()  # 函數體內ll (函數體內可以直接使用全局變數)


def test2():
    age = 13
    print(age)


test2()  # 13
print(age)  # NameError: name 'age' is not defined (局部變數只能在局部使用)

def test3():
    name = 'tt'
    print(name)

test3()  # tt
print(name)  # ll (全局變數未被函數修改,函數只能使用全局變數,不能修改)

  可以使用global關鍵字,在函數內修改全局變數;(但在工作中不建議使用global對全局變數進行修改)

name = 'll'  # 定義一個全局變數


def test():
    global name
    name = 'tt'


test()
print(name)  # tt

  當全局變數值是字典或列表時,函數內可以直接修改其值;

name_list = ['ll', 'tt']  # 定義一個全局變數


def test():
    name_list.append('rr')


test()
print(name_list)  # ['ll', 'tt', 'rr']

 

 5.函數的遞歸

  一個函數不停的將自己反覆執行;

  def test(a):

    print(a)

    return test(a)    通過返回值,直接執行函數自身,就可以達到遞歸的效果;

  避免濫用遞歸,一定要設置滿足後退出遞歸的條件,小心記憶體溢出;

  能用遞歸解決的問題必須滿足兩個條件:

    1.可以通過遞歸調用來縮小問題規模,且新問題與原問題有著相同的形式;

    2.存在一種簡單情形,使用該簡單情形可退出遞歸;

count = 0


def test():
    global count
    count += 1
    if count != 5:
        print('繼續執行函數')
        return test()
    else:
        print('執行結束')


test()
'''
繼續執行函數
繼續執行函數
繼續執行函數
繼續執行函數
執行結束
'''

  兩個經典的遞歸案例,階乘和斐波那契數列;

'''
階乘
n! = 1*2*3*...*n

f(n) = n * f(n-1)
且f(1)=1
'''


def test(n):
    if n == 1:
        return 1
    return n * test(n-1)


re = test(6)
print(re)  # 720

'''
斐波那契數列(黃金分割數列)
數列從0開始,數列前兩項是0,1,第三項開始每一項是前兩項的和
f(0) = 0
f(1) = 1
f(n) = f(n-1) + f(n-2)
'''

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    return fib(n-1) + fib(n-2)

# 求數列的第9項
re2 = fib(9)
print(re2)  # 34
# 列印20項
for i in range(20):
    if i == 19:
        print(fib(i), end=',')
    else:
        print(fib(i), end=',')
# 0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181

 

6.匿名函數lambda

  可以定義一個輕量化的函數,處理一些簡單操作; 

  即用即刪除,適合需要完成一項功能,但此功能只在此一處使用;

  無參數lambda,   f = lambda : value  ;   f()調用;lambda函數自帶return關鍵字,此時返回值是value;

  有參數lambda,   f = lambda x,y: x*y ;  f(3, 4)調用;  此時返回值是x*y的值12;

test = lambda: 34
print(test())  # 34

test2 = lambda x, y: x > y
re = test2(4, 6)
print(re)  # False

test3 = lambda x, y=4: x + y
re = test3(4, 6)
print(re)  # 10

# 此時可以再來看列表的sort(key)方法,key參數值就是函數、可以指定排序的參考值,此處就可以使用lambda函數的寫法
name_list = [
    {'name': 'll', 'age': 34},
    {'name': 'tt', 'age': 4},
    {'name': 'rr', 'age': 24}
]
# 按照字典中age對應的值排序
name_list.sort(key=lambda x: x['age'])
print(name_list)  # [{'name': 'tt', 'age': 4}, {'name': 'rr', 'age': 24}, {'name': 'll', 'age': 34}]

  

總結

  


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

-Advertisement-
Play Games
更多相關文章
  • 1 準備 2 申請App ID 2.1 打開[蘋果開發者官網](https://developer.apple.com),點擊Account登陸賬號。 2.2 進入ID申請 3 創建證書請求文件(*.cerSigningRequest文件) 4 添加軟體開發證書和分發證書 並下載(*.CER文件) ...
  • 一、 問題描述: 華為地圖服務“我的位置”能力,在中國大陸地區,向用戶展示他們在地圖上的當前位置與用戶的實際位置存在較大的偏差。 具體差別可以查看下方的圖片: 二、 偏差較大的原因: 華為Map SDK在中國大陸使用的地理坐標系是GCJ02。 點擊“我的位置”控制項,獲取的定位經緯度的地理坐標系是WG ...
  • 一、下載 node.js的下載地址**Download | Node.js (nodejs.org)** 根據使用系統,選擇對應的安裝包 根據點擊如下按鈕可以選擇歷史版本進行下載 二、安裝 下載好之後直接雙擊安裝即可 三、環境配置 安裝完成後,在系統環境變數配置中將node的路徑添加進去 在CMD中 ...
  • 在做一些常規應用的時候,我們往往需要確定條件的內容,以便在後臺進行區分的進行精確查詢,在移動端,由於受限於屏幕界面的情況,一般會對多個指定的條件進行模糊的搜索,而這個搜索的處理,也是和前者強類型的條件查詢處理類似的處理過程,因此本篇隨筆探討兩種不同查詢在前端界面上的展示效果,以及後端基於.netCo... ...
  • 摘要:在Java中提供了synchronized關鍵字來保證只有一個線程能夠訪問同步代碼塊。既然已經提供了synchronized關鍵字,那為何在Java的SDK包中,還會提供Lock介面呢?這是不是重覆造輪子,多此一舉呢? 本文分享自華為雲社區《【高併發】Java中提供了synchronized, ...
  • 在之前的SqlSugar系列隨筆中,介紹了很多我們關於SqlSugar的開發框架的內容,SqlSugar的開發框架的目的是多前端應用場景,因此其中會包含各種不同的前端應用,前面介紹了基於DevExpress的Winform的前端應用,以及基於Vue3+TypeScript+ElementPlus的B... ...
  • apijson 初探 本文試著用 5W1H 方式切入,試圖快速建立自己對 apijson 的整體認知,所以這不是一趟快速入門的 demo 之旅,而是顯得比較務虛的探索式知識體系整合過程。 持續更新中... 1、Why 前後端開發過程中各種痛點: 開發流程繁瑣、周期長 前端/客戶端與後端各種扯皮 文檔 ...
  • 您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 前面把線程相關的生命周期、關鍵字、線程池(ThreadPool)、ThreadLocal、CAS、鎖和AQS都講完了,現在就剩下怎麼來用多線程了。而要想用好多線程,其實是可以取一些巧的,比如JUC(好多面試官喜歡問的JUC,就是現在要講的JUC ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...