05-python中函數的使用

来源:https://www.cnblogs.com/xiaoyafei/archive/2018/03/10/8540297.html
-Advertisement-
Play Games

函數:就是讓程式模塊化,把具有獨立功能的代碼塊當成一個整體封裝成一個函數 首先列印一個佛主看看: 那麼這個時候我們想列印很多遍佛主的話,總不能一直複製粘貼,所以我們需要定義一個列印佛主函數: 帶有參數的函數 首先我們來定義一個函數來計算兩個數的總和: 這樣會不會有點太死板了,我們希望能夠從鍵盤輸入a ...


函數:就是讓程式模塊化,把具有獨立功能的代碼塊當成一個整體封裝成一個函數

 

首先列印一個佛主看看:

print("                            _ooOoo_  ")
print("                           o8888888o  ")
print("                           88  .  88  ")
print("                           (| -_- |)  ")
print("                            O\\ = /O  ")
print("                        ____/`---'\\____  ")
print("                      .   ' \\| |// `.  ")
print("                       / \\||| : |||// \\  ")
print("                     / _||||| -:- |||||- \\  ")
print("                       | | \\\\\\ - /// | |  ")
print("                     | \\_| ''\\---/'' | |  ")
print("                      \\ .-\\__ `-` ___/-. /  ")
print("                   ___`. .' /--.--\\ `. . __  ")
print("                ."" '< `.___\\_<|>_/___.' >'"".  ")
print("               | | : `- \\`.;`\\ _ /`;.`/ - ` : | |  ")
print("                 \\ \\ `-. \\_ __\\ /__ _/ .-` / /  ")
print("         ======`-.____`-.___\\_____/___.-`____.-'======  ")
print("                            `=---='  ")
print("  ")
print("         .............................................  ")
print("                  佛祖鎮樓                  BUG辟易  ")
print("          佛曰:  ")
print("                  寫字樓里寫字間,寫字間里程式員;  ")
print("                  程式人員寫程式,又拿程式換酒錢。  ")
print("                  酒醒只在網上坐,酒醉還來網下眠;  ")
print("                  酒醉酒醒日復日,網上網下年復年。  ")
print("                  但願老死電腦間,不願鞠躬老闆前;  ")
print("                  賓士寶馬貴者趣,公交自行程式員。  ")
print("                  別人笑我忒瘋癲,我笑自己命太賤;  ")
print("                  不見滿街漂亮妹,哪個歸得程式員?")

那麼這個時候我們想列印很多遍佛主的話,總不能一直複製粘貼,所以我們需要定義一個列印佛主函數:

def print_fozhu():  #首先在開始定義列印佛主的函數,函數名為print_fozhu
    print("                            _ooOoo_  ")
    print("                           o8888888o  ")
    print("                           88  .  88  ")
    print("                           (| -_- |)  ")
    print("                            O\\ = /O  ")
    print("                        ____/`---'\\____  ")
    print("                      .   ' \\| |// `.  ")
    print("                       / \\||| : |||// \\  ")
    print("                     / _||||| -:- |||||- \\  ")
    print("                       | | \\\\\\ - /// | |  ")
    print("                     | \\_| ''\\---/'' | |  ")
    print("                      \\ .-\\__ `-` ___/-. /  ")
    print("                   ___`. .' /--.--\\ `. . __  ")
    print("                ."" '< `.___\\_<|>_/___.' >'"".  ")
    print("               | | : `- \\`.;`\\ _ /`;.`/ - ` : | |  ")
    print("                 \\ \\ `-. \\_ __\\ /__ _/ .-` / /  ")
    print("         ======`-.____`-.___\\_____/___.-`____.-'======  ")
    print("                            `=---='  ")
    print("  ")
    print("         .............................................  ")
    print("                  佛祖鎮樓                  BUG辟易  ")
    print("          佛曰:  ")
    print("                  寫字樓里寫字間,寫字間里程式員;  ")
    print("                  程式人員寫程式,又拿程式換酒錢。  ")
    print("                  酒醒只在網上坐,酒醉還來網下眠;  ")
    print("                  酒醉酒醒日復日,網上網下年復年。  ")
    print("                  但願老死電腦間,不願鞠躬老闆前;  ")
    print("                  賓士寶馬貴者趣,公交自行程式員。  ")
    print("                  別人笑我忒瘋癲,我笑自己命太賤;  ")
    print("                  不見滿街漂亮妹,哪個歸得程式員?")

