1. 程式人生 > >總結day7 ---- 函式的內容 ,初識,返回值,進階(一)

總結day7 ---- 函式的內容 ,初識,返回值,進階(一)

內容大綱:

  一:  函式識別

  二:  函式的結構

  三:  函式的返回值,

  四:  函式的引數

  五:  動態引數

  六:  形參的順序

  七:  名稱空間

  八:  作用域

  九:  載入順序和取值順序

  十:  內建函式

  十一:  關鍵字使用,global ,nonlocal

  十二:  函式的巢狀初識

一:函式的初識別

  函式是組織好的,可重複使用的,用來實現單一,或相關聯功能的程式碼段。函式能提高應用的模組性,和程式碼的重複利用率。你已經知道Python提供了許多內建函式,比如print(),len()等。但你也可以自己建立函式,這被叫做使用者自定義函式。

 

二:函式的結構

 

複製程式碼
#函式定義
def mylen():
    """計算s1的長度"""
    s1 = "hello world"
    length = 0
    for i in s1:
        length = length+1
    print(length)

#函式呼叫  
mylen()
複製程式碼

 

上面就是咱們寫了一個函式,並且成功的呼叫了它。

 

複製程式碼
定義:def 關鍵詞開頭,空格之後接函式名稱和圓括號(),最後還有一個":"。

   def 是固定的,不能變,他就是定義函式的關鍵字。

   空格 為了將def關鍵字和函式名分開,必須空(四聲),當然你可以空2格、3格或者你想空多少都行,但正常人還是空1格。

   函式名:函式名只能包含字串、下劃線和數字且不能以數字開頭。雖然函式名可以隨便起,但我們給函式起名字還是要儘量簡短,並能表達函式功能

   括號:是必須加的,先別問為啥要有括號,總之加上括號就對了!

註釋:每一個函式都應該對功能和引數進行相應的說明,應該寫在函式下面第一行。以增強程式碼的可讀性。

呼叫:就是 函式名() 要記得加上括號。

 三:函式的返回值

 

咱們用len()方法時,得到的結果會賦值給一個變數,然後得到結果:

 

str_len = len('hello,world')
print(str_len)

 

但是咱們寫的這個函式,並不會得到這樣的結果,如何讓他和len函式一樣,有返回值呢?

 

那就是在函式的最後加上一個return,return 後面寫你需要的返回值就可以了。

 

return返回值

 

下面咱們重點研究return關鍵字的作用:

 

return關鍵字的作用

 

  return 是一個關鍵字,這個詞翻譯過來就是“返回”,所以我們管寫在return後面的值叫“返回值”。

 

要研究返回值,我們還要知道返回值有幾種情況:分別是沒有返回值、返回一個值、返回多個值

 

沒有返回值

 

  不寫return的情況下,會預設返回一個None:我們寫的第一個函式,就沒有寫return,這就是沒有返回值的一種情況。 

 

沒有return

 

  只寫return,後面不寫其他內容,也會返回None,有的同學會奇怪,既然沒有要返回的值,完全可以不寫return,為什麼還要寫個return呢?這裡我們要說一下return的其他用法,就是一旦遇到return,結束整個函式

 

只寫return

 

  return None:和上面情況一樣,我們一般不這麼寫。

 

返回一個值

 

      剛剛我們已經寫過一個返回一個值的情況,只需在return後面寫上要返回的內容即可。  

 

return返回一個值

 

返回多個值

 

  可以返回任意多個、任意資料型別的值

 

return返回多個值

 

  返回的多個值會被組織成元組被返回,也可以用多個值來接收

 

多個值接收

 

小結:

 

  return 只有兩個作用:

 

  1,結束整個函式。

 

  2,給函式的執行者(呼叫者)返回值。

 

四:函式的引數:

   >1 形參:

    >>1:位置引數:按照位置引數, 與實參角度的位置重左至右,一一對應.

    >>2:預設引數:給形參一個預設值,通常是比較常用的數值,但是可以改變,#注意形參一定要在位置的最後面.

    預設引數陷阱:

 

 1 def func1 (a,l=[]):
 2     l.append(a)
 3     return l
 4 print(func1(22))
 5 print(func1(66))
 6 print(func1(33))
 7 print(func1(44,[]))
 8 >>>>
 9 [22]
