Python函數(中)

本文標識 : Python_7

本文編輯 : Jack 風

編程工具 : Anaconda、Pycharm

閱讀時長 : 8分鐘

Python函數(中)

1、回顧函數應用

  • 函數的嵌套應用
  • 程式設計的思路,複雜問題分解為簡單問題

Demo

# 1.寫一個函數列印一條直線  # 2.列印自定義行數的橫線    # 列印一條  def printOneLine():      print("-"*30)      # 列印多條  def printNumLine(num):      i = 0        # printOneLine 函數已經完成了列印橫線的功能      # 只需要多次調用此函數即可      while i < num:          printOneLine()          i+=1    # 調用    printNumLine(3)

Demo1

1.寫一個函數求三個數的和 2.寫一個函數求三個數的平均值

# 求三個數的和  def sum3Number(a,b,c):      return a+b+c    #return的後面可以是數值,也可以是表達式    # 完成三個數的平均值    def average3Number(a,b,c):        # 因為sum3Number函數已經完成3個數的求和      # 將接收到的3個數,當做實參傳遞即可        sumResult = sum3Number(a,b,c)      aveResult = sumResult/3.0      return aveResult    # 調用函數,完成對3個數求平均值  result = average3Number(11,2,55)  print("average is %d"%result)

2、局部變數

歸納分析

  • 局部變數,就是在函數內部定義的變數
  • 不同的函數,可以定義相同的名字的局部變數,但是各用個的不會產生影響
  • 局部變數的作用,為了臨時保存數據需要在函數中定義變數來進行存儲,這就是它的作用

3、全局變數

3.1、全局變數是什麼?

如果一個變數,既能在一個函數中使用,也能在其他的函數中使用,這樣的變數就是全局變數

Demo

# 定義全局變數  a = 100    def test1():      print(a)    def test2():      print(a)    # 調用函數  test1()  test2()    # 結果顯而易見  100  100

3.2、全局和局部變數名一致的情況

3.3、修改全局變數

3.4、可變類型的全局變數

>>> a = 1  >>> def f():  ...     a += 1  ...     print a  ...  >>> f()  Traceback (most recent call last):    File "<stdin>", line 1, in <module>    File "<stdin>", line 2, in f  UnboundLocalError: local variable 'a' referenced before assignment  >>>  >>>  >>> li = [1,]  >>> def f2():  ...     li.append(1)  ...     print li  ...  >>> f2()  [1, 1]  >>> li  [1, 1]

3.5、 歸納總結

  • 在函數外邊定義的變數叫做全局變數
  • 全局變數能夠在所有的函數中進行訪問
  • 如果在函數中修改全局變數,那麼就需要使用global進行聲明,否則出錯
  • 如果全局變數的名字和局部變數的名字相同,那麼使用的是局部變數的,小技巧強龍不壓地頭蛇
  • 在函數中不使用global聲明全局變數時不能修改全局變數的本質是不能修改全局變數的指向,即不能將全局變數指向新的數據。
  • 對於不可變類型的全局變數來說,因其指向的數據不能修改,所以不使用global時無法修改全局變數。
  • 對於可變類型的全局變數來說,因其指向的數據可以修改,所以不使用global時也可修改全局變數。

4、函數返回值

在python中我們可不可以返回多個值? 本質是利用了元組

>>> def divid(a, b):  ...     shang = a//b  ...     yushu = a%b  ...     return shang, yushu  ...  >>> sh, yu = divid(5, 2)  >>> sh  5  >>> yu  1

5、函數參數

5.1、 預設參數

調用函數時,預設參數的值如果沒有傳入,則被認為是默認值。下例會列印默認的age,如果age沒有被傳入:

def printinfo( name, age = 35 ):     # 列印任何傳入的字元串     print "Name: ", name     print "Age ", age    # 調用printinfo函數  printinfo(name="miki" )  printinfo( age=9,name="miki" )

以上實例輸出結果:

Name:  miki  Age  35  Name:  miki  Age  9

注意:帶有默認值的參數一定要位於參數列表的最後面。

>>> def printinfo(name, age=35, sex):  ...     print name  ...    File "<stdin>", line 1  SyntaxError: non-default argument follows default argument

5.2、不定長參數

有時可能需要一個函數能處理比當初聲明時更多的參數。這些參數叫做不定長參數,聲明時不會命名。

基本語法如下:

def functionname([formal_args,] *args, **kwargs):      "函數_文檔字元串"      function_suite      return [expression]

加了星號(*)的變數args會存放所有未命名的變數參數,args為元組;而加**的變數kwargs會存放命名參數,即形如key=value的參數, kwargs為字典。

>>> def fun(a, b, *args, **kwargs):  ...     """可變參數演示示例"""  ...     print "a =", a  ...     print "b =", b  ...     print "args =", args  ...     print "kwargs: "  ...     for key, value in kwargs.items():  ...         print key, "=", value  ...  >>> fun(1, 2, 3, 4, 5, m=6, n=7, p=8)  # 注意傳遞的參數對應  a = 1  b = 2  args = (3, 4, 5)  kwargs:  p = 8  m = 6  n = 7  >>>  >>>  >>>  >>> c = (3, 4, 5)  >>> d = {"m":6, "n":7, "p":8}  >>> fun(1, 2, *c, **d)    # 注意元組與字典的傳參方式  a = 1  b = 2  args = (3, 4, 5)  kwargs:  p = 8  m = 6  n = 7  >>>  >>>  >>>  >>> fun(1, 2, c, d) # 注意不加星號與上面的區別  a = 1  b = 2  args = ((3, 4, 5), {'p': 8, 'm': 6, 'n': 7})  kwargs:  >>>  >>>

5.3、引用傳參

  • 可變類型與不可變類型的變數分別作為函數參數時,會有什麼不同嗎?
  • Python有沒有類似C語言中的指針傳參呢?
>>> def selfAdd(a):  ...     """自增"""  ...     a += a  ...  >>> a_int = 1  >>> a_int  1  >>> selfAdd(a_int)  >>> a_int  1  >>> a_list = [1, 2]  >>> a_list  [1, 2]  >>> selfAdd(a_list)  >>> a_list  [1, 2, 1, 2]

Python中函數參數是引用傳遞(注意不是值傳遞)。對於不可變類型,因變數不能修改,所以運算不會影響到變數自身;而對於可變類型來說,函數體中的運算有可能會更改傳入的參數變數。

思考一下,想一想為什麼呢?