print_fozhu()    #然後在下麵調用print_fozhu函數
print_fozhu()

帶有參數的函數

首先我們來定義一個函數來計算兩個數的總和:

def sum():  #表示定義一個函數,函數名為sum
    a = 20
    b = 30
    sum = a+b
    print("%d+%d=%d"%(a,b,sum))

sum()  #在下麵調動這個函數

這樣會不會有點太死板了,我們希望能夠從鍵盤輸入a和b去獲取這兩個數的總和,那麼需要怎麼做呢?

def sum(a,b):  #在上面定義搞一個函數,函數名為sum,並且攜帶兩個參數a,b,用來接收的叫做形參
    sum = a+b
    print("%d+%d=%d"%(a,b,sum))

num1 = int(input("第1個值:"))    #input鍵盤輸入的值是字元串類型,需要用int()轉換成整形
num2 = int(input("第2個值:"))
sum(num1,num2)  #在調用sum函數時,等於把num1和num2傳到sum()函數里去,調用時的傳的參數叫做實參

root@test:~/codes# python3 01-帶有參數的函數-input.py
第1個值:    10
第2個值:50
10+50=60

return的作用:所謂“返回值”,就是程式中函數完成一件事情後,最後給調用者的結果

比如:我給了我的朋友22塊錢,讓他幫我去買一包煙,然後朋友買完回來了把煙交給我,這個煙就是返回值

其次,在獲取鍵盤輸入時,也是這種道理:

In [1]: name = input("Name:")
Name:laowang

In [2]: name
Out[2]: 'laowang'  #相當於才從鍵盤獲取了一個值,然後拿給了name

那麼,我們現在來舉一個例子來說明return的作用:

def get_wendu():    #這裡定義一個獲取溫度的函數get_wendu
    wendu = 22    #定義一個wendu變數
    print("當前的室溫是%d"%wendu)

def get_wendu_huashi():  #定義一個獲取華氏溫度的函數get_wendu_huashi
    wendu = wendu + 2  #假設華氏溫度=溫度+2
    print("當前的室溫(華氏)是%d"%wendu)

get_wendu_huashi()  #調用剛剛定義的函數,get_wendu_huashi

讓我們看一下運行結果:
Traceback (most recent call last):
  File "02-獲取溫度.py", line 10, in <module>
    get_wendu_huashi()
  File "02-獲取溫度.py", line 7, in get_wendu_huashi
    wendu = wendu + 2
UnboundLocalError: local variable 'wendu' referenced before assignment  #這句話表示在聲明變數wendu之前就已經對其調用,定位到錯誤的地方了

讓我來解釋一下:在函數中定義的變數,只允許在當前函數中使用,在其他函數里不能用,而且函數中不允許直接調用結果那麼意思就是在get_wendu中定義的變數wendu,到了get_wendu_huashi中卻不認識這個wendu變數

讓我們來看一下修改後的代碼:

def get_wendu():
    wendu = 22
    print("當前的室溫是%d"%wendu)
    return wendu  #在這裡我們使用了return函數,那麼意味著我們可以把這個值、這個結果返回到調用的地方

def get_wendu_huashi(wendu):  #wendu是形參,用來接收的
    wendu = wendu + 2
    print("當前的室溫(華氏)是%d"%wendu)
result = get_wendu()  #return時需要有個容器來把結果存放起來,然後再傳入時,把這個結果給存進去
get_wendu_huashi(result)  #在調用get_wendu_huashi函數時,把result這個變數作為實參給傳送到函數里去

運行結果如下:
root@test:~/codes# python3 !$
python3 02-獲取溫度.py
當前的室溫是22
當前的室溫(華氏)是24

大功告成.....

總結:如果在一個函數中有了return,那麼就意味著這個函數可以把一個值,一個結果返回到調用的地方,return時需要有個東西把結果存放起來,然後在傳入時把這個東西存進去

 

如果一個函數想要有多個return,可以寫多個return,但是函數一旦運行到return,函數就會結束,如下:

In [1]: def test():    #定義一個test函數
   ...:     a = 11     #變數a
   ...:     b = 22     #變數b
   ...:     return a  
   ...:     return b
   ...: 

