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') == '輸入的磁盤路徑的參數不正確。'

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM