假期第(19)天
函数的基本语法
l 定义函数时,开头部分的注释并不是必需的,但可以
为用户提供友好的提示
l 定义函数时不需要声明函数的返回值类型,函数返回
值类型与return语句返回表达式的类型一致
l 不论return语句出现在函数的什么位置,一旦得到执
行将直接结束函数的执行
l 如果函数没有return语句或者执行了不返回任何值的
return语句,Python将认为该函数以return None结束,
即返回空值
def fib(n):
'''accept an integer n,return the numbers less than n in Fibonacci
sequence.'''
a, b = 1, 1
while a < n:
print(a, end=' ')
a, b = b, a+b
print()
函数 fib(1000)2
25
5
函数参数-1
l 在定义函数时,对参数个数并没有限制,如果有多个
形参,则需要使用逗号进行分隔
def printMax(a, b):
if a>b:
pirnt(a, 'is the max')
else:
print(b, 'is the max')
l 绝大多数情况,修改形参的值不会影响实参
>>> def addOne(a):
print(a)
#输出原变量a的值
a += 1
#这条语句会得到一个新的变量a
print(a)
>>> a = 3
>>> addOne(a)
3
4
>>> a
函数 32
6
26
函数参数-2
l 在有些情况下,可通过特殊的方式在函数内部修改实
参的值
>>> def modify1(v): #修改列表元素值
v[0] = v[0]+1
>>> def modify2(v, item): #为列表增加元素
v.append(item)
>>> a = [2]
>>> modify1(a)
>>> modify2(a, 3)
[3, 3]
>>> def modify(d):
#修改字典元素值或为字典增加元素
d['age'] = 38
>>> a = {'name':'Dong', 'age':37, 'sex':'Male'}
>>> a
{'age': 37, 'name': 'Dong', 'sex': 'Male'}
>>> modify(a)
>>> a
函数 {'age': 38, 'name': 'Dong', 'sex': 'Male'}2
7
2
7
函数参数默认值
l 函数参数的默认值是在定义函数时确定的
def 函数名(……,形参名=默认值):
函数体
>>> i = 5
>>> def demo(v=i):
print(v)
>>> i = 6
>>> demo() #调用时没有传递参数值
5
l 可以使用"函数名.__defaults__"随时查看函数所有默认值参数
的当前值(元组形式)
>>> def say( message, times =1 ):
print((message+' ') * times)
>>> say.__defaults__
(1,)
>>> say('hello', 3)
hello hello hello
函数2
28
8
关键参数和可变长度参数
l 通过关键参数可以按参数名字传递值,实参顺序可以
和形参顺序不一致
>>> def demo(a, b, c=5):
print(a, b, c)
>>> demo(c=8, a=9, b=0)
9 0 8
l 可变长度参数的两种形式:*parameter用来接收多个
实参并将其放在元组中,**parameter接收类似于关键
参数一样显式赋值形式的多个实参并将其放入字典中
>>> def demo(*p):
print(p)
>>> demo(1, 2, 3)
(1, 2, 3)
>>> def demo(**p):
for item in p.items():
print(item,end=' ')
>>> demo(x=1, y=2, z=3)
#注意显示顺序
函数 ('y', 2) ('x', 1) ('z', 3)2
9
29
传递参数时的序列解包-1
>>> def demo(a, b, c):
print(a+b+c)
>>> seq = [1, 2, 3]
>>> demo(*seq)
6
>>> tup = (1, 2, 3)
>>> demo(*tup)
6
>>> dic = {1:'a', 2:'b', 3:'c'}
>>> demo(*dic)
6
>>> Set = {1, 2, 3}
>>> demo(*Set)
6
>>> demo(*dic.values())
abc
函数3
30
0
传递参数时的序列解包-2
l 注意:调用函数时如果对实参使用一个星号*进行序
列解包,这么这些解包后的实参将会被当做普通位置
参数对待,并且会在关键参数和使用两个星号**进行
序列解包的参数之前进行处理
>>> def demo(a, b, c): #定义函数
print(a, b, c)
>>> demo(1, *(2, 3))
#位置参数和序列解包同时使用
1 2 3
>>> demo(a=1, *(2, 3)) #序列解包相当于位置参数,优先
Traceback (most recent call last):
File "<pyshell#26>", line 1, in <module>
demo(a=1, *(2, 3))
TypeError: demo() got multiple values for argument 'a'
>>> demo(c=1, *(2, 3))
2 3 1
>>> demo(**{'a':1, 'b':2}, *(3,))#序列解包不能在关键参数解包之后
SyntaxError: iterable argument unpacking follows keyword argument
unpacking
>>> demo(*(3,), **{'c':1, 'b':2})

浙公网安备 33010602011771号