1. 程式人生 > >python 初始函數

python 初始函數

組織 color 形參與實參 ace print 名稱 app 可變 rgs

一、什麽是函數

  函數是組織好的,可重復使用的,用來實現單一或相關功能的代碼段

  函數能提高應用的模塊兒性和代碼的重復利用率。python提供了很多內置函數,比如print(),len()等等。我們也可以自己創建函數,這種函數叫做用戶自定義函數。

二、函數的定義和調用

  讓我們來定義一個能計算字符串長度的,類似於len()的函數

# s = "我的團長我的團"   # 1
# def my_len(): # 定義/聲明一個函數 函數名的定義和變量名的規則一樣 #3
# i = 0 #4 # for k in s: #5 # i += 1 # print(i) # my_len() # 調用函數 #
2 # my_len() # my_len() # my_len() # length = my_len() # print(length) # print: None 只是執行函數,並沒有把結果返回給my_len

定義:def關鍵字開頭,空格之後+函數名稱和(),最後加" :" 冒號。

   def是固定的寫法,他就是定義函數的關鍵字不能換其他關鍵字或者字符串

空格是為了將關鍵字def 和函數名分開,必須空,但是一般人只空一格。

函數名:函數名的命名規則和變量名的一樣,由數字,字母下劃線組成且不能以數字開頭。函數名的定義並沒有嚴格規定,但默認還是要盡量簡短,並能表達函數功能。

括號:括號是必不可少的部分裏面可以存放參數

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

調用: 很簡單就是 函數名() 務必加上括號

三、函數的返回值

return關鍵字的作用

  return是一個關鍵字,在pycharm裏,會自動變色。

  很顯然return是“返回”的意思,我們管寫在return後面的值叫做“返回值”。

返回值有如下三種情況:

  1.沒有返回值 默認返回None

#  不寫 return
#  只寫return  結束一個函數的繼續
#  return None  和不寫return是一樣的 都返回 None  最不常用
# def func
=(): # l1 = [狗哥, 狗智] # for i in l1: # print(i) # if i == 狗哥: # return # 找到狗哥之後後面的就不循環了 # r1 = func() # print(r1)

  2.返回一個值 可以是數字、列表、字典等

# 1.可以返回任何數據類型 2. 只要返回了就可以接收到
# 3.如果一個程序中有多個return的話只執行第一個
# def func():
#     return [1, 2, 3]
# print(func())

  3.返回多個值

# def func2():
#     return 1, 2, 3  # 相當於返回了一個元組 return1,2,3) python特性
# r1, r2, r3 = func2()
# print(r1, r2, r3)  #  1 2 3

# r1, r2 = func2()
# print(r1, r2) # 會報錯 兩個變量不能接收三個返回值 不能平均分配

# r1 = func2()
# print(r1)   #可以用一個變量接收,返回一個元組 --> (1, 2, 3) 不可變類型
# 多個返回值用多個變量接收,有多少返回值就用多少變量接收

四、函數的參數

形參與實參:

我們調用函數的時候就是傳參的過程,括號裏的內容就是實際參數,是實際要交給函數的內容,簡稱實參。

當以函數的時候就是接受函數的過程,括號裏的內容就是形式參數,在定義函數的時候他只是一個形式,表示這裏有一個參數,簡稱形參。

# s = "我的團長我的團"
# l1 = [1, barry, 大鐵錘]
# def my_len(s):  # 接收參數 形式參數 形參
#     i = 0
#     for k in s:
#         i += 1
#     return i
# r1 = my_len(s) # 傳參  傳遞參數  實際參數 實參
# r2 = my_len([1,2,3])
# print(r1, r2)  # -->7 3

 站在實參的角度上 

1.按照位置傳參
  2.按照關鍵字傳參
  3.可以混著用,但是必須先按照位置傳參再按照關鍵字傳參
不能給同一個變量傳多個值

