函數參數總結
1.位置匹配 func(name)
2.關鍵字匹配 func(key=value)
3.收集匹配
1.元組收集 func(name,arg1,arg2)
2.字典收集 func(name,key1=value1,key1=value2)
4.參數順序
1.位置匹配 func(name)
def func(arg1,arg2,arg3): return arg1,arg2,arg3 print func(1,2,3)
(1, 2, 3)
2.關鍵字匹配 func(key=value)
和順序無關,可以有默認值。
def func1(k1='',k2=None,k3=''): return k1,k2,k3 print (func1(k3=5,k1=4,k2=3)) print (func1(k1=1,k3=2))
(4, 3, 5)
(1, None, 2)
3.收集匹配
1.元組收集 func(name,arg1,arg2)
2.字典收集 func(name,key1=value1,key1=value2)
def func2(a,d,b=4,*kargs,**kwargs): return kargs print (func2(2,3,4,5,6,7,9,[1,2,3,4],{1:2,3:4})) def func2(*kargs,**kwargs): return kargs print (func2(2,3,4,5,6,7,9,[1,2,3,4],{1:2,3:4})) def func2(*kargs,**kwargs): return kargs print (func2(2,3,4,{1:2,3:4},[1,2,3,4],5,6,7,9))
(5, 6, 7, 9, [1, 2, 3, 4], {1: 2, 3: 4})
(2, 3, 4, 5, 6, 7, 9, [1, 2, 3, 4], {1: 2, 3: 4})
(2, 3, 4, {1: 2, 3: 4}, [1, 2, 3, 4], 5, 6, 7, 9)
4.參數順序
1.先是位置匹配的參數 a, d
2.再是關鍵字匹配的參數 b=4
3.收集匹配的元組參數 *kargs 一個星號是元祖
4.收集匹配的關鍵字參數 **kwargs 兩個星號是字典
5. 一些習題
'''
1.定義一個func(name),該函數效果如下。
assert func("lilei") = "Lilei"
assert func("hanmeimei") = "Hanmeimei"
assert func("Hanmeimei") = "Hanmeimei"
'''
1 def capstr(name): 2 return name.capitalize()
"""
2.定義一個func(name,callback=None),效果如下。
assert func("lilei") == "Lilei"
assert func("LILEI",callback=string.lower) == "lilei"
assert func("lilei",callback=string.upper) == "LILEI"
"""
1 import string 2 def swastr(name, callback=None): 3 ''' 4 swastr(name, callback=None) -> str 5 name is a str.return a str of required tyoe,or a capitalize type if is not required. 6 ''' 7 if callback == None: 8 return name.capitalize() 9 else: 10 return callback(name)
"""
3.定義一個func(*kargs),效果如下。
l = func(1,2,3,4,5)
for i in l:
print i,
#輸出 1 2 3 4 5
l = func(5,3,4,5,6)
for i in l:
print i
#輸出 5 3 4 5 6
"""
def getitem(*kargs): return kargs
"""
4.定義一個func(*kargs),該函數效果如下。
assert func(222,1111,'xixi','hahahah') == "xixi"
assert func(7,'name','dasere') == 'name'
assert func(1,2,3,4) == None
"""
def shortstr(*kargs): ''' shortstr(*kargs) -> str or None return the shortest str in the kargs, or return None if no str in it. ''' #過濾非字符串 lis = filter(lambda x:isinstance(x,str),kargs) #收集長度 len_lis = [len(x) for x in lis] if len_lis: min_index = min(len_lis) return lis[len_lis.index(min_index)] #這兩部絕對精華呢! return None
"""
5.定義一個func(name=None,**kargs),該函數效果如下。
assert func(“lilei”) == "lilei"
assert func("lilei",years=4) == "lilei,years:4"
assert func("lilei",years=10,body_weight=20) == "lilei,years:4,body_weight:20"
"""
def detail(name=None,**kargs): #方法一 ''' detail(name=None,**kargs) -> str name is a str.return a str like'name,key1:value1,key2:value2' 這個函數特定的功能 ''' data = [] for x,y in kargs.items(): data.extend([',', str(x), ':', str(y)]) info = ''.join(data) return '%s%s'%(name,info) def func(name=None,**kargs): #方法二 lis = ["%s:%s"%(k,v) for k,v in kargs.items()] lis.insert(0,name) return ','.join(lis)
#coding =utf-8
#Lesson: 進階篇3-函數第二節
'''
1 定義一個方法get_num(num),num參數是列表類型,判斷列表里面的元素為數字類型。
其它類型則報錯,並且返回一個偶數列表:(列表里面的元素為偶數)
'''
def get_num(num_list):
'判斷列表里面的元素為數字類型'
num_list_k = []
if not isinstance(num_list,list): # isinstance
(object, classinfo) object的類型
return '請輸入以list為類型的參數。' else: for i in num_list: if not isinstance(i,int): return '列表里面的元素必須為數字類型。' elif i % 2 == 0: num_list_k.append(i) return num_list_k print (get_num([1,2,5,6,8,20])) assert get_num([1,2,5,6,8,20])== [2,6,8,20],'斷言得到的結果。' assert get_num((1,2,5,7,9,3))=='請輸入以list為類型的參數。' assert get_num([1,'abcd',5,6,8,20])=='列表里面的元素必須為數字類型。' print(get_num.__doc__) # 屬性__doc__可以輸出文檔字符串的內容 ################################################################################################## ''' 2 定義一個方法get_page(url),url參數是需要獲取網頁內容的網址, 返回網頁的內容。 提示(可以了解python的urllib模塊)。 ''' # 方法一 from urllib.request import urlopen def get_page(url): '返回網頁的內容' if not isinstance(url,str): return '輸入的網址類型不對。' elif url.startswith('http://'): url_info = urlopen(url).read() return url_info else: return '請檢查您輸入的網址格式,網址要以 http:// 開始。' print (get_page('http://www.baidu.com')) assert get_page('www.baidu.com') =='請檢查您輸入的網址格式,網址要以 http:// 開始。' assert get_page(123) == '輸入的網址類型不對。' ################################################################################################### # 方法二 def get_page(url): if not isinstance(url,str): return '輸入的數據類型不對。' if not ur.startswith('http://') and not url.startswith('http://'): return "error url_format" try: url_info = urlopen(url).read() except Exception as e: logging.debug(e) else: return url_info assert get_page('www.baidu.com') == '請檢查您輸入的網址格式,網址要以 http:// 開始。' assert get_page(123) == '輸入的網址類型不對。' ################################################################################################### ''' 3 定義一個方法 func, 該func引入任意多的列表參數,返回所有列表中最大的那個元素。 ''' def func(*l_args): all_list = [] for i in l_args: if isinstance(i,list): all_list.extend(i) else: return '請輸入正確的列表參數。' all_list.sort() return all_list[-1] print (func([1,845,10000,7,8,9,]),[8888800,3345,111],[1,2,3])) assert func([4,5,7,19],[3,5,7],[1,2,3]) == 19,'斷言結果為最大的數19' assert func([4,5,7,19],'abc',[1,2,3]) == '請輸入正確的列表參數。' ####################################################################################################### ''' 4 定義一個方法get_dir(f), f參數為任意一個磁盤路徑,該函數返回路徑下的所有文件夾組成的列表, 如果沒有文件夾則返回“not dir” ''' import os def get_dir(f): l_dir = [] if not os.path.isdir(f): return '輸入的磁盤路勁的參數不正確。' else: for i in os.listdir(f): l_dir.append(i) if l_dir == []: # if l_dir: 后面的代碼更好看 return 'Not dir' # return l_dir else: # else: return l_dir # return 'Not dir' print (get_dir('test/')) assert type(get_dir('test/'))== list,'is list' assert get_dir('123') == '輸入的磁盤路徑的參數不正確。'