10 [22, 66]
11 [22, 66, 33]
12 [44]

 

 

 

    >>3:萬能引數*arg, **kwarg

      可以接受所有的位置引數,關鍵字引數, 

      可以接受字典

    

   >2 實參: :

      >>1位置引數:必須與形參一直,從左至右一一對應.

     >>2 關鍵字引數:一一對應即可,不需要對應位置

     >>3 混合引數:兩個同時存在

     >>4 三元運算

      >>>1

if 2 >1:
    print('ok')
else:
    print('no')
print('ok') if 2>1 else print('no')

以上兩個式子相等

 

   A1 if 條件 else A2

五:動態引數

def fun(*args,**kwargs):
    print(args)
    print(kwargs)
fun(1,2,3,4,'231','1123',[123],sex='nan')
fun({'name':23,'age':'hehe'},eat='chi')
>>>
(1, 2, 3, 4, '231', '1123', [123])
{'sex': 'nan'}
({'name': 23, 'age': 'hehe'},)
{'eat': 'chi'}

   >*arg , **kwarg的魔性用法

    >>

      # * 的魔性用法。
      # 在函式的定義時,* ** 代表聚合。
      # 函式的執行(呼叫)時,* ** 代表打散。

def fun(*args,**kwargs):
    print(args)
    print(kwargs)
fun(*(1,2,3),*['a','b','c'],**{'name':'wangzi'},**{'age':36})
# 寫一個函式:可以傳多個列表,把列表裡面的所有元素一個一個的新增到args裡面。

def func(*args, **kwargs):  # 在函式的定義時,* 代表聚合。
    print(args)  #(1,2,3,4,5,6,1,2,3)

func(*[1,2,3],*(1,2,3),*'fdsaf') # 函式的執行(呼叫)時,*  打散。

六:形參的順序問題

  # 位置引數> *args> 預設引數> **kwargs

七:名稱空間 

    # 全域性名稱空間:存放的是py檔案中變數與值的對應關係
    # 區域性名稱空間:臨時存放的是函式體裡面的變數與值的對應關係。
    # 內建名稱空間:內建函式,關鍵字等等。 print() input()

八:作用域

  # 作用域:
    # 全域性作用域:內建名稱空間,全域性名稱空間
    # 區域性作用域:區域性名稱空間

  

  

九:順序問題

  # 載入順序:載入到記憶體的順序
    # 內建名稱空間 ---> 全域性名稱空間 ---> (當函式執行時)區域性名稱空間  

  # 取值順序(就近原則)
    # LEGB 原則
  # 區域性名稱空間 ---> 全域性名稱空間 ---> 內建名稱空間

十:內建函式

  # print(globals()) # 返回一個字典:包含全域性作用域所有的內容
  # print(locals()) # 返回一個字典:當前作用域的所有內容

十一:關鍵字的使用

  

# 關鍵字:global nonlocal

# global : 可以區域性宣告一個全域性變數
# age = 46
# name = 'xxx'
# def func():
# global name
# name = 'alex'
# name = 'barry'
# func()
# print(name)

# 區域性作用域不能對全域性作用域的變數進行修改,只能引用。
count = 1
def func():
global count
count += 1
func()
print(count)

# 總結:
# global :
# 可以區域性作用域宣告一個全域性變數
# 區域性作用域不能對全域性作用域的變數進行修改,只能引用,通過設定global可以修改。

# nonlocal : 只在python3x中 存在。
# 1,不能操控全域性變數。
# name = 'alex'
# def func():
# nonlocal name
# print(name)
# func()

# 內層函式不能對外層函式的變數進行修改,只能引用。
# 在區域性作用域中,對父級作用域(或者更外層作用域非全域性作用域)的變數進行引用和修改,
# 並且引用的哪層,從那層及以下此變數全部發生改變。

def wrapper():
    name = 'alex'
    def inner():
        nonlocal name     #加上之後可以引用函式父級的變數
        name += 'b'
        # print(name)
    print('1', name)
    inner()
    print('2', name)
wrapper()
>>>>>

1 alex
2 alexb

 

 

十二:  函式的巢狀初識

  

def func1():
    print(1)
    def inner():
        print(2)
        def inner2():
            print(3)
    print(4)
    inner()
    print(5)
func1()
>>>>

1
4
2
5