# def my_sum(a, b):
#     print(a, b)
#     res = a + b # result
#     return res
# ret = my_sum(1, 2)  # 按照位置傳 1-->a  2-->b
# ret = my_sum(b=2, a=1) # 按照關鍵字傳參
# ret = my_sum(1, b=2) # 位置傳參關鍵字傳參混著用
# print(ret)

站在形參的角度上;

  位置參數:必須傳,且有幾個參數就傳幾個值
  默認參數:可以不傳,如果不傳就用默認參數,如果傳了就用傳的

def classmate(name, sex=):
    print(%s : %s %(name,sex))
classmate(二爺)
classmate(小五)
classmate(騷鑫)
classmate(馬哥, )
classmate(coco, )

調用 函數時候:

  按照位置傳:直接寫參數的值
  按照關鍵字傳: 關鍵字 = 值

定義參數的時候:

  位置參數:直接定義參數
  默認參數:默認參數:參數名=默認的值
  動態參數 可以接收任意多個參數
  參數名之前加* 習慣用args /參數的意思
  參數名之前加** 習慣用kwargs
  順序:先定義位置參數,*args,默認參數,**kwargs

# 定義的時候使用按位置傳參,傳參的時候既可以用位置傳參,又可以用關鍵字傳參
def classmate(name, sex):
    print(%s : %s%(name, sex))
classmate(狗哥, )
classmate(sex=, name=雞哥)

def classmate(name, sex=):
    print(%s : %s%(name, sex))
classmate(狗哥)
classmate(雞哥, sex=)
# 定義參數類型和傳遞參數類型之間沒有必然聯系

動態參數    

動態參數 可以接收任意多個參數 參數名之前加* 習慣用args /參數的意思

# def sum(*args): #args僅僅是參數名
#     n = 0
#     for i in args:
#         n += i
#     return n
# print(sum(1, 2))
# print(sum(1, 2, 3))
# print(sum(1, 2, 3, 4))

# 接收動態參數
# def func(*args): #只能接收到按位置傳遞的參數,不能接收關鍵字傳參
#     print(args)
# func(1, 2, [jack, 5,], {name:barry}) #-->(1, 2, [jack, 5], {name: barry})

# def func(*args, l1=[]):
#     print(args, l1)
# func(1, 2, [rose, marry])
# func(3, 4,coco, l1=[jack ma , lucy])

# 按照關鍵字傳多個參數
# def func(**kwargs):
#     print(kwargs)
# func(a=1, b=2, c=3)
# func(a=1, b=2)
# func(a=1)
# func(a=1, b=2, c=3)
# 動態參數有兩種:可接收任意多個參數
    #*args : 接受的是按位置傳參的值,組成一個元組
    #**kwargs : 接收的是按照關鍵字傳參的值,組成一個字典
    #args必須在kwargs之前
# 雙劍合璧 天下無敵

# def func(*args, **kwargs):
#     print(args, kwargs)
#  func(1, 2, a=3, b=sb) #-->(1, 2) {a: 3, b: sb}
                            # 只要在傳參的時候符合先按位置再按關鍵字就OK

# def func(a, b,*args, default=1, **kwargs): #這幾種參數少了誰都可以,但順序必須牢記
#    print(a, b, args, default, kwargs)
# func(1, 2, default=2, a=3, b=sb)

# 動態參數的另一種傳輸方式
# def func(*args): #站在形參的角度,給變量加上* 就是組合所有傳來的值
#     print(args)
# func(1,2, 3, 4)
# l1 = [1, 2, 3, 4]
# func(*l1) #站在實參的角度上,給序列加上* ,就是將序列按順序打散

# def func(**kwargs):
# #     print(kwargs)
# # func(a=1, b=2)
# # dic1 = {a: 1, b: 2}
# # func(**dic1)

五、函數的註釋

def func():
    ‘‘‘
    這個函數實現了什麽功能
    參數1:
    參數2:
    。
    。
    。
    :return:  是字符串或列表的長度
    ‘‘‘
    pass

  作業:

