# python函数的参数:必选参数、默认参数、可变参数、关键字参数和命名关键字参数
'''
默认参数:
1.默认参数简化了函数的调用,但是有以下几点要注意
2.必选参数必须放在默认参数之前
3.单独函数有多个参数的时候,把变化大的放在前面,变化小的放在后面。变化小的就可以作为默认参数
'''
# 默认参数
def power(x,n=2):
s = 1
while n > 0:
n =n-1
s =s*x
return s
r = power(3,3)
r1 = power(3)
print(r,r1)
# 4.默认参数可以降低函数调用的难度
# 我们写一个小学生的组成为函数
'''
def enroll(name,gender):
print("name",name)
print("gender",gender)
enroll("bob","F")
'''
# 但是很多时候我们还有输入,年龄和城市
# 一般来说同年级的学生基本年龄都是一致的,城市一般都是本地的,这时候默认参数作用就来了
def enroll(name,gender,age=6,city='ChengDu'):
print('name:',name)
print('gender:',gender)
print('age:',age)
print('city:',city)
enroll('bob','F')
# 当有不一致时
# 1.两个都不一致
enroll('li','F',5,'BeiJin')
# 2.年龄不一致
enroll('Mm','F',9)
# 3.城市不一致时,这时就要注意了
enroll('Nn','F',city='BeiJin')
# 默认参数的大坑实例
def add_end(L=[]):
L.append('END')
return L
# 正常调用
print(add_end([1,2,3]))
print(add_end([2,4,6]))
# 问题来了
print(add_end())
print(add_end())
'''
Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。
定义默认参数要牢记一点:默认参数必须指向不变对象!
'''
# 可变参数,函数调用时自动组装成一个元组
# 问题引入:a,b,c...计算a*a+b*b+c*c...
# 1.用元组或列表
'''
def calc(numbers):
sum = 0
for n in numbers:
sum = sum +n*n
return sum
print(calc([1,2,3]))
'''
# 利用可变参数
def calc(*numbers):
sum = 0
for i in numbers:
sum = sum + i*i
return sum
print(calc(1,2,3))
# 当然可能这时我有收到了一个数组,这时可以用以下办法
num = [1,2,3]
print(calc(*num))
# 关键字参数,这些关键词在函数内部自动组装成为一个字典
def person(name, age, **kw):
print('name',name,'age',age,'other',kw)
person("mick",20)
person('liv',45,gender = 'M',job = 'Note')
# 用处很大,在注册时有些必填信息,当然有些你可以选填
extra = {'city':'beijin','job':'Note'}
person('Jack',24,**extra)
# 当然在函数内部的改动不能影响extra
# 命名关键字参数
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',adder='CC',ri=123456)
#上述情况下关键字的名字时不受限制的,但是有时我们一抔不得不限制
def person1(name,age,*,city,job):
print(name,age,city,job)
person1('Mm',25,city='12',job='24')
# 困惑这个有毛用啊,还不直接写,那么接下来就是解惑时间了
def person1(name, age, *args, city, job):
print(name, age, args, city, job)
person1('Jack', 24, city='Beijing', job='Engineer')
# 参数组合,就是将python的参数类型组合在一起
# 当然肯定有一定的顺序,他们的顺序是:
# 必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
# 有趣的小例子
def f1(a, b, c=0, *args, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
f1(*args, **kw)
# 当然虽然可以组合多达5种参数,但不要同时使用太多的组合,否则函数接口的可理解性很差。
#
def product(*num):
if num==():
raise TypeError
else:
sum=1
for n in num:
sum=sum*n
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('测试成功!')