Python-函数参数

位置参数:调用函数的时候,传入的值(实参)按照位置顺序依次赋给参数(形参)
现在我们先定义一个x^2的函数:
def power(x):
       return x * x
对于power(x)函数,x就是一个位置参数
当我们调用power函数的时候,必须传入有且仅有一个的参数x
power(5)
输出结果:25
power(15)
输出结果:225

但是,现在如果我们想要计算x^3的三次方怎么办?我们可以在定义一个power3,但是我们再想计算x^4,x^5。。。。怎么办法?我们不可能定义无限个函数
分析一下这个需求,就是计算x^n,我们可以把power(x)改成power(x,n)
def power(x,n):
       s  = 1
       while n > 0:
              s = s - 1 
              s = s * x
       return s
powert(5,2)
输出结果:25
power(5,3)
输出结果:125

修改之后的power函数有两个参数x,n  这两个参数都是位置参数,调用函数的时候,传入的值按照位置顺序依次赋值给参数x,n

默认参数:
新的power(x,n)函数定义没有问题,但是,旧的函数调用失败了,因为我们在新的函数中增加了一个参数,这样导致了旧的代码因为缺少一个参数而无法正常调用

现在,需要默认参数上场,由于我们经常计算x^2,所以,我们完全可以把第二个参数n的值默认设置为2
def power(x,n = 2):
      s = 1
      while n > 0:
            n = n - 1
            s = s * x
       return s

当我们调用power(5)时候相当于调用power(5,2)
而对于n > 2的情况·就需要明确的传入n的值
这个就是默认参数,在设置默认参数的时候我们有几个需要注意的点:
第一个是,必选参数在前面,默认参数在后面
第二个是,如何设置默认参数

当函数有多个参数的时候,把变化大的参数放在前面,变化小的参数放在后面,变化小的参数就可以作为默认参数(默认参数不是一层不变的)
那么使用默认参数有什么好处呢?最大的好处就是降低了函数调用时的难度
举个例子:
我们在这里写一个一年级小学生注册的函数,需要传入两个参数,name(姓名)和gener(年级)
def enroll(name,gener):
     print('name: ',name)
     print('gener: ',gener)

在这里调用enroll函数的时候需要传入两个参数name,gener
比如:
enroll('Sarah','F')
输出结果:
name: Sarah
gener: F

但是,如果说继续传入年龄,城市等信息怎么办?传入的参数越多,就会增加函数在调用时的难度
我们可以在这里把年龄,城市等信息设置为默认参数,这样除了一小部分学生在注册时候需要传入新的城市,年龄这些参数,其他基本上只需要传入name,gener就行了

def enroll(name,gener,age=6,city='beijing'):
     print('name: ',name)
     print('gener: ',gener)
     print('age: ',age)
     print('city: ',city)

输出结果:
enroll('Sarah','F')
name: Sarah
gener: F
age: 6
city: beijing

当有多个默认参数的时候,我们既可以按照顺序提供默认参数,比如说在调用enroll('Bob','F',7),意思是说除了name,gener这两个参数之外,最后一个参数应用到了age参数上面,city参数由于没有提供所以使用默认参数

也可以不按照顺序提供部分默认参数,但是这个时候就需要把参数名写上,比如说调用enroll('Admin','M',city='Tianjin')

默认参数很有用,但是使用起来要是不注意的话,会掉进坑,默认参数有一个最大的坑,看一下实例:

def add_end(L = []):
      L.append('END')
      return L

当使用默认参数调用的时候,刚开始还是正确的,但是后来就不正确了,这个函数的默认参数是[](空列表),但是函数好像记住了上一次调用之后的list

注意:定义默认参数的时候默认参数必须指向不变对象

可变参数:
在Python函数中还可以定义可变参数,可变参数顾名思义就是传入的参数个数是可以变化的,可以是1个,2个,任意个,当然也可以是0个
比如说我们给定一组数字a,b,c,d。。。。,计算a^2 + b^2 + c^2。。。。。。
def calc(numbers):
      s = 0
      for n in numbers:
         s = s + n
      return s
