day03-函数

形参:位置参数:必须传
    *args:动态参数,可以接收任意多个位置参数
    默认值参数:可以传也可以不传
    **kwargs:动态参数,可以接收多个关键字参数。
实参:按照位置传参,按照关键字传参。

#顺序:位置参数,*args,默认值参数,**kwargs。
def test(a,*args,t=10,**kwargs):   #t=10是默认值参数,要放在**kwargs前面。
    print(args,kwargs,t)
test(1,23,3,12,45,3,1,5,1,3,5,1,3,t=200,a='asdf',b='awea') #t=200是关键字传参。

def test1(*args):           #args是元组。
    print(args)
a = (1,2,3,87,45,3,43,645)
test1(*a)                   #将元祖a打散成多个元素传参。

def test3(*args):
   print(*args)        #args是元组,*args是打散元组,所以执行结果是1 2 3
   print(args)        #结果是(1,2,3)
test3(1,2,3)


def test2(**kwargs):    #形参**kwargs将传入的参数放在字典里面。kwargs是字典。
    print(kwargs)
b = {'c':1,'t':23}
# test2(**b)              #实参**b将字典打散为键值对传给形参。跟下行代码test2(c=5,t=10)的效果一样。
test2(c=1,t=23)

def a():
    return 2
print(a())  #函数名()=返回值。 a()=2

def b(*args):
    return args
print(b(1,2,3))


默认值参数的陷阱
def test(a=[]):
    a.append(1)
    print(a)
test()         #因为a是默认值参数,所以调用函数的时候可以不传参,执行结果是[1]
test()         #[1,1]
test()         #[1,1,1]



返回值
没有返回值:返回None
        1.不写return
        2.只写return :结束函数,return下面的代码不执行。
        3.写return None 不常用
返回一个值:
        可以返回任何数据类型:数字,字符串,元组,列表,字典等等。
        如果有多个return,只执行第一个。
返回多个值:
        多个返回值要用多个变量接收。
def test():
    return 1,2,3
a1,a2,a3=test()  #多个返回值要用多个变量接收。
print(a1,a2,a3) #打印出1 2 3
print(test())   #打印出元组(1,2,3)

def a(b):
    return b[1::2] #返回奇数索引对应的值
print(a([1,3,3,6,1,4]))

def a(b):
    return len(b)<5  #返回传入的字符串的长度是否小于5
print(a('adsfadsf'))

def test(n):
    if len(n)>2:   #检查传入的列表的长度是否大于2,如果是,返回前面两个元素。
        return n[:2]
print(test([1,2,3,4]))

def test(list):
    '''函数注释:统计传入的参数有多少个字母(字母包含汉字),数字,空白符,其他字符'''
    alpha = 0
    digit = 0
    space = 0
    other = 0
    for i in list:
        if i.isalpha():   #如果i是字母为True
            alpha += 1
        elif i.isdigit(): #数字
            digit += 1
        elif i.isspace(): #空白符
            space += 1
        else:             #其他
            other += 1
    return alpha,digit,space,other
print(test('asdfasdfas  asdgasdg asdfasdawe645a4s4df 646 465a4 64 646 46 46 465****、、、 '))

def test(n):
    dic={'alpha':0,'digit':0,'space':0,'other':0} #利用字典简化代码,并且返回字典,让别人易读。只看结果就知道字母,数字,空白符,其他,一共多少个。
    for i in n:
        if i.isalpha():
            dic['alpha'] += 1
        elif i.isdigit():
            dic['digit'] += 1
        elif i.isspace():
            dic['space'] += 1
        else:
            dic['other'] += 1
    return dic
print(test('asdfa 44 6a4 645 6a6dfa687df6a**a*d*f*a*d*f*'))

def test(dic):
    for k in dic:
        if len(dic[k]) > 2:
            dic[k] = dic[k][:2]
    return dic
print(test({'adf':'dfa','vb':'cdag','oe':'desfg'}))


def test(a,b):  #接收两个数字,返回小的
    return  a if a<b else b #三元运算,简化代码,适合简单的情况
print(test(1,5))


a = 0               #全局变量
def outer():
    b=2             #局部变量
    def inner():    #嵌套函数
        nonlocal b  #nonlocal 声明b是外层函数
        b=20000000  #修改b的值
    inner()
    print(b)
    global a        #声明a是全局变量
    a=10000000      #修改a的值
outer()
print(a)



闭包:闭包的好处是外部函数变量a长期存放在内存当中,不会因为外部函数多次被调用而多次生成,导致占用空间。
def outer():
    a=1
    def inner():
        print(a)    #内部函数调用外部的变量,叫做闭包。这里调用了a.
    return inner    #inner()是调用inner函数,inner没有()是函数对象的意思。这里返回函数对象的地址给outer()。因为函数名()=返回值,所以outer()=inner.
outer()()         #因为outer()=inner,所以outer()()=inner(),这样就可以调用内部函数。

猜你喜欢

转载自www.cnblogs.com/python-daxiong/p/10267904.html