函数的返回值,函数的返回值可以不返回,也可以只返回一个值。当有多个返回值的时候,可以以元组的形式返回。
def test1():
    print('in the test1')

def test2():
    print('in the test2')
    return 0

def test3():
    print('in the test3')
    return 1,'hello',['alex','wupeiqi'],{'name':'alex'}
    #return  test2
x=test1()
y=test2()
z=test3()
print(x)
print(y)
print(z)

有参数形式的函数

def test5(x,y): #可以设置默认参数def test5(x=1,y=10):
    print(x)
    print(y)
test5(y = 5,x = 1) #与形参顺序无关
test5(5,1)  #与形参顺序一一对应
#test5(x = 5,1) #有位置参数,又有关键字调用,则按照位置参数调用,关键字参数是不能写在位置参数前面的
test5(5,y = 1)
#默认参数特点:默认参数可有可无,默认参数非必须传递
#用途:1.默认值,此变量可以在调用函数时不传递
#上面的函数在调用时,传递实参的数量只能比形参少,不能比形参多

针对传递的实参数量不固定,可以传递参数组

def test(x,*args): #'*'表示传递的实参数量不固定
    print(args)
    print('the number of membe is %s'%x)
#*args接受的是位置参数,不能接受关键字参数,转换成元组的形式
#函数调用
test(4,2,3,4,5)
test(5,*[1,2,3,4,6])

  

#**kwargs把n个关键字参数,转换成字典的方式
def test2(**kwargs):
    print(kwargs)
    print(kwargs['name'])
    print(kwargs['age'])

test2(name = 'shunge',age = '28')
test2(**{'name': 'shunge', 'age': '28'})
import time
def logger(source):
    time_format = '%y-%m-%d,%X'    
    time_current = time.strftime(time_format)
    print('time:%s'%time_current, 'from %s'%source)

def test3(name,age = 28,**kwargs):
    print(kwargs)
    print(name)
    print(age)
    logger('test3')              #函数之间的调用

test3('shunge',sex = 5,age = '4')


#函数式编程
#*现在的函数多定义的是一段代码执行的过程
#*函数式编程:更接近于数学运算,一种抽象程度很高的编程范式,纯粹的函数式编程是没有
#*变量的,只要输入是确定的,则输出就是确定,python对函数式编程部分支持,python对
于学习函数式编程不是一个很好的选择


#****函数的局部变量与全局变量
#在子称程序中定义的变量时全局变量,在程序定义开始前的变量称为全局变量
#全局变量与局部变量同名时,存在程序内部局部变量起作用,其他地方全局变量起作用
names = ["alex","two","three"]
name_tuple =(1,2,3,4)  #元组
def change_name():
    names[0] = "金角大王"
    print('inside func',names)

change_name()
print(names)


#****高阶函数
#变量可以指向函数,函数的参数可以接收另一个函数作为参数,这种函数称之为高阶函数
def add(x,y):
    return x+y
def mul(x,y):
    return x*y
def deal(x,y,f,f1):
    return f(x,y)+f1(x,y)
z = deal(5,7,add,mul)
print(z)