In [2]: a = test()  #調用test函數,並把它的結果賦值給a

In [3]: a
Out[3]: 11

In [4]: b = test()  #調用test函數,並把他的結果賦值給b

In [5]: b
Out[5]: 11

那麼為什麼a和b的值是一樣的呢?我們來看一下流程:

1.定義了一個test函數

2.在test函數中定義了兩個變數a和b,並分別複製a = 11,b = 22

3.使用return返回a的值和b的值

4.調用test函數,並把它賦值給了a

5.然後開始進入函數,a = 11,b = 22,然後return a,結果賦值給了a,此時的a等於11,程式結束

6.到了b = test(),進入函數,a = 11,b = 22,然後return a,結果被賦值給了b,此時b等於11,所以a和b的結果是一樣的

為什麼呢?因為在函數中,每調用一次函數就從函數從頭開始做,可以寫多個return,但是當進入函數時,一看見return程式就會結束,所以a和b的結果是一樣的了

 

修改程式如下:

In [6]: def test():
   ...:     a = 11
   ...:     b = 22
   ...:     return a,b
   ...: 

In [7]: a,b = test()

In [8]: print(a)
11

In [9]: print(b)
22

函數的類型

函數可以根據有沒有參數,有沒有返回值,可以相互結合

(1)無參數,無返回值

(2)無參數,有返回值

(3)有參數,無返回值

(4)有參數,有返回值

函數的嵌套使用

指在一個函數被調用的過程里,又調用了一個函數,舉例說明一下:

def test1():
    pass

def test2():
    print("-----2-1-----")
    print("-----2-2-----")

def test3():
    print("-----3-1-----")
    test2()  #在函數裡面調用test2函數
    print("-----3-2-----")

test3()  #調用test3函數

程式運行結果如下:
-----3-1-----
-----2-1-----
-----2-2-----
-----3-2----
def print_line():  #定義一個函數,列印40個*
    print("*"*40)  

def print_5_lines():  #定義一個函數,列印5行
    i = 0
    while i<5:
        print_line()  #又簽到調用了print_line函數
        i += 1
print_5_lines()

程式運行結果如下:
root@test:~/codes# python3 04-函數的嵌套調用2.py 
****************************************
****************************************
****************************************
****************************************
***************************************

 


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

-Advertisement-
Play Games
更多相關文章
  • 使用架構圖來展現出自己對一個項目中所涉及的技術的總體思路 架構圖的維度和組成要素 架構視圖最經典的當屬4+1視圖:包含邏輯視圖、開發視圖、過程視圖、物理視圖、場景視圖 1:邏輯視圖一般針對客戶、用戶、業務人員、開發組織,主要從系統的功能元素、以及它們的介面、職責、交互維度入手。主要元素包括系統、子系 ...
  • SSH框架指的是Struts,Spring,Hibernate.其中,Struts主要用於流程式控制制;Spring的控制反轉能祈禱解耦合的作用;Hibernate主要用於數據持久化。 ...
  • Fluentd是一個日誌收集工具,有輸入端和輸出端的概念,前者主要是日誌的來源,你可以走多種來源方式,http,forward,tcp都可以,後者輸出端主要指把日誌進行持久化的過程,你可以直接把它持久化到elasticsearch里,也可以直接在控制台輸出,這看你如何配置了,更多基礎配置可以看大叔這 ...
  • Python版本:3.6.2 操作系統:Windows 作者:SmallWZQ 截至上篇隨筆《Python數據結構之四——set(集合)》,Python基礎知識也介紹好了。接下來準備乾件“大事”。 什麼“大事”呢?下麵將要介紹Python編程的核心內容之一——函數。 對於Python編程,函數的重要 ...
  • ...
  • 1、@Controller 在SpringMVC 中,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把用戶請求的數據經過業務處理層處理之後封裝成一個Model ,然後再把該Model 返回給對應的View 進行展示。在SpringMVC 中提供了一個非常簡便 ...
  • 查找最大的N個元素——堆數據結構 給出序列,求出TopK大的元素,使用小頂堆,heapq模塊實現 ...
  • 第一種:點對點 第二種: 發佈者/訂閱者 啟動順序:先訂閱、再發佈 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...