1.函数
1.1函数的简介
- 函数也是⼀个对象
- 函数用来保存⼀些可执行的代码,并且可以在需要时,对这些语句进行多次调用
- 函数名必须符合标识符的规范(可以包含字⺟、数字、下划线但是不能以数字开头)
- print是函数对象 print()是调用函数
- 函数的特点
- 函数中可以用来保存一些可执行的代码,在你需要的时候可以对这些代码进行多次的调用
- 函数中保存的代码不会立即执行,需要调用函数的时候代码才会执行
#1.函数的创建
#2.函数的调用
#3.函数的参数
#4.函数的返回值
#语法
#def 函数名([形参1,形参2,形参3....]):
# 代码块
print() #打印函数
def fun():#自定义函数 fun是函数名,又可以成为函数对象
print("这是我的第一个函数")
fun() #函数的调用
1.2 函数的参数
1.2.1 形参和实参
- 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值
- 实参(实际参数)指定了形参,那么在调⽤函数时必须传递实参,实参将会赋值给对应的形参,简单来说有几个形参就要有几个实参
def fun(a,b):#函数的参数就是相当于在函数内部定义了这两个变量,但是并没有给他们赋值 ab就是一个形参
print(a+b)
fun() #调用函数,如果有形参,那么必须传递实参
1.2.2 参数的传递方式
- 定义形参时,可以为形参指定默认值。指定了默认值以后,如果用户传递了参数则默认值不会生效。如果用户没有传递,则默认值就会生效
def fun(a,b,c=20):#c=20这个就是给c设置了一个默认值,当设置了默认值之后,可以不传递这个参数的实参,那么这个时候这个参数的值就是这个默认值,如果传递了这个实参,那么就会覆盖掉这个默认值
print(a)
print(b)
print(c)
fun(1,2,3) #最后所得结果会直接覆盖c的值(20)
- 位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参
- 关键字参数 : 关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递
def fun(a,b,c=20):
print(a)
print(b)
print(c)
fun(a=1,c=2,b=3)
- 混合使用位置参数和关键字参数的时候必须将位置参数写到关键字参数前面去
def fun(a,b,c=20):
print(a)
print(b)
print(c)
fun(1,b=2,c=3)
1.2.3 实参的类型
可变类型:变得是数据,但是id不变
不可变类型:数据不变,id也不变;但是数据变了,id就一定改变
def fun(a): #将实参传递给形参,实际上就是在做一个赋值的操作,a=b
print(a)
b=123
fun(b) #结果为123
def fun(a):
#a=b
a=10
print(a)
b=123
fun(b)#结果为10
print(b) #结果为123
def fun(a):
a[0]=10
print(a)
b=[1,2,3]
fun(b)#结果为[10,2,3]
print(b) #结果为[10,2,3]
数据的存储:
dict1={}
while True:
def fun():
num=int(input("请输入你的学号"))
list1=[]
list1.append(num)
dict1[num]=list1
fun()
print(dict1)
1.2.4 不定长参数
**顺序:位置参数,*args,关键字参数,kwargs
- *形参只能接受位置参数,不能接受关键字参数
- **形参只有⼀个,并且必须写在所有参数的后面
#不定长参数:不知道会接受几个实参,所以用不定长参数(形参)来接受实参
def fun(*args):#*a就是不定长参数,
print(*args)#结果是1 2 3 4 5
print(args)#结果是(1,2,3,4,5)
r=0
for i in a:
r+=i
print(r)#结果为15
fun(1,2,3,4,5)
- 定义函数时,可以在形参前⾯加⼀个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到⼀个元组中
def fun(b,c,*args):#当*a和位置传参混合使用的时候,位置参数一定要放到*a的前面
print(*args)#结果是3 4 5
print(args)#结果是(3,4,5)
print(b)#结果是1
print(c)#结果是2
fun(1,2,3,4,5)
- 带*号的形参只能有⼀个,可以和其他参数配合使用
def fun(c,*args,b):#当*args和关键字传参一起使用的时候,关键字传参要放到后面去,顺序:位置参数,*args,关键字参数,**kwargs
print(*args)
print(args)
fun(1,2,3,4,b=5)
- **形参可以接收其他的关键字参数,它会将这些参数统⼀保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
def fun(c,**kwargs):
print(kwargs)
fun(2,b=1)#接收结果是{"b":1}
def fun1(*args,**kwargs):#万能函数
pass
1.2.5 参数的解包
- 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
- 要求序列中的元素的个数必须和形参的个数⼀致
def fun(a,b,c):
print(a)
print(b)
print(c)
t=(1,2,3)
t='abc'
t=[1,2,3]
fun(*t)#结果都可以拆包
def fun(a,b,c):
print(a)
print(b)
print(c)
t={'a':1,'b':2,'c':3}
fun(*t)#所得结果是a,b,c
fun(**t)#所得结果是1,2,3 接收关键字不定长参数