python 函数

发布时间:2018-02-27 20:32:31编辑:admin阅读(3665)

    函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

    函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。


    定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

    特性:


    1.减少重复代码

    2.使程序变的可扩展

    3.使程序变得易维护


    语法定义

    #函数名
    def sayhi():
        print("Hello, I'm nobody!")

     调用函数

    sayhi()

    执行输出

    Hello, I'm nobody!


    下面有2个函数

    def test1():
        print('in the test1')
        #记录日志
        with open('a.txt','a+') as f:
            f.write('end action\n')
    
    def test2():
        print('in the test2')
        # 记录日志
        with open('a.txt','a+') as f:
            f.write('end action\n')
    
    test1()
    test2()

    可以看出记录日志部分,代码重复了。那么重复的代码,可以封装成一个函数,方便调用。


    优化后的代码如下:

    #记录日志
    def logger():
        with open('a.txt','a+') as f:
            f.write('end action\n')
    
    def test1():
        print('in the test1')
        logger()
    
    def test2():
        print('in the test2')
        logger()
    
    test1()
    test2()

    执行程序,查看日志文件

    end action

    end action


    下面来了一个需求,加上记录时间

    只需要更改logger()函数,就可以让其他函数调用时,自动生效。

    import time
    #记录日志
    def logger():
        #时间格式
        time_format = '%Y-%m-%d %X'
        #strftime获取当前时间,应用定义好的时间格式
        time_current = time.strftime(time_format)
        with open('a.txt','a+') as f:
            f.write('%s end action\n' %time_current)
    
    def test1():
        print('in the test1')
        logger()
    
    def test2():
        print('in the test2')
        logger()
    
    test1()
    test2()

    查看文件内容

    end action

    end action

    2018-02-25 14:56:43 end action

    2018-02-25 14:56:43 end action


    函数返回值

    要想获取函数的执行结果,就可以用return语句把结果返回


    举个例子:

    def test1():
        print('in the test1')
        return 0
        print('test end')
    
    test1()

    执行输出

    in the test1


    为什么没有输出test end ?

    注意:


    函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束

    如果未在函数中指定return,那这个函数的返回值为None

    函数的返回值,有3种情况

    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'}
    
    x=test1()
    y=test2()
    z=test3()
    print(x)
    print(y)
    print(z)

    执行输出

    in the test1

    in the test2

    in the test3

    None

    0

    (1, 'hello', ['alex', 'wupeiqi'], {'name': 'alex'})


    总结:

    1.当函数没有返回值时,默认返回None

    2.函数只有一个返回值,返回一个

    3.函数有多个值,返回一个元组


    函数的返回值,可以是任意对象,比如数字,列表,函数...


    函数为什么要有返回值呢?

    某些情况下,调用函数的时候,需要知道函数的返回值。后续的程序逻辑会根据返回值,做进一步判断。

    比如一个用户登录函数,登录成功,返回true,否则返回false


    函数参数

    函数在执行的时候,也可以带参数

    #形参
    def test(x,y):
        print(x,y)
    
    #实参
    test(1,2)

    执行输出 1 2


    形参:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。

    实参:可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。


    形参和实参 按照顺序,是一一对应的,个数不能多。


    关键参数

    正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可。

    def test(x,y):
        print(x,y)
    
    test(y=1,x=2)

    执行输出 2 1


    函数执行,同时用 关键参数和位置参数

    def test(x,y):
        print(x,y)
    
    test(x=1,2)

    执行输出

    SyntaxError: positional argument follows keyword argument

    为什么呢?

    关键参数必须放在位置参数之后。

    def test(x,y):
        print(x,y)
    
    test(1,y=2)

    执行输出 1 2 


    默认参数

    def test(x,y=2):
        print(x,y)
    
    test(1)

    执行输出 1 2 


    由于y已经有了一个默认参数,所以执行的时候,只传一个参数即可。


    默认参数也可以传参数

    def test(x,y=2):
        print(x,y)
    
    test(1,3)

    执行输出 1 3


    默认参数的特点:

    调用函数的时候,默认参数非必填项


    用途:提前固定参数


    非固定参数

    def test(*args):
        print(args)
    
    test(1,2,3,4,5)

    执行输出 (1, 2, 3, 4, 5)


    *args 表示一个 非固定参数

    若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数


    def test(x,*args):
        print(x)
        print(args)
    
    test(1,2,3,4,5)

    执行输出

    1

    (2, 3, 4, 5)


    把N个关键字参数,转换成字典的方式

    def test(**kwargs):
        print(kwargs)
    
    test(name='zhang',age=12)

    执行输出

    {'name': 'zhang', 'age': 12}


    python中,函数的参数除了最基本的必选参数,默认参数外,主要包含以下几种特殊的参数类型:可变参数,关键字参数,命名关键字参数。它们的存在,使得函数的参数更加自由。在函数定义时,

    他们定义的顺序为:必选参数、默认参数、可变参数、命名关键字参数和关键字参数


    匿名函数 

    匿名函数就是不需要显式的指定函数


    使用 lambda 来创建匿名函数。


    lambda只是一个表达式,函数体比def简单很多。

    lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

    lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

    lambda函数只能写一行


    应用场景

    如果一个方法,整个程序只用一次,不会涉及其他程序调用。

    没有必要单独写一个函数,函数的重要功能就是重复使用。

    这种情况下,可以写一个匿名函数,用完就释放了。


    语法

    lambda函数的语法只包含一个语句,如下:

    lambda [arg1 [,arg2,.....argn]]:expression


    举个例子

    def calc(n):
        return n ** n
    
    print(calc(10))

    换成匿名函数

    calc = lambda n: n ** n
    print(calc(10))

    执行输出

    10000000000


    再复杂一点的

    def calc(n):
        print(n)
        for i in range(n):
            print(i)
    
    print(calc(10))

    这个就没法转成匿名函数了


    匿名函数还可以用于三元运算

    calc = lambda n:3 if n<4 else n
    print(calc(10))

    执行输出10

    因为n小于3,输出n,那么n就是10


    匿名函数很少单独使用,一般和其他函数配合使用

    比如过滤大于5的数字

    res = filter(lambda n:n>5,range(10))
    for i in res:
        print(i)

    执行输出

    6

    7

    8

    9


关键字