Python第一天——函数的参数

基本格式:
def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s
#测试
>>> power(5, 2)
25
>>> power(5, 3)
125

默认参数可以简化函数的调用。设置默认参数时,有几点要注意:

一是必选参数在前,默认参数在后,否则Python的解释器会报错
二是如何设置默认参数

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

使用默认参数有什么好处?最大的好处是能降低调用函数的难度。

举个例子,我们写个一年级小学生注册的函数,需要传入name和gender两个参数:
def enroll(name, gender):
    print('name:', name)
    print('gender:', gender)
这样,调用enroll()函数只需要传入两个参数:
>>> enroll('Sarah', 'F')
name: Sarah
gender: F
如果要继续传入年龄、城市等信息怎么办?这样会使得调用函数的复杂度大大增加。

我们可以把年龄和城市设为默认参数
def enroll(name, gender, age=6, city='Beijing'):
    print('name:', name)
    print('gender:', gender)
    print('age:', age)
    print('city:', city)
#def enroll(name,gender,age=6,city='GZ'): #print('name:',name,'gender:',gender,'age:',age,'city:',city,sep=' ') #enroll('Bob', 'M', 7,'Tianjin')
这样,大多数学生注册时不需要提供年龄和城市,只提供必须的两个参数:
>>> enroll('Sarah', 'F')
name: Sarah
gender: F
age: 6
city: Beijing
只有与默认参数不符的学生才需要提供额外的信息:
enroll('Bob', 'M', 7)
enroll('Adam', 'M', city='Tianjin')
enroll('Bob', 'M', 7,'Tianjin')

 

 


可见,默认参数降低了函数调用的难度,而一旦需要更复杂的调用时,又可以传递更多的参数来实现。无论是简单调用还是复杂调用,函数只需要定义一个。
当不按顺序提供部分默认参数时,需要把参数名写上。比如调用enroll('Adam', 'M', city='Tianjin'),意思是,city参数用传进去的值,其他默认参数继续使用默认值。
定义默认参数要牢记一点:默认参数必须指向不变对象!
如果已经有一个list或者tuple,要调用一个可变参数怎么办?可以这样做:

>>> nums = [1, 2, 3]
>>> calc(nums[0], nums[1], nums[2])
14
这种写法当然是可行的,问题是太繁琐,所以Python允许你在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
*nums表示把nums这个list的所有元素作为可变参数传进去。
在用def定义内容的时候需要加一个限制关键名,就可以用*args的方式,作用是是限制关键字参数名字,不出现用命名关键字参数就报错



参数组合顺序规则

 

必选参数:


默认参数:
例如 在定义函数中 def power(x,n=2): n=2即将n定义为默认参数
注意事项①必选参数在前,默认参数在后,否则解释器报错。
注意事项②当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以 
作为默认参数。
默认参数最大的好处是能降低调用函数的难度。

有多个默认参数时,调用的时候,既可以按顺序提供默认参数,也可以不按顺序提供部分默认参数。当 
不按顺序提供部分默认参数时,需要把参数名写上。其他默认参数继续使用默认值

默认参数必须指向不变对象!否则下次调用时,默认参数的内容就变了。不变对象None


可变参数
定义函数参数时,参数名前加*
※可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装成一个tuple。
传list和tuple作为调用函数的参数时,可在list或tuple前加一个*,即可将list的所有元素作为可变参 
数传进去。

命名关键字参数
和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符*,*后面的参数被视为命名关键字参数。
限制关键字参数的名字,就可用命名关键字参数
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了。
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。
命名关键字参数可以有缺省值,调用时,可不传入缺省值参数。

关键字参数
定义函数参数时,参数名前加**
※允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
(字典)。
**extra表示把extra这个dict的所有key-value用关键字参数传入到函数的**kw参数,kw将获得一个dict 
,注意kw获得的dict是extra的一份拷贝,对kw的改动不会影响到函数外的extra。

 

 







参数组合
在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,
这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
函数的命名以及使用规则
def weeks(*args,**afks_1):
    print(afks_1)                  # {'job': 'IT', 'hobby': 'girls'}
    print(args)                      #()
    for i in afks_1:
        print("%s:%s"%(i,afks_1[i]))

weeks(job = "IT",hobby = "girls")

 

#打印效果是:
# {'job': 'IT', 'hobby': 'girls'}
# ()
# job:IT
# hobby:girls

 

前面args仅仅打印一个空值,说明,这个函数的作用仅作用于字典类型,也就是后面有默认数值的afks_1
关键字参数
※可变参数允许传入0个或任意个参数,这些可变参数在函数调用时自动组装成一个tuple。
※允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict
(字典)。
 看例子:
由此可以带出一个新的命名规则,类似于万能命名规则
# 所以现在讲一个万能的命名参数:
# def f(*args,**wrargs):
# pass
注意这里需要注意一点就是不定参数的位置是有要求的:
1 *args 必须要在第一个,**wrargs必须在第二个,位置不能错,一错就报错
2 下面的实参必须要按照顺序放入,放入顺序是,前面是元组,后面是字典(默认值),不可以混放,更不能颠倒顺序.
注意一点def结束一定要用return接收的值(对象)
这样可以让开发者接收到一个对象,并且可以对他进行处理
否则会爆出一个None值
练习题:

以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积:

# -*- coding: utf-8 -*-

def product(*numbers):                                              #定义一个函数
    if numbers is None or len(numbers)<=0 :
        raise TypeError("args not null!")                              #将函数提前给定好各种情况,如果小于零,等于零或者未输入
    sum = 1
    for n in numbers:
        sum = sum *n                            #如果n在给定的数列中,那么就将sum*每一个数值得出总数
    return sum

 


# 测试
print('product(5) =', product(5))
print('product(5, 6) =', product(5, 6))
print('product(5, 6, 7) =', product(5, 6, 7))
print('product(5, 6, 7, 9) =', product(5, 6, 7, 9))
if product(5) != 5:
print('测试失败!')
elif product(5, 6) != 30:
print('测试失败!')
elif product(5, 6, 7) != 210:
print('测试失败!')
elif product(5, 6, 7, 9) != 1890:
print('测试失败!')
else:
try:
product()
print('测试失败!')
except TypeError:
print('测试成功!')


# def product(*numbles): #把函数的参数改为可变参数
     # sum=1
     # for n in numbles:
         # sum=sum*n
 
     # return sum
def product(x,*y): #把函数的参数改为可变参数
     sum=1
     for n in y:
         sum=sum*n
 
     return x*sum
     


     
   # 测试
print('product(5) =', product(5))
print('product(5, 6) =', product(5, 6))
print('product(5, 6, 7) =', product(5, 6, 7))
print('product(5, 6, 7, 9) =', product(5, 6, 7, 9))
if product(5) != 5:
    print('测试失败!')
elif product(5, 6) != 30:
    print('测试失败!')
elif product(5, 6, 7) != 210:
    print('测试失败!')
elif product(5, 6, 7, 9) != 1890:
    print('测试失败!')
else:
    try:
        product()
        print('测试失败!')
    except TypeError:
        print('测试成功!')

 

 

posted @ 2018-06-01 12:15  33-林俊凯  阅读(225)  评论(0)    收藏  举报