zoukankan      html  css  js  c++  java
  • 【Python】解析Python中函数的基本使用

    1.简介

    在Python中定义函数的基本格式为:

    def <函数名>(参数列表):
        <函数语句>
        return <返回值>


    Python中的函数形式比较灵活,声明一个函数不需要声明返回值类型,也不需要声明参数类型。在使用函数之前必需先定义函数。

    下面是一个基本使用案例:

    '''
    多行注释:定义sum函数,求和。
    '''
    def sum(t):
        result = 0;
        for e in t:
            result+=e;
        return result;
    #单行注释:将set对象传入sum函数
    res = sum({1,2,3,4});
    print(res);

    2.global全局变量

    2.1 global关键字的使用

    Python中变量作用域分为局部作用域、全局作用域和内置作用域。

    def test():
        print(a);
    a = "hello world";
    test();

    输出:

    hello world

    当执行到print(a)的时候,会在test()函数中搜索变量a,如果test()作用域中没有变量a,那么它会去全局作用域中搜索变量a。

    上面案例中变量a的作用域是全局作用域。若函数中也有一个局部作用域变量a,那么会发生什么呢?

    def test():
        a = "i am in internal";
        print(a);
    a = "i am in external";
    test();
    print(a);

    输出:

    i am in internal
    i am in external

    这个输出结果是我们预期之内的,从结果可以看出,当在局部作用域和全局作用域中有相同的变量名时,在局部作用域之内以局部作用域的变量名为准,在局部作用域之外以全局作用域的变量名为准。

    如果想在局部作用域之内使用全局作用域的变量,那么可以使用global关键字:

    def test():
        global a;
        a = "hello world";
        print(a);
    a = "i am in external";
    test();
    print(a);

    输出:

    hello world
    hello world

     2.2 globals()和locals()的使用

    在Python中可以使用locals()来访问局部命名空间中变量,例如:

    def functest(i,str):
        x = 12345
        print(locals())
    functest(1,"test")

    输出:

    {'x':12345,'str':'test','i':1}


    内置函数globals()用来访问全局命名空间中变量,例如:

    if '__main__' == __name__:
        print(globals())

    输出:

    {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/home/test1.py', 'x': 12345}


    Python中的globals()函数和locals()函数的返回值数据类型都是Dictionary,但是locals()返回的是局部命名变量的副本;而globals()返回的是实际的全局命名空间,所以任何对globals()的改变都会影响到全局变量。

    def funtest(i):
        print('局部变量 i = ',locals()['i'])
        print("修改局部变量 locals()['i']=12 ")
        locals()['i'] = 12
        print('局部变量 i = ',locals()['i'])
    y = 1
    if '__main__' == __name__:
        funtest(y)
        print('----------------')
        print('全局变量 y = ',globals()['y'])
        print("修改全局变量 globals()['y']=12")
        globals()['y'] = 12
        print('全局变量 y = ',globals()['y'])

    输出:

    局部变量 i =  1
    修改局部变量 locals()['i']=12
    局部变量 i =  1
    ----------------
    全局变量 y =  1
    修改全局变量 globals()['y']=12
    全局变量 y =  12

    从上面的结果可以看出,globals()和locals()虽然都返回Dictionary的数据类型,但是任何对globals()的修改都会影响到全局变量,但是对locals()的修改不会影响到任何局部变量。

    3.不定长参数

    不定长参数也被称为可变参数,在定义变长参数的时候只需要在变量前面加上星号“*”。变长参数的形参类型是元组类型(tuple),若不传入任何参数那么它就是一个空元组。

    def printinfo(num,*vartuple):
        print("接下来会打印 ",num," 个参数");
        for a in vartuple:
            print(a);
    
    printinfo(3,"how","are","you");

    输出:

    接下来会打印3个参数
    how
    are
    you

    Python中除了单个星号的可变参数,还有两个星号的可变参数(**),两个星号的可变参数表示关键字参数,它本质上是一个dict,下面的代码展示了如何使用。

    def fun(**kwargs):
        for key, value in kwargs.items():
        print("{0} 喜欢 {1}".format(key, value))
    
    fun(Geek="cat", cat="box")

    输出:

    Geek 喜欢 cat
    cat 喜欢 box

    4.匿名函数

    在Python中,lambda的语法是唯一的。其形式如下:

     lambda argument_list: expression

    其中,lambda是Python预留的关键字,argument_list和expression由用户自定义。具体介绍如下。
    1.这里的argument_list是参数列表。它的结构与Python中函数(function)的参数列表是一样的,argument_list可以有非常多的形式。
    2.这里的expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。

    lambda函数示例:

    lambda x, y: x*y;函数输入是x和y,输出是它们的积x*y
    lambda:None;函数没有输入参数,输出是None
    lambda *args: sum(args); 输入是任意个数的参数,输出是它们的和(隐性要求是输入参数必须能够进行加法运算)
    lambda **kwargs: 1;输入是任意键值对参数,输出是1

    例如:

    f = lambda x, y: x*y  #声明lambda表达式
    res = f(2,3)  #调用函数

    将lambda函数作为参数传递给其他函数:

    filter函数。此时lambda函数用于指定过滤列表元素的条件。例如filter(lambda x: x % 3 == 0, [1, 2, 3])指定将列表[1,2,3]中能够被3整除的元素过滤出来,其结果是[3]。

    sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。

    map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])将列表[1, 2, 3]中的元素分别加1,其结果[2, 3, 4]。

    reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])将列表 [1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。

  • 相关阅读:
    Java之JDK的下载与安装,java环境变量的配置,Editplus的下载与使用
    JAVA基础语法
    数据库设计
    数据库练习题
    连接查询,子查询,联合查询
    Java内存管理-掌握虚拟机类加载器(五)
    Java内存管理-掌握虚拟机类加载机制(四)
    Java内存管理-JVM内存模型以及JDK7和JDK8内存模型对比总结(三)
    Java内存管理-初始JVM和JVM启动流程(二)
    Java内存管理-程序运行过程(一)
  • 原文地址:https://www.cnblogs.com/HDK2016/p/10889679.html
Copyright © 2011-2022 走看看