python 定义函数
函数参数总结
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') == '输入的磁盘路径的参数不正确。'