函数
8.1. 函数简介
- 函数也是⼀个对象
- 函数⽤来保存⼀些可执⾏的代码,并且可以在需要时,对这些语句进⾏多次调⽤
语法
def 函数名([形参1,形参2,形参3…]):
代码块
- 注意:函数名必须符合标识符的规范(可以包含字⺟、数字、下划线但是不能以数字开头)
- print是函数对象 print()是调⽤函数
8.2. 函数的参数
def fun(a, b):
# 函数的参数就是相当于在函数内部定义了这两个变量, 但是并没有给他们赋值 ab就是一个形参(形式上的参数)
print(a + b)
fun(1, 2)
# 调用函数 ,如果有形参,那么必须传递实参(实际的参数)
8.2.1 形参和实参
- 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值
- 实参(实际参数)指定了形参,那么在调⽤函数时必须传递实参,实参将会赋值给对应的形参,简单来说有⼏个形参就要有⼏个实参
8.2.2 函数的传递⽅式
- 定义形参时,可以为形参指定默认值。指定了默认值以后,如果⽤户传递了参数则默认值不会⽣效。如果⽤户没有传递,则默认值就会⽣效
- 位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参
def fun(a, b, c=20): # c=20 这个就是给c设置了一个默认值, 当设置了默认值之后,可以不传递这个参数的实参,那么这个时候这个参数的值就是这个默认值, 但是你如果传递了这个实参,那么就会覆盖掉这个默认值
print(a)
print(b)
print(c)
fun(1, 2, 3)
- 关键字参数 : 关键字参数可以不按照形参定义的顺序去传递,⽽根据参数名进⾏传递
# 2. 关键字传参 可以不按照定义形参的顺序去传递实参,根据参数名进行传递参数
def fun(a, b, c=20):
print(a)
print(b)
print(c)
fun(a=1, c=3, b=2)
- 混合使⽤位置参数和关键字参数的时候必须将位置参数写到关键字参数前⾯去
# 位置传参和关键字传参的混合使用: 位置传参必须放到关键字传参的前面
def fun(a, b, c=20):
print(a)
print(b)
print(c)
fun(1, b=2, c=3)
8.3 不定⻓参数
- 定义函数时,可以在形参前⾯加⼀个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到⼀个元组中
- 带*号的形参只能有⼀个,可以和其他参数配合使⽤
- 带*形参只能接受位置参数,不能接受关键字参数
- 带**形参可以接收其他的关键字参数,它会将这些参数统⼀保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
- 带**形参只有⼀个,并且必须写在所有参数的后⾯
# 不定长参数: 不知道会接受几个实参,所以用不定长参数(形参)来接受实参
def fun(c, *args, b):
# *a就是不定长参数 当*a和位置传参混合使用的时候,位置参数一定要放到*a的前面
# 当*a和关键字传参一起使用的时候,关键字传参要放到后面去
# 顺序: 位置参数, *args, 关键字参数, **kwargs
print(*args)
print(args)
r = 0
for i in a:
r += i
print(r)
fun(2, 3, 4, 5, b=1)
四种参数传递排列顺序:位置,‘*’a,关键字,‘’** a
8.4 参数的解包
- 传递实参时,也可以在序列类型的参数前添加星号,这样它会⾃动的将序列中元素依次作为参数传递
- 要求序列中的元素的个数必须和形参的个数⼀致
def fun(a, b, c):
print(a)
print(b)
print(c)
t = (1, 2, 3)
t = 'abc'
t = {'a': 1, 'b': 2, 'c': 3}
# fun(t[0], t[1], t[2])
fun(**t) #使用**t可以对参数进行拆包
第八讲作业
"""
1. 打印名⽚程序:输⼊姓名,电话号码,性别,最后打印出来名⽚
控制姓名⻓度为6-20
电话号码⻓度11
性别只能允许输⼊男或⼥
每⼀样信息不允许为空
"""
def card():
while True:
name = input("请输入姓名:")
if 6 < len(name) < 20:
break
else:
print("长度不对,请重新输入:")
while True:
Tel = input("请输入电话:")
if len(Tel) == 11:
if Tel.isdigit():
break
else:
print('格式不对,请重新输入')
# continue
while True:
gender = input("请输入性别:")
if gender == '男' or gender == '女':
break
else:
print('性别只有男女,请重新输入')
continue
return name, Tel, gender
name_card = card()
print(name_card)
"""
2. 使⽤函数求前20个斐波那契数列斐波那契数列:1,1,2,3,5,8,13,21...即: 起始
两项均为1,此后的项分别为前两项之和
"""
def fun(n):
fib = [1, 1]
for i in range(n):
fib.append(fib[-1] + fib[-2])
fibs = fib[i]
print(fibs)
fun(n=20)
"""
3. 编写⼀段代码,定义⼀个函数求1-100之间所有整数的和,并调⽤该函数打印
出结果
"""
def sum1(a, b):
r = 0
for i in range(a, b + 1):
r += i
print(r)
sum1(1, 100)