环境小硕的转行之路-9-函数

函数可以说程序语言中极为重要的一块了,可以大幅度减少代码量,使代码变得简洁明了。让主程序的逻辑清晰。后面会学到的装饰器也是通过函数功能实现的,装饰器可以给函数添加新的功能,这就让函数变得可优化、扩展。这是一个初学者学习函数的心得。深感学习进度缓慢,学习时间不够,难受。

函数的定义


函数的定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。
特性:
1. 减少重复代码
2. 使得程序变得可扩展 
3. 使程序变得易维护

'''形式1'''
def test0(x):#函数名(形参)(如果不调用函数则不占用内存空间的参数)。统一叫位置参数
    "your function definition(文档描述)"
    x+=1#代码块
    return x#可以返回多个值,返回出一个元组出来(里面包含多个值),可以返回函数或者过程(此时返回的是函数或过程的地址)
'''形式2'''
def test1():#不传入参数,只执行一段代码。
    "test1"
    print('in the testing1')
    return 0#也可以不返回值
    print('fuck off')#这段代码不执行,因为在return后面。

函数参数的传入


'''形式1'''
def test3(x,y):
    'testing3'
    print(x)
    print(y)
test(1,2) #与形参一一对应,称为位置参数。
test(y=2,x=1) #与形参顺序无关,称为关键参数
#注意:关键参数必须放在位置参数之后,否则容易报错。
'''形式2'''
def test(*args): #若实参数目不固定,用*表示接受参数不固定。接受N个位置参数,转换成元组形式。
    print(args)
print(test(1,2,3,4,5,6))#输出元组(1,2,3,4,5,6,7)
print(test([1,2,3,4,5,6,7])) #输出一个([1,2,3,4,5,6,7])
'''形式3'''
def test2(**kwargs):#接受N个key-value形式个关键字参数,转换成字典形式
    print(1,kwargs)
    print(2,kwargs['name'])
    print(3,kwargs['age'])
    print(4,kwargs['sex'])
test2(name='negu',age=22,sex='male')
#可以和位置参数,关键字参数,默认参数联用
    输出:1 {'name': 'negu', 'age': 22, 'sex': 'male'}
    2 negu
    3 22
    4 male
    '''例子'''
def test3(name,age=22,*args,**kwargs):#位置参数不能写在某关键字参数后面
    print('name=',name)
    print('args=',args)
    print('age=',age)
    print('kwargs=',kwargs)
    print('hobby=',kwargs['hobby'])
    print('args=',args)
    logger('test3')

test3('negu',22,'haha','hehe','bibi',sex='male',hobby='python')#age可用位置或关键字参数方式赋值

局部变量


局部变量在定义局部变量的子程序(函数)中局部变量起作用,在其他地方全局变量起作用。

def change_name(name):#可以改全局变量school,前面加上一个global school(少用,用了容易导致程序混乱)
    school = "mage linux"
    print("before change",name,school)输出:before change Xiada mage linux
    name = 'NEGU' #这个函数就是这个变量的作用域,这就叫局部变量
    print('after change is %s'%name)#输出after change is NEGU
name = 'negu'
change_name('Xiada')
print(school)#学校还是iue,全局变量。
print(name) #还是negu没有改变,因为name只是一个局部变量只在函数里生效。

高阶函数


高阶函数的定义:在某个函数中若输入函数参数或者返回函数参数则是高阶函数。

def add(a,b,f):
    return f(a)+f(b)

res=add(3,-6,abs)#abs为内置函数,取绝对值
print(res)#输出9

匿名函数


#这段代码
def calc(n):
    return n**n
print(calc(10))

#换成匿名函数
calc = lambda n:n**n
print(calc(10))
#匿名函数可以和filter、map、functools.reduce联用

递归函数


在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归特性: 1. 要有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模比上次递归都应该有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

def calc(n):
    print(n)
    if int(n/2) > 0 :
        return calc((int(n/2)))
calc(10)
输出为:
10
5
2
1
原文地址:https://www.cnblogs.com/negu/p/11349819.html