1. 程式人生 > >再遇函數

再遇函數

元素 鍵值 clas max 返回字典 返回 為什麽 sig ror

  • 動態參數
    • *args,動態位置參數接收到的是元組,使用時註意位置參數一定要在動態參數前面,否則位置參數的內容全部被動態參數接收
    • **kwargs,動態關鍵字參數,接收到的是字典,使用時註意與默認值參數位置,默認值在**kwargs的前面
    • 順序: 位置參數>*args>默認值參數>**kwargs
    • 在實參位置上*,**是代表把列表或者字典叠代打散
    • 在形參位置,*,**是代表把位置參數,關鍵字參數聚合成一個列表,字典.
    • 函數的註釋,在函數內部輸入"""+回車
  • 命名空間
    • 內置命名空間:存放Python為我們提供的名稱空間,如:str,int,list,tuple等
    • 全局命名空間:函數聲明外為變量命名的空間
    • 局部命名空間:在函數內部的空間
    • 全局作用域:內置命名空間+全局命名空間 可用globals查詢
    • 局部命名空間:局部命名空間 可用locals查詢
  • 函數嵌套
    • 函數裏面可以分層級疊加使用函數,跟if語句相似
    • 函數只有調用了才會執行 即出現()
    • 註意執行順序
  • global和nonlocal
    • global:在局部空間調用全局空間中的變量,可改變全局變量中的值
    • nonlocal:只能在局部空間中使用,調用的也是相鄰一級中的變量,如果相鄰一級找不到再去上一級中尋找,但是最終只會尋找到全局變量中的下一層,不會到全局中尋找.

習題

# 2 寫函數,接收n個數字,求這些參數數字的和。(動態傳參)
# lst=[1,23,12,34,12,6,56,3,76]
# def sum(*args):
#     num = 0
#     for el in args:
#         num = num + el
#     return num
# print(sum(*lst))
# 3讀代碼,回答:代碼中,打印出來的值a,b,c分別是什麽?為什麽?
# a = 10
# b = 20
# def test5(a,b):
#         print(a,b)
# c = test5(b,a)
# print(c)
#a = 20,b=10,c=None  程序在執行c = test5(b,a)時通過位置傳參把全局空間中b,a 的值賦值給了局部空間中的a,b,
# 函數執行完畢打印出ab的值,程序在執行完c = test5(b,a)後,局部命名空間的變量的值清空,所以在全局命名空間中打印c為None

#4,讀代碼,回答:代碼中,打印出來的值a,b,c分別是什麽?為什麽?
# a=10
# b=20
# def test5(a,b):
#     a=3
#     b=5
#     print(a,b)
# c = test5(b,a)
# print(c)
# print(a,b)
# 函數中打印的a=3,b=5全局空間中打印的a=10,b=20,c=None,函數中的ab屬於局部命名空間,最後打印的ab屬於全局命名空間
# 程序執行到print(c)的時候,c並沒有返回值 所以為None
# 5
# 寫函數,傳入函數中多個實參(均為可叠代對象如字符串,列表,元祖,集合等),
# 將每個實參的每個元素依次添加到函數的動態參數args裏面.
# 例如 傳入函數兩個參數[1,2,3] (22,33)最終args為(1,2,3,22,33)
# lst=[1,2,3]
# tu=(22,33)
# z ="123jia"
# s={1,2,3,4,5}
# def die(*args):
#     print(args)
# die(*lst,*tu,*z,*s)
# 6,寫函數,傳入函數中多個實參(實參均為字典),將每個實參的鍵值對依次添加到函數的動態參數kwargs裏面.
# 例如 傳入函數兩個參數{‘name’:’alex’} {‘age’:1000}最終kwargs為{‘name’:’alex’ ,‘age’:1000}
# dic = {‘name‘:‘alex‘,‘age‘:‘102‘,‘sex‘:‘未知‘}
# def dit(**kwargs):
#     print(kwargs)
# dit(**dic)
#7, 下面代碼成立麽?如果不成立為什麽報錯?怎麽解決?
#7.1
# a = 2
# def wrapper():
#         print(a)
# wrapper()
# 成立  局部空間可以用全局空間中的變量
#7.2
# a = 2
# def wrapper():
#     a += 1
#     print(a)
# wrapper()
# #UnboundLocalError: local variable ‘a‘ referenced before assignment
# 局部空間可以調用全局空間中的變量,但是麽有global不能賦值,因為沒有創建新的變量a
# #7.3
# def wrapper():
#     a = 1
#     def inner():
#         print(a)
#     inner()
# wrapper()
# 可以 局部空間中優先調用就近一層中的變量
# #7.4
# def wrapper():
#     a = 1
#     def inner():
#         a += 1
#         print(a)
#     inner()
# wrapper()
#錯誤 局部變量賦值之前要先進行創建a
# 8,寫函數,接收兩個數字參數,將較小的數字返回.
# a=input("請輸入數字a:")
# b=input("請輸入數字b")
# def compare(a,b):
#     return a if a>b else b
# print(compare(a,b))
# 9,寫函數,接收一個參數(此參數類型必須是可叠代對象),將可叠代對象的每個元素以’_’相連接,形成新的字符串,並返回.
# 例如 傳入的可叠代對象為[1,‘老男孩‘,‘武sir‘]返回的結果為’1_老男孩_武sir’
# lst = [1,‘老男孩‘,‘武sir‘]
# def y(*args):
#     s = ""
#     for el in args:
#         s=s+str(el)+"_"
#     print(s.strip("_"))
# y(*lst)
# 10
# 寫函數,傳入n個數,返回字典{‘max’:最大值,’min’:最小值}
# 例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此題用到max(),min()內置函數)
# def sun(*args):
#     dic = {}
#     dic[‘max‘]=max(args)
#     dic[‘min‘]=min(args)
#     print(dic)
# sun(2,5,7,8,4)
# 11
# 寫函數,傳入一個參數n,返回n的階乘
# 例如:cal(7)  計算7*6*5*4*3*2*1
# def cal (s):
#     if s ==0:
#         return True
#     else:
#         return s*cal(s-1)
# print(cal(4))
# 12寫函數,返回一個撲克牌列表,裏面有52項,每一項是一個元組
# 例如:[(‘紅心’,2),(‘草花’,2), …(‘黑桃’,‘A’)]
#
# def pu():
#     l = [‘紅心‘,‘草花‘,‘黑桃‘,‘方片‘]
#     l1 = [‘A‘,1,2,3,4,5,6,7,8,9,‘J‘,‘Q‘,‘K‘]
#     l2 = []
#     for i in l:
#         for el in l1:
#             l2.append((i,el))
#     print(l2)
# pu()
# 14 有如下函數:
# def wrapper():
#     def inner():
#         print(666)
# wrapper()
# 你可以任意添加代碼,用兩種或以上的方法,執行inner函數.
# 1
#def wrapper():
#     def inner():
#         print(666)
#     inner()
# wrapper()
# 2
# def wrapper():
# #     def inner():
# #         print(666)
# #     return inner()
# # wrapper()
# 1,有函數定義如下:
# def calc(a,b,c,d=1,e=2):
#     return (a+b)*(c-d)+e
# 請分別寫出下列標號代碼的輸出結果,如果出錯請寫出Error。
# print(calc(1,2,3,4,5)) # 2
# print(calc(1,2)) #error
# print(calc(e=4,c=5,a=2,b=3))# 24
# print(calc(1,2,3))# 8
# print(calc(1,2,3,e=4))# 10
# print(calc(1,2,3,d=5,4))__error___

# 2,(此題有坑)下面代碼打印的結果分別是_list1=[10,‘a‘],list=[123],list3=[10,‘a‘].
# def extendList(val,list=[]):
#     list.append(val)
#     return list
# list1 = extendList(10,)
# list2 = extendList(123,[])

  

再遇函數