08-Python之路---初識函式

不喜歡馬賽克的馬克發表於2020-05-21

? Python之路---初識函式✔️

程式設計師三大美德:

  1. 懶惰

因為一直致力於減少工作的總工作量。

  1. 缺乏耐性

因為一旦讓你去做本該計算機完成的事,你將會怒不可遏。

  1. 傲慢

因為被榮譽感衝暈頭的你會把程式寫得讓誰都挑不出毛病來。

大家好?, 現在讓我們一起來學習一下函式 ?

Why-為什麼要使用函式?

現在我們需要計算一個字串的長度,我們可以直接使用len()方法:

num = len('hello')

但是如果我們不用len方法,怎麼實現這個需求?其實也不難:

s = 'hello'
length = 0
for i in s:
    length += 1
    
print(length)

好了,功能實現了,然後又有一個需求(產品經理日常加需求),要計算另一個字串的長度---“world”。

於是,本著程式設計師三大美德,?我們使用最強大的快捷鍵---Ctrl+c , Ctrl+v:

s1 = 'world'
length = 0
for i in s1:
    length += 1
    
print(length)

這樣確實可以實現需求,但是總感覺不是那麼完美,為什麼呢?

首先,之前我只需要執行len方法就可以拿到一個字串的長度,而現在為了實現相同功能,我們需要把相同的程式碼寫很多遍 --- 程式碼冗餘

其次,剛剛的程式碼不是那麼容易讀懂 ---- 可讀性差

我們就想,要是我們能像使用len一樣使用我們這一大段“計算長度”的程式碼就好了。這種感覺有點像給這段程式碼起了一個名字,等我們用到的時候直接喊名字就能執行這段程式碼就行。

函式定義與呼叫

現在教大家一個技能,把程式碼裝起來:

def mylen():
    """計算字串長度"""
    s = 'hello'
    length = 0
    for i in s:
        length += 1
    print(length)

來分析下這段程式碼:

​ 其實除了def這一行和後面的縮排,其它的和前面的程式碼是一樣的。

​ 現在執行以下,你會發現啥也沒發生!

​ 因為這裡我們只是把程式碼裝起來了,還不會往外拿,拿應該怎麼拿出來呢?

mylen()

這就是程式碼取出來的過程。

# 定義函式
def mylen():
    """計算字串長度"""
    s = 'hello'
    length = 0
    for i in s:
        length += 1
    print(length)
    
# 呼叫函式
mylen()

總結:

定義:

  • def關鍵字開頭,空格後接函式名稱圓括號(),最後還有一個“:”

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

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

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

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

函式返回值

前面我們寫了一個函式,這個函式可以幫助我們計算字串的長度,並且把結果列印出來。但是,這和我們的len方法還不是太一樣。以前我們呼叫len方法會得到一個值,我們可以用一個變數來接收這個值。

str_len = len('hello')

那麼我們寫的函式能做到嗎?

# 定義函式
def mylen():
    """計算字串長度"""
    s = 'hello'
    length = 0
    for i in s:
        length += 1
    print(length)
    
# 呼叫函式
str_len = mylen()
print('str_len : %s'%str_len)

執行程式碼,獲得的輸出結果是str_len值為None,這說明什麼也沒返回

那麼應該怎麼讓他有返回值呢?

return

# 定義函式
def mylen():
    """計算字串長度"""
    s = 'hello'
    length = 0
    for i in s:
        length += 1
    return length
    
# 呼叫函式
str_len = mylen()
print('str_len : %s'%str_len)

只需要在函式最後加上一個return的關鍵字,return後面寫上你要返回的值就可以了

return關鍵字的作用

