再遇函數
阿新 • • 發佈:2018-08-10
元素 鍵值 clas max 返回字典 返回 為什麽 sig ror
- 動態參數
- *args,動態位置參數接收到的是元組,使用時註意位置參數一定要在動態參數前面,否則位置參數的內容全部被動態參數接收
- **kwargs,動態關鍵字參數,接收到的是字典,使用時註意與默認值參數位置,默認值在**kwargs的前面
- 順序: 位置參數>*args>默認值參數>**kwargs
- 在實參位置上*,**是代表把列表或者字典叠代打散
- 在形參位置,*,**是代表把位置參數,關鍵字參數聚合成一個列表,字典.
- 函數的註釋,在函數內部輸入"""+回車
- 命名空間
- 內置命名空間:存放Python為我們提供的名稱空間,如:str,int,list,tuple等
- 全局命名空間:函數聲明外為變量命名的空間
- 局部命名空間:在函數內部的空間
- 全局作用域:內置命名空間+全局命名空間 可用globals查詢
- 局部命名空間:局部命名空間 可用locals查詢
- 內置命名空間:存放Python為我們提供的名稱空間,如:str,int,list,tuple等
- 函數嵌套
- 函數裏面可以分層級疊加使用函數,跟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,[])
再遇函數