函数简介
• 函数也是一个对象
• 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次调用
语法
def 函数名([形参1,形参2,形参3....]):
代码块
• 注意:
• 函数名必须符合标识符的规范(可以包含字母、数字、下划线但是不能以数字开头)
• print是函数对象
• print()是调用函数
函数的参数
• 形参和实参
• 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值
• 实参(实际参数)指定了形参,那么在调用函数时必须传递实参,实参将会赋值给对应的形参,简单来说有几个形参就要有几个实参
def fun(a,b): #a,b为形参
print(a+b)
fun(1,2) #1,2为实参
结果:
3
函数的传递方式
• 定义形参时,可以为形参指定默认值。
• 指定了默认值以后,如果用户传递了参数则默认值不会生效。
• 如果用户没有传递,则默认值就会生效
def fun(a,b,c='\n'): #a,b形参,c='\n'设定了默认值
print(a+b,c,a*b)
fun(1,2,'\t') #1,2实参
结果:
3 2
def fun(a,b,c='\n'): #a,b形参,c='\n'设定了默认值
print(a+b,c,a*b)
fun(1,2) #1,2实参
结果:
3
2
位置参数:
• 位置参数就是将对应位置的实参赋值给对应位置的形参
def fun(a,b,c): #形参,c='\n'设定了默认值
print(a,end='\t')
print(b,end='\t')
print(c,end='\n')
fun(1,2,3) #实参
结果:
2 1 3
关键字参数 :
• 关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递
def fun(a,b,c):
print(a,end='\t')
print(b,end='\t')
print(c,end='\n')
fun(b=1,a=2,c=3)
结果:
2 1 3
• 混合使用位置参数和关键字参数的时候必须将位置参数写到关键字参数前面去
#位置传参在放关键字传参前面,后面的使用关键字传参,但不能再用前面的位置传参的参数
def fun(a,b,c): #形参,c='\n'设定了默认值
print(a,end='\t')
print(b,end='\t')
print(c,end='\n')
fun(2,b=1,c=3)
fun(1,2,c=3)
结果:
2 1 3
1 2 3
不定长参数
• 定义函数时,可以在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
• 带*号的形参只能有一个,可以和其他参数配合使用
# 不定长参数(*a)要放在追后,且只能有一个
# 求任意多个数的和
def fun(b,c,*a):#不定长参数只能放在确定参数后边
print(*a)
print(a) #a是一个元组
res=0
for i in a:
res+=i
print(res)
print(b)
print(c)
fun(1,2,3,4,5,6)
结果:
3 4 5 6
(3, 4, 5, 6)
18
1
2
• *形参只能接受位置参数,不能接受关键字参数
• **形参可以接收其他的关键字参数,它会将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
def fun(**a):#关键字传参
print(a)
fun(a=1,b=2,c=3,e=4,f=5,g=6)
结果:
{'a': 1, 'b': 2, 'c': 3, 'e': 4, 'f': 5, 'g': 6}
• **形参只有一个,并且必须写在所有参数的后面'
def fun(*b,**a):#关键字传参
print(b)
print(a)
fun(1,2,3,e=4,f=5,g=6)
结果:
(1, 2, 3)
{'e': 4, 'f': 5, 'g': 6}
参数的解包
• 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
def fun(a,b,c):
print(a, end='\t')
print(b, end='\t')
print(c, end='\n')
tuple1=(1,2,3)
dict1={'1':2,'2':2,'3':3}
fun(tuple1[0],tuple1[1],tuple1[2])
fun(*tuple1)
fun(*dict1)
fun(**dict1) #错误
结果:
1 2 3
1 2 3
1 2 3
Traceback (most recent call last):
File "<input>", line 11, in <module>
TypeError: fun() got an unexpected keyword argument '1'
• 无论使用位置参数、关键字参数、'*'或者'**',都要求实参的个数(包含默认值)必须和形参的个数一致
代码练习
代码1:
'''1. 打印名片程序:输入姓名,电话号码,性别,最后打印出来名片
• 控制姓名长度为6-20
• 电话号码长度11
• 性别只能允许输入男或女
• 每一样信息不允许为空
'''
def Visiting_Card(name,Tel,Sex):
if 6>len(name.encode('utf-8')) or len(name.encode('utf-8'))>20:
print('姓名长度需为6-20')
return False
elif len(Tel)!=11:
print('电话号码长度需11位')
return False
elif Sex!='男' and Sex!='女':
print('性别只能允许男或女')
return False
else:
print('*'*11,'名\t片','*'*11)
print('*\t姓名:\t%s'%name,end='')
print('\t'*3,'*')
print('*\t电话:\t%s'%Tel,end='')
print('\t' * 2, '*')
print('*\t性别:\t%s'%Sex,end='')
print('\t' * 4, '*')
print('*' * 30)
return True
Visiting_Card('刘亦菲','13913913999','女')
结果:
*********** 名 片 ***********
* 姓名: 刘亦菲 *
* 电话: 13913913999 *
* 性别: 女 *
******************************
代码2:
'''
2. 使用函数求前20个斐波那契数列:1,1,2,3,5,8,13,21...即: 起始两项均为1,此后的项分别为前两项之和
'''
def Fibonacci(a):
i=0
j=1
myresult=[1,1]
while i<a-2:
myresult.append(myresult[i]+myresult[i+1])
i+=1
print('%s项斐波那契数列是:'%a,end='')
for m in myresult:
print(m,end='\t')
print()
Fibonacci(20)
结果:
20项斐波那契数列是:1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
代码3:
'''
3. 编写一段代码,定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果
'''
def total_sum(count):
sum1=0
i=0
while i<=count:
sum1+=i
i+=1
print('1~%s的和是:%s'%(count,sum1))
total_sum(100)
结果:
1~100的和是:5050