​ return 是一個關鍵字,在pycharm裡,你會看到它變成藍色了。

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

  • 沒有返回值:

    • 不寫return的情況下,會預設返回一個None
    • 只寫return,後面不寫其他內容,也會返回None,那麼為啥要寫呢?return的其他用法,就是一旦遇到return,結束整個函式。  
    • return None:和上面的兩種情況一樣,我們一般不這樣寫。
  • 返回一個值:

    ​ 注意:*return和返回值之間要有空格,可以返回任意資料型別的值

  • 返回多個值:

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

      def demo1():
          '''返回多個值''' 
          return 1,2,3,4
      
      
      def demo2():
          '''返回多個任意型別的值'''
          return 1,['a','b'],3,4
      
      ret1 = demo1()
      print(ret1)
      ret2 = demo2()
      print(ret2)
      
      
    • 返回的多個值會被組織成元組被返回,也可以用多個值來接收

      def demo3():
          return 1,['a','b'],3,4
      
      #返回多個值,用一個變數接收
      ret3 = demo3()
      print(ret2)
      
      #返回多個值,用多個變數接收
      a,b,c,d = demo3()
      print(a,b,c,d)
      
      #用多個值接收返回值:返回幾個值,就用幾個變數接收
      a,b,c,d = demo3()
      print(a,b,c,d)
      
      

函式的引數

這個函式還是不完美,因為之前我們使用len函式的時候,是可以想計算誰就計算誰的長度,但是我們寫的這個函式只能計算“hello”的長度,換一個字串就需要更改函式內部的變數,這樣可不行,那應該怎麼辦?

帶引數的函式:

#函式定義
def mylen(s):
    """計算s1的長度"""
    length = 0
    for i in s:
        length = length + 1
    return length

#函式呼叫
str_len = mylen("hello")
print('str_len : %s'%str_len)

我們告訴mylen函式要計算的字串是誰,這個過程叫做傳遞引數,簡稱傳參,呼叫函式

時傳遞的這個“hello”和定義函式的s就是引數

實參和形參

我們呼叫函式時傳遞的這個“hello”被稱為實際引數,因為這個是實際的要交給函式的內容,簡稱實參。

定義函式時的s,只是一個變數的名字,被稱為形式引數,因為在定義函式的時候它只是一個形式,表示這裡有一個引數,簡稱形參。  

傳遞多個引數

引數可以傳遞多個,多個引數之間用逗號分割。

def mymax(x,y):
	"""比較兩個數的大小"""
    the_max = x if x > y else y
    return the_max

the_max = mymax(9,99)
print(the_max)

正是因為需要傳遞多個引數,所以才有了下面的引數型別

1.位置引數

按照位置傳值:

def mymax(x,y):
	"""比較兩個數的大小"""
    the_max = x if x > y else y
    return the_max

the_max = mymax(9,99)
print(the_max)

2.關鍵字引數

按照關鍵字傳值:

def mymax(x,y):
	"""比較兩個數的大小"""
    the_max = x if x > y else y
    return the_max

the_max = mymax(y=99, x=9)
print(the_max)

PS:位置、關鍵字形式混著用

def mymax(x,y):
	"""比較兩個數的大小"""
    the_max = x if x > y else y
    return the_max

the_max = mymax(9, y=99)
print(the_max)

正確用法:

  1. 位置引數必須在關鍵字引數的前面
    2. 對於一個形參只能賦值一次  

3. 預設引數

why??將變化比較小的值設定成預設引數

def info(name, sex='男'):
    """列印學生資訊"""
    print(name, sex)


info('馬克')
info('王富貴', '女')

引數陷阱:預設引數是一個可變資料型別

def func(a, l=[]):
    l.append(a)
    print(l)


func(1)
func(2)
func(3)

4. 動態引數(不定長引數)

  1. *args:按位置傳值多餘的引數都由args統一接收,儲存成一個元組的形式

    def mysum(*args):
        """求和"""
        the_sum = 0
        print(args)  # 儲存成元組形式
        print(type(args))
    
        for i in args:
            the_sum += i
        return the_sum
    
    
    sum = mysum(10, 20, 30)
    print(sum)
    
    
  2. **kwargs:按位置傳值多餘的引數都由kwargs統一接收,儲存成一個字典的形式

    def stu_info(**kwargs):
        print(kwargs)  # 儲存成字典
        print(kwargs['name'])
    
    
    stu_info(name='不喜歡馬賽克的馬克', sex='男')
    
    

⭐️總結

函式:

引數:

相關文章