1.函数简介
• 函数也是一个对象
• 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次调用
语法
def 函数名([形参1,形参2,形参3…]):
代码块
注意:
函数名必须符合标识符的规范(可以包含字母、数字、下划线但是不能以数字开头)
print是函数对象 print()是调用函数
2. 函数的参数
2.1 形参和实参
• 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值
• 实参(实际参数)指定了形参,那么在调用函数时必须传递实参,实参将会赋值给对应的形参,简单来说有几个形参就要有几个实参
2.2 函数的传递方式
• 定义形参时,可以为形参指定默认值。指定了默认值以后,如果用户传递了参数则默认值不会生效。如果用户没有传递,则默认值就会生效
• 位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参
• 关键字参数 : 关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递
• 混合使用位置参数和关键字参数的时候必须将位置参数写到关键字参数前面去
3. 不定长参数
• 定义函数时,可以在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
• 带*号的形参只能有一个,可以和其他参数配合使用
• *形参只能接受位置参数,不能接受关键字参数
• **形参可以接收其他的关键字参数,它会将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
• **形参只有一个,并且必须写在所有参数的后面
4. 参数的解包
• 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
• 要求序列中的元素的个数必须和形参的个数一致
4.作业
1.打印名片程序:输入姓名,电话号码,性别,最后打印出来名片
• 控制姓名长度为6-20
• 电话号码长度11
• 性别只能允许输入男或女
• 每一样信息不允许为空
def fn_name(name): #姓名长度为6-20,且不能为空
if len(name) == 0:
print('不允许输入为空的姓名!')
elif len(name) < 6 or len(name) > 20:
print('姓名长度为6-20!请重新输入!')
else:
return name
def fn_number(number): # 电话号码长度11,且不能为空
if len(number) == 0:
print('电话号码不能为空!请重新输入!')
elif number.isdigit() == False:
print('电话号码只能为数字!请重新输入!')
elif len(number) != 11:
print('电话号码长度为11!请重新输入!')
else:
return number
def fn_gender(gender): # 性别只能输入男或者女,不能为空
if len(gender) == 0:
print('输入性别不能为空!请重新输入!')
elif gender == '男' or gender == '女':
return gender
else:
print('性别只能输入男或者女!输入有误!请重新输入!')
def fn_print(name, number, gender): # 打印名片
card = {'name': name,
'number': number,
'gender': gender
}
print('—' * 50)
print('输入的姓名为:%s' % card['name'])
print('输入的电话号码为:%s' % card['number'])
print('输入的性别为:%s' % card['gender'])
print('—' * 50)
while True:
while True:
name = fn_name(input('输入姓名:'))
if name == None:
continue
else:
break
while True:
number = fn_number(input('输入电话号码:'))
if number == None:
continue
else:
break
while True:
gender = fn_gender(input('输入性别:'))
if gender == None:
continue
else:
break
fn_print(name, number, gender)
break
# 1. 打印名片程序:输入姓名,电话号码,性别,最后打印出来名片
# • 控制姓名长度为6-20
# • 电话号码长度11
# • 性别只能允许输入男或女
# • 每一样信息不允许为空
def card_name(name):
if name == '':
print('姓名不能为空')
elif len(name) < 6 or len(name)>20:
print('姓名长度溢出,字符长度介于6-20')
else:
print('—' * 50)
print('name:', name)
def card_pnone(phone):
if phone == '' or len(phone) != 11:
print('电话号码不正确,请重新输入')
else:
print('phone:',phone)
def card_sex(sex):
if sex == '' or (sex != '男' and sex != '女'):
print('性别不正确,请重新输入')
else:
print('sex:',sex)
print('—' * 50)
if __name__ == '__main__':
name=input('name:')
phone=input('phone:')
sex=input('sex:')
card_name(name)
card_pnone(phone)
card_sex(sex)
name:zhangsna
phone:12369296331
sex:男
——————————————————————————————————————————————————
name: zhangsna
phone: 12369296331
sex: 男
——————————————————————————————————————————————————
2.使用函数求前20个斐波那契数列斐波那契数列:1,1,2,3,5,8,13,21…即: 起始两项均为1,此后的项分别为前两项之和
```python
def fbnq(f_s, f_f):
list_local = [f_f, f_s]
len_fbnq = len(list_local)
while len_fbnq < 20: # 题目要求20个数值,因此计数到20结束
# 将列表中倒数两个数值相加,然后再添加进原列表末尾
list_local.append(list_local[len_fbnq - 2] + list_local[len_fbnq - 1])
len_fbnq = len(list_local) # 通过增加后的列表长度来做while循环计数
return list_local # 返回结果列表
# 起始数值为两个1
a1 = 1
a2 = 1
print('打印出这个费雷罗列表', fbnq(a1, a2))
3.编写一段代码,定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果
def fn_count(start, stop):
sumall = 0
for i in range(start+1, stop):
sumall += i
return sumall
start = int(input('请输入开始的整数数字:'))
stop = int(input('请输入结束的整数数字:'))
print(fn_count(start, stop))
print('%d开始到%d结束所有整数的和为:%d' %(start, stop, fn_count(start, stop)))