位置参数:必须按照顺序准确传递,如果数量和顺序不对,就会可能造成程序错误;调用函数时候,如果写了参数名称,那么位置就不重要了。
默认参数:在参数申明的时候跟一个用于默认值的赋值语句,如果调用函数的时候没有给出值,那么这个赋值语句就执行。
注意:所有必须的参数要在默认参数之前
默认参数的好处:
可变长度的参数,分为不提供关键字和提供关键字两种模式,分别为元组 tuple 和字典 dict。
可变长度的参数,如果是提供关键字,就是字典 dict,需要提供 key – value。
将字典作为参数传递的时候,可以直接传一个字典变量,也可以在参数列表中写明 key 和 value。
函数参数小结
In [17]:
# 函数默认参数
def cal_0(money, rate=0.1):
return money + money * rate
print(cal_0(100))
print(cal_0(100,0.2))
print(cal_0(rate=0.3,money=100))
In [25]:
# 函数默认参数
def cal_1(money, bonus=1000, month=12,a=1,b=2):
i = money * month + bonus
return i
print(cal_1(5000))
print(cal_1(5000, 2000))
print(cal_1(5000, 2000, 10))
In [ ]:
# 画一个三角形 ,n=高度
'''
*
***
*****
*******
*********
***********
*************
'''
In [1]:
# 函数默认参数
def draw_triangle(n=5):
for i in range(n+1):
print(' '*(n-i),'*'*(2*i-1))
draw_triangle(3)
In [2]:
draw_triangle(7)
In [3]:
# 函数可变长度的参数 元组
# 计算平均数
def cal_2(kind, *numbers):
if kind == 'avg':
n = 0
for i in numbers:
n = n + i
return n / len(numbers)
t = cal_2('avg', 1,2,3,4)
print(t)
In [4]:
# 函数可变长度的参数 元组
# 输入计算的类别,输入要计算的数字
def cal_3(kind, *numbers):
if kind == 'avg':
n = 0
for i in numbers:
n = n + i
return n / len(numbers)
if kind == 'sum':
n = 0
for i in numbers:
n = n + i
return n
print(cal_3('avg', 1,2,3,4))
print(cal_3('sum', 1,2,3,4))
# 如果已经有一个list或者tuple,要要作为可变参数传给函数怎么办?
# 在list或tuple前面加一个*号,把list或tuple的元素变成可变参数传进去:
print(cal_3('sum',*[1,2,3,4]))
In [12]:
# 函数可变长度的参数 元组
# 简化程序逻辑
def cal_4(kind, *numbers):
n = 0
for i in numbers:
n = n + i
if kind == 'avg':
return n / len(numbers)
if kind == 'sum':
return n
print(cal_4(kind='avg', 1,2,3,4))
print(cal_4('sum', 1,2,3,4))
In [7]:
# 传递元组和字典参数优雅的写法
def cal_5(*numbers, **kw):
# 判断是否有 kind 这个 key
if 'kind' in kw:
kind_value = kw.get('kind')
n = 0
for i in numbers:
n = n + i
if kind_value == 'avg':
return n / len(numbers)
if kind_value == 'sum':
return n
print(cal_5(1,2,3,4,kind='avg',max='ignore'))
print(cal_5(1,2,3,4,kind='sum'))
In [ ]:
# 等价的函数一般写法和匿名函数写法
def add(x, y):
return x + y
lambda x, y: x + y
In [9]:
a = lambda x, y=2 : x + y
a(3)
Out[9]:
In [10]:
a(3, 5)
Out[10]:
In [11]:
a = lambda x : x * x +40
print(a(2))
In [9]:
# 计算一个正整数的因数
def yinshu(number):
b = []
for i in range(1,number+1):
if number % i == 0:
b.append(i)
return b
print(yinshu(10))
In [2]:
print(func(10))
In [4]:
# 找到最大数 #1
def find_max(l):
# max = float('-inf') 表示负无穷大
max = float('-inf')
for x in l:
if x > max:
max = x
return max
print(find_max([-20,1,6,7,20,5]))
print(find_max([-20,-3,-6,-7,-5]))
In [5]:
# 找到最大数 #2
# 使用递归
def find_max(l):
if len(l) == 1:
return l[0]
v1 = l[0]
v2 = find_max(l[1:])
if v1 > v2:
return v1
else:
return v2
print(find_max([1,6,7,20,5]))
In [3]:
# kind 中 增加 max key,
# max = ingnore, 则忽略最大值
def cal_6(*numbers, **kind):
if 'kind' in kind:
kind_value = kind.get('kind')
if 'max' in kind:
if kind.get('max') == 'ignore':
numbers = list(numbers)
numbers.remove(max(numbers))
n = 0
for i in numbers:
n = n + i
if kind_value == 'avg':
return n / len(numbers)
if kind_value == 'sum':
return n
print(cal_6(1,2,3,4, kind='avg', max='ignore',min='ignore'))
print(cal_6(1,2,3,4, kind='avg'))
print(cal_6(1,2,3,4, kind='sum'))
In [4]:
# kind 中 增加 min key,
# min key = double, 则最小值计算两次
def cal_7(*numbers, **kw):
numbers = list(numbers)
if 'kind' in kw:
kind_value = kw.get('kind')
if 'max' in kw:
if kw.get('max') == 'ignore':
numbers.remove(max(numbers))
if 'min' in kw:
if kw.get('min') == 'double':
numbers.append(min(numbers))
n = 0
for i in numbers:
n = n + i
if kind_value == 'avg':
return n / len(numbers)
if kind_value == 'sum':
return n
print(cal_7(1,2,3,4, kind='avg', max='ignore', min='double'))
print(cal_7(1,2,3,4, kind='avg'))
print(cal_7(1,2,3,4, kind='sum'))
In [ ]: