• 环境小硕的转行之路-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
    
  • 相关阅读:
    IoC和AoP
    学习树
    Avalon Framework概念
    java利用WatchService实时监控某个目录下的文件变化并按行解析
    [DBT-08001] 无法检查可用内存。
    C#之http协议与soap协议之间的区别
    C#之ActionResult 详解
    C#实现连接池
    C#MVC之传入字典的模型项为 null,但此字典需要类型“System.Decimal”的非 null 模型项。
    Func的介绍
  • 原文地址:https://www.cnblogs.com/negu/p/11349819.html
Copyright © 2020-2023  润新知