咱们知道在Python中使用for循环的时候,主要是应用在可迭代对象上面,也就是说我们传入的numbers可以组成一个list或者tuple
calc([1,2,3,4])
输出结果:10
calc((1,2,3,4))
输出结果是:10
 
我们想要的效果就是 ,直接传入1,2,3,4  可以像上面那样计算出我们想要的结果,而不是每次传入list或者tuple
下面我们开始使用可变参数:
def calc(*numbers):
      s = 0
      for n in numbers:b
         s = s + n
      return s
定义可变参数和定义一个list或者tuple,仅仅是在参数的前面增加了一个*(星号),在函数内部numbers接受到的是tuple,但是在调用该函数的时候我们可以传入任意个参数,可以是0个
calc()
输出结果是:0

如果要是有一个list或者tuple,要调用一个可变参数怎么办呢?
num = [1,2,3]
calc(num[0],num[1],nump[2])

但是如果当这个list或者tuple比较长的时候,在这样就比较麻烦了,在Python中允许你在list或者tuple前面加一个*,把list或者tuple的元素变成可变参数
num = [1,2,3,4]
calc(*num)
 
*num把num这个list的所有的元素变成可变参数传入进去

关键字参数:
可变参数允许传入0个或者任意多个参数,这些可变参数在函数调用的时候,自动组装成一个tuple,而关键字参数允许你传入0个或者任意个含有参数名的参数,这些关键字参数在函数内部自动组装成一个dict,看示例:
def person(name,age,**kw):
      print('name: ',name,'age: ',age,'other: ',other)

函数person除了必选参数name,age,以外还可以接受关键字参数kw,在调用该参数的时候可以只传入必选参数:
person('Michael',30)
输出结果:name: Michael age: 30 other: {}


也可以传入任意个关键字参数:
person('Bob', 35, city='Beijing')
输出结果:name: Bob age: 35 other: {'city': 'Beijing'}
person('Adam', 45, gender='M', job='Engineer')
输出结果:name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

关键字参数有什么作用呢?它可以扩展函数的功能,比如,在函数person里面,我们能保证接收name和age这两个参数,如果调用者愿意提供更多的参数我们也能接受到,试想,你在做一个关于用户注册的功能,除了用户名和年龄是必填项之外,其他的都是可选项,利用关键字参数来定义这个函数就能满足注册需求

和可变参数类似,也可以先组装出一个dict,然后把这个dict转换成关键字参数传入进去
extra = {'city':'Beijing','job':'Engineer'}
person('Jack',24,**extra)
输出结果:name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}


命名关键字参数:
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数,至于到底传入了哪些关键字参数,需要在函数内部通过kw检查
还是以person为例,我们希望检查是否传入了city,和 job两个关键字参数
def person(name,age,**kw):
     if 'city' in kw:
          #有关键字参数
          pass
      if 'job' in kw:
          # 有关键字参数
          pass
      print('name: ',name,'age: ',age,'other: ',kw)

但是函数调用者仍然可以传入不受限制的关键字参数
person('Jack',24,city='Beijing','addr'='Chaoyang','zipcode'='123456')

如果说要限制函数调用者可以传入的关键字,这个时候就可以使用命名关键字参数,例如,只接收city和job两个关键字,这种方式的定义如下
def person(name,age,*,city,job):
        print(name,age,city,job)


命名关键字参数和关键字参数**不同,命名关键字需要有一个特殊的分隔符*,*后面的被视为是命名关键字参数
person('Jack',24,city='Beijing',job='Engineer')
输出结果:Jack 24 Beijing Engineer

另外命名关键字参数必须要传入参数名,这和位置参数不一样,如果不传入参数名的话,会报错

参数组合
在Python函数定义中有位置参数,默认参数,可变参数,关键字参数,命名关键字参数,必选参数,总共有这五种参数可以使用





















猜你喜欢

转载自blog.csdn.net/hpu_yly_bj/article/details/79017105