码迷,mamicode.com
首页 > 编程语言 > 详细

python函数参数理解

时间:2017-09-26 15:59:16      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:append   局部对象   个数   指定   参数传递   存储位置   color   判断   不同   

1、位置参数

  函数调用时,参数赋值按照位置顺序依次赋值。

  e.g. 

1 def function(x):
2 
3  return x * x
4 
5 print function(2)

    输出结果: 4

1 def function(x, n):
2 
3   return x / n
4 
5 print function(4, 2)

    输出结果: 2

2、默认参数

  在函数定义时,直接指定参数的值。

  e.g.

 1 def function(x, n = 2):
 2 
 3     s = 1
 4 
 5     while n > 0:
 6 
 7         n = n -1
 8 
 9         s = s * x
10 
11     return s
12 
13 print function(20)

    输出结果:400

  注意:

    1、必选参数必须在前,默认参数在后。

    2、当函数有多个参数时,把变化大的放在前面。

      好处:降低调用函数的难度。

    3、当有多个默认参数时,可以按顺序,也可使用参数名直接赋值。

      e.g.

 1 def enroll(name, gender, age = 6, city = beijing) :
 2 
 3   print name
 4 
 5   print gender
 6 
 7   print age
 8 
 9   print city
10 
11 enroll(aaa, F, 7)

        输出内容:

          aaa

          F

          7

          beijing

1 enroll(bbb, M, 9, city = tianjin)

        输出内容:

          bbb

          M

          9

          tianjin

    4、特别注意

      e.g.

1 def add_end(L = []):
2 
3   L.append(END)
4 
5   return L
6 
7 add_end([1,2,3,4,5])

        输出内容:

          [1,2,3,4,5,‘END‘]

      当多次调用add_end()时

1 add_end()
2 
3 add_end()

        输出内容:

          [‘END‘, ‘END‘]

          这时就要对输入参数进行判断了:

 1 def add_end(L = []):
 2 
 3     if L is None:
 4 
 5         L = []
 6 
 7     L.append(END)
 8 
 9     return L
10 
11 add_end()
12 
13 add_end()

          输出内容:

            [‘END‘]

    5、能设计不变的对象就设计成不变的对象。

3、可变参数

  传入的参数个数是可变的。

4、关键字参数

5、命名关键字参数

6、参数组合

总结:

  参数传递过程中存在俩个规则:

    1、通过引用将参数复制到局部作用域的对象中,意味着被用来访问的函数参数的变量与提供给函数的对象无关,以为存在一个复制问题,修改局部变量不会修改原始数据。

    2、可以在适当的位置修改可变对象。可变对象主要是list和dict,适当的位置主要是在修改局部对象不会改变list对象或者dict对象的ID,也就是存储位置。

 1 #!/usr/bin/python
 2 
 3 def modifier(number, string, list):
 4     number = 5 
 5     string = GOODBYE
 6     list = [1,2,3]
 7     print inside:, number, string, list
 8 
 9 num = 10
10 string = goodbye
11 list = [4,5,6]
12 print before:, num, string, list
13 
14 modifier(num, string, list)
15 
16 print after:, num, string, list

      输出内容:

        before: 10 goodbye [4, 5, 6]

        inside: 5 GOODBYE [1, 2, 3]

        after: 10 goodbye [4, 5, 6]

      从输出结果来看,数据交换前后数据并没有发生改变,虽然在函数局部区域传递进来的参数进行了相应的修改,但是仍然不能改变实参对象的内容。这和C语言十分相似。

      因为传递进来的参数在函数内部进行了修改,也就是变量指向了不同的存储区(对象),这就相当于C语言中的实参与形参,只是对形参进行了修改,实参没有改变。

      所以说明函数内部对参数重新赋了值,并不会改变实参对象。

 1 #!/usr/bin/python
 2 def modifier(list, dict):
 3     list[0] = 10
 4     dict[a] = 10
 5     print inside: list = %s, dict = %s %(list, dict)
 6 
 7 list = [1,2,3,4,5]
 8 dict = {a : 1, b : 2, c : 3}
 9 print defore: list = %s, dict = %s %(list, dict) 
10 
11 modifier(list, dict)
12 print after: list = %s, dict = %s %(list, dict)

        输出结果:

          defore: list = [1, 2, 3, 4, 5], dict = {‘a‘: 1, ‘c‘: 3, ‘b‘: 2}
          inside:, list = [10, 2, 3, 4, 5], dict = {‘a‘: 10, ‘c‘: 3, ‘b‘: 2}
          after: list = [10, 2, 3, 4, 5], dict = {‘a‘: 10, ‘c‘: 3, ‘b‘: 2}

        从输出结果可以看出,函数内部对传递进来的参数进行了修改,并且对实参对象也进行了修改,实际修改的是list和dict存储位置上的数据,变量指向并没有改变,所以实参对象也发生了变化。

 

python函数参数理解

标签:append   局部对象   个数   指定   参数传递   存储位置   color   判断   不同   

原文地址:http://www.cnblogs.com/coolYuan/p/7593527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!