# 1. 寫函數,檢查獲取傳入列表或元組對應的所有奇數位索引對應的元素,並將其作為新列表返回給調用者
# def func(l1):
#     return l1[1::2] # 切片
# print(func([1, 2, 3, 4, 5, 6]))
# 2.寫函數,判斷用戶輸入的值(字符串,列表,元組)長度是否大於5
# def func(x):
#     return len(x) > 5
#
# print(func(everything i never told you!)) #返回的是布爾值
#
# if func(sad):
#     print(確實大於五)
# else:
#     print(小於五)
# 3.寫函數,檢查傳入列表的長度,如果>2,那麽僅保留前兩個長度的內容,並將新內容返回給調用者
# def func(l1):
#     if len(l1) > 2: # 這一步完全可以省略
#         return l1[:2]
# print(func([1, 2, 3, 4])) #-->[1, 2]

# 4. 寫函數 計算傳入字符串中,數字,字母,空格,以及其他 的個數,並返回結果
# def func(s):
#     dic = {num: 0, alpha: 0, space: 0, other: 0 }
#     for i in s:
#         if i.isdigit():
#             dic[num] += 1
#         elif i.isalpha():
#             dic[alpha] += 1
#         elif i.isspace():
#             dic[space] += 1
#         else:
#             dic[other] += 1
#     return dic
# print(func(s = +*da4=@5a s c d))

# 5. 寫函數,檢查用戶輸入的對象(字符串,列表,元組)的每一個元素是否含有空內容,並返回結果


# def func(x):
#     if type(x) is str and x:
#         for i in x:
#             if i ==  :
#                 return True
#     elif x and type(x) is list or type(x) is tuple:
#         for i in x:
#             if not i:
#                 return True
#     elif not x:
#         return True
# print(func(dasd asd))
# print(func([1, 2, []]))
# print(func([]))
# print(func((1, 2, ())))

# 6.寫函數,檢查傳入字典的每一個value的長度,如果>2,那麽僅保留兩個長度的內容,並將新內容返回給調用者
# dic = {k1: v1,v2,v3, k2: 1246, k3: [1, 2, 3]}
# ps 字典中的value只能是字符串或列表
# def func(dic):
# #     for k in dic:
# #         if len(dic[k]) > 2:
# #             dic[k] = dic[k][:2]
# #     return dic
# # dic = {k1: v1,v2,v3, k2: 1333324, k3: [1, 2, 3]}
# # print(func(dic))

# 7. 寫函數,接收兩個數字參數,返回比較大的那個數字
# def func(a, b):
#     if a > b:
#         max = a
#     else:
#         max = b
#     return max
#
# print(func(2, 1))
# 三元運算
# 變量 = 條件返回true的結果 if 條件 else 條件返回false的結果
# 必須要有結果  必須要有 ifelse   只能是簡單的情況
# def func(a, b):
#     max = a if a > b else b
#     return max  # 可以直接 return a if a > b
# print(func(10, 5))

# 8. 寫函數,用戶傳入修改的文件名兒,與要修改的內容
# 執行函數完成整個文件的批量修改操作
# def func(filename, old, new):
#     with open(filename, encoding=utf-8) as f1, #             open(%s.bak % filename, w, encoding=utf-8) as f2:
#         for line in f1:
#             if old in line:
#                 line = line.replace(old, new)
#             f2.write(line)
#     import os
#     os.remove(filename)
#     os.rename(%s.bak % filename, filename)
#     return 修改完畢
#
# print(func(H:\python\大學生兼職.txt, 快遞小哥, 家政主婦))

# def func(l1=[]):
#     l1.append(1)
#     print(l1)
# func() # [1]
# func([]) #[1]
# func([a]) #[a,1]
# func() #[1,1]
# func() #[1,1,1]
# 如果默認參數是一個可變數據類型,
# 那麽每次調用函數的時候,
# 如果不傳值就公用這個數據類型的資源

# def func(k, dic={}):
#     dic[k] = v
#     print(dic)
# func(1) # {1 :v}
# func(2) #{1 :v,2 :v}
# func(3) #{1 :v,2 :v,3 :v}
# func(4) #{1 :v,2 :v,3 :v,4: v}

python 初始函數