Loading

Python学习笔记(四)之Python函数

思维导图:

Snipaste_2020-01-14_09-43-39.png

1. 函数定义和调用

  • 实例1.1:

    #!/user/bin/python
    #coding=utf-8
    #author@ zjw
    
    #函数定义
    def printSth(sth):
        print(sth)
    
    #main方法,程序运行时一开始直接进入到该函数
    if __name__ == "__main__":
    	printSth("Hello World!") #函数调用
    
  • 输出:

    Hello World!

  • 分析:上面是一个简单的函数定义和调用的实例。

    • 函数代码块通过def关键字开头,后接函数标识符号名称和圆括号()。

    • 将传入参数放在圆括号中,这和C语言和java是一致的。

    • 函数主体以冒号开始,并且需要缩进。

    • return语句可有可无,没有return语句默认返回None,单独的一个return也是返回None。return语句可以一次性返回多个变量,在外部用一个变量接收时,获得的类型是Tuple。

      • 例1.2:(return语句可以一次性返回多个变量,在外部用一个变量接收时,获得的类型是Tuple)

        #!/user/bin/python
        #coding=utf-8
        #author@ zjw
        
        #函数定义
        def loc(x, y):
            cx = x + 1
            cy = y + 1
            return cx, cy #一次性返回两个对象
        
        #main方法,程序运行时一开始直接进入到该函数
        if __name__ == "__main__":
            z = loc(1, 2) #函数调用
            print z
        
      • 输出:

        (2, 3)

2. 参数传递

2.1 位置参数

  • 实例2.1.1:

    #!/user/bin/python
    #coding=utf-8
    #author@ zjw
    
    #创建一个函数,计算从1到x的和
    def function(x): #其中x就是默认参数
        sum = 0
        for i in range(1, x + 1):
            sum += i
        return sum
    
    if __name__ == "__main__":
        print(function(2))
    
  • 输出

    3

  • 分析:上面是一个计算从1加到x的和的函数。其中function的参数x就是函数的位置参数。但是要调用该函数时,只能传入一个参数x,当传入两个数时程序会报错。为了解决该问题我们引入了默认参数

2.2 默认参数

  • 我们现在创建一个默认计算从1加到x的和的函数,但是当传入两个变量时,我们需要计算从1到x的和和从1到y的和的两个总和的函数。

    • 实例2.2.1:

      #!/user/bin/python
      #coding=utf-8
      #author@ zjw
      
      '''
      创建一个函数,默认计算从1到x的和
      如果传入两个参数,则计算从1到x的和加上1到y的和的总和
      '''
      def function(x, y = 0):
          sum = 0
          for i in range(1, x + 1):
              sum += i
          for i in range(1, y + 1):
              sum += i
          return sum
      
      if __name__ == "__main__":
          print(function(2))
          print(function(2, 2))
      
    • 输出:

      3

      6

    • 分析:上述程序中,引入了默认参数,function函数中y就是默认参数,带有一个默认值为0,当只传入一个参数时,默认参数y默认值为0,所以计算总和时,并不影响一个参数的结果。但当我们传入两个参数时,默认参数的默认值被改变,就可以计算两个数总和的结果。

  • 设置默认参数时需要注意:

    1. 必选参数(位置参数)在前,默认参数在后,否则程序会出错。
    2. 当函数有多个参数时,传入的参数实时变化比较大的放在前面,变化小的放在后面。变化小的参数也可以作为默认参数。
  • 使用默认参数,我们可以在函数外控制参数的传递,降低了函数调用的难度,当我们需要使用比较复杂的函数参数传递时,我们也可以增加传入参数的数量。这可以实现一个函数实现多功能处理。

  • 定义默认参数时,必须指向不可变对象。否则每次进入函数后,可变对象的值可能发生了改变,对于下一次调用该函数来说,会有影响。

2.3 可变参数

  • 实例2.3.1:

    #!/user/bin/python
    #coding=utf-8
    #author@ zjw
    
    '''
    比较重点:直接传入一个list
    函数功能:计算传入的所有值的和
    '''
    def function1(li):
        sum = 0
        for i in li:
            sum += i
        print sum
    
    '''
    比较重点:用可变参数进行传递
    函数功能:计算传入的所有值的和
    '''
    def function2(*nums):
        sum = 0
        for i in nums:
            sum += i
        print sum
    
    if __name__ == "__main__":
        #来看一下传入参数的区别,明显用可变参数的更简便。
        function1([1, 2, 3])
        function2(1, 2, 3)
    
  • 输出:

    6

    6

  • 分析:从上面的实例我们可以看到,function2中带*号的nums就是可变参数。虽然function1和function2的功能是一样的,但function2简化了参数传入。在function2函数内部,参数nums接收到的是一个tuple

  • 注:如果想创建一个list后传入function2,则需要使用下面大的语法。

    • nums = [1, 2, 3]
    • function(*nums)
    • 其中*nums表示把nums这个list的所有参数作为可变参数传入。

2.4 关键字参数

  • 实例2.4.1:

    #!/user/bin/python
    #coding=utf-8
    #author@ zjw
    
    #函数功能:输出传入参数
    def student(id, name, **other):
        print('id:', id, 'name', name, 'other:', other)
    
    if __name__ == "__main__":
        student('1', 'Kangkang')
        student('2', 'Maria', age = 11) #关键字参数调用,可以自定义参数和类型
    
  • 输出:

    ('id:', '1', 'name', 'Kangkang', 'other:', {})
    ('id:', '2', 'name', 'Maria', 'other:', {'age': 11})

  • 分析:student函数中的带两个*的other参数就是关键字参数。在student函数中,除了id和name参数是必选之外,其余参数可以根据需求填写,传入关键字参数的格式如上面age = 11那样,需要一个参数+等号+参数值。传入到关键字参数后,会被封装成一个dict,并输出出来。

  • 注:同理如上面的可变参数,当我们先创建了一个dict,后面想要通过关键字参数传入时,我们需要使用如下语法:

    • other =
    • student('3', 'Jane', **other) #函数调用
    • 分析:其中**other表示吧other这个dict中所有的key-value用关键字参数的形式传入到函数中。

2.5 命名关键字参数

  • 用途:用来限制关键字参数的名字。

  • 上面的实例中,关键字参数的键值名可以随意命名,且个数可以随意控制,但是当我们想要限制键值名和变量的数量时,我们可以用命名关键字参数。

  • 这里给出上面函数改进后的封装方式:

    • def student(id, name, *, age, city):
          print(id, name, age, city)
      
    • 其中*作为一种特殊的分隔符,*号后面的参数就是命名关键字参数,可以选填。

  • 如果函数中间已经定义了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

    • def student(id, name, *args, age, city):
      	print(id, name, args, age, city)
      
posted @ 2020-01-14 10:55  August_丶  阅读(270)  评论(0编辑  收藏  举报