目录
1. 打印名片程序:输入姓名,电话号码,性别,最后打印出来名片
2.使用函数求前20个斐波那契数列斐波那契数列:1,1,2,3,5,8,13,21...即: 起始两项均为1,此后的项分别为前两项之和
3.编写一段代码,定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果
一、函数上
1. 函数简介
- 函数也是一个对象
- 函数用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次调用
语法
def 函数名([形参1,形参2,形参3....]):
代码块
# 函数也是一个对象
# 函数的特点
# 函数可以用来保存一些可执行的代码,在你需要的时候可以对这些代码重复的调用(使用)
# 函数中保存的代码不会立即执行,只当你调用函数的时候,代码才会执行
def fun():
# 名字做到见名知意
print(1111)
# 调用函数:函数名称(函数对象)
fun()
fun()
# 运行结果:
1111
1111
注意:
函数名必须符合标识符的规范(可以包含字母、数字、下划线但是不能以数字开头)
print是函数对象 print()是调用函数
2. 函数的参数
2.1 形参和实参
- 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值
- 实参(实际参数)指定了形参,那么在调用函数时必须传递实参,实参将会赋值给对应的形参,简单来说有几个形参就要有几个实参
def fun(a, b):
# 形参:形式上参数
# 定义形参就相当于在函数内部声明了一个变量,但是并没有赋值,
# 有几个形参就得传递几个实参
print(a + b)
fun(1, 2) # 传实参: 实际的参数
# 运行结果:
3
2.2 函数的传递方式
- 位置参数:位置参数就是将对应位置的实参赋值给对应位置的形参
# 位置传参 def fun(a, b, c): print(a) print(b) print(c) fun(1, 2, 3)
# 运行结果: 1 2 3
- 定义形参时,可以为形参指定默认值。指定了默认值以后,如果用户传递了参数则默认值不会生效。如果用户没有传递,则默认值就会生效
# 形参参数默认值 def fun(a, b, c=20): # c=20称呼为默认值 print(a) print(b) print(c) fun(1, 2, 3) fun(1, 2)
# 运行结果: 1 2 3 1 2 20
- 关键字参数 : 关键字参数可以不按照形参定义的顺序去传递,而根据参数名进行传递
# 关键字传参 位置顺序可以随便写 def fun(a, b, c): print(a) print(b) print(c) fun(b=1, a=2, c=3)
# 运行结果: 2 1 3
2.3 实参的类型
# 实参任何类型都可以
def fun1():
print(11111)
def fun(a):
print(a)
b = 123
c = 'abc'
d = True
e = [1, 2, 3]
f = {'1': 1}
g = fun1
fun(b)
fun(c)
fun(d)
fun(e)
fun(f)
fun(g)
# 运行结果
123
abc
True
[1, 2, 3]
{'1': 1}
<function fun1 at 0x00000225233FA950>
def fun2(a): # a=b 赋值是单向的
a = 20
print(a)
b=10
fun2(b)
print(b)
# 值传递,不影响实参
# 运行结果:
20
10
def fun2(a):
a[0] = 10
print(a)
b=[1,2,3]
fun2(b)
print(b)
# 地址传递,会影响实参
# 运行结果:
[10, 2, 3]
[10, 2, 3]
3. 不定长参数
- 定义函数时,可以在形参前面加一个*,这样这个形参可以获取到所有的实参,它会将所有的实参保存到一个元组中
def fun(*a): print(a) fun(1, 2, 3, 4, 5, 6)
# 运行结果: (1, 2, 3, 4, 5, 6)
- 带*号的形参只能有一个,可以和其他参数配合使用
# 不定长参数要放到后面, *只能有一个 def fun(c, b, *a): print(a) print(b) print(c) fun(1, 2, 3, 4, 5, 6)
# 运行结果: (3, 4, 5, 6) 2 1
- *形参只能接受位置参数,不能接受关键字参数
- **形参可以接收其他的关键字参数,它会将这些参数统一保存到字典当中。字典的key就是参数的名字,字典的value就是参数的值
def fun(**a): print(a) fun(f=1, e=2, d=3, c=4, b=5, a=6)
#运行结果: {'f': 1, 'e': 2, 'd': 3, 'c': 4, 'b': 5, 'a': 6}
- **形参只有一个,并且必须写在所有参数的后面
def fun(*b,**a): print(a) print(b) fun(1,2,3,4,f=1, e=2, d=3, c=4, b=5, a=6)
# 运行结果: {'f': 1, 'e': 2, 'd': 3, 'c': 4, 'b': 5, 'a': 6} (1, 2, 3, 4)
4. 参数的拆包
- 传递实参时,也可以在序列类型的参数前添加星号,这样它会自动的将序列中元素依次作为参数传递
- 要求序列中的元素的个数必须和形参的个数一致
def fun(a, b, c):
print(a)
print(b)
print(c)
tuple1 = (1, 2, 3)
fun(*tuple1)
# 运行结果:
1
2
3
def fun(a, b, c):
print(a)
print(b)
print(c)
dict1 = {'a': 1, 'b': 2, 'c': 3}
fun(*dict1)
# 运行结果:
a
b
c
def fun(a, b, c):
print(a)
print(b)
print(c)
dict1 = {'a': 1, 'b': 2, 'c': 3}
fun(**dict1)
# 运行结果:
1
2
3
二、小练习
1. 打印名片程序:输入姓名,电话号码,性别,最后打印出来名片
- 控制姓名长度为6-20
- 电话号码长度11
- 性别只能允许输入男或女
- 每一样信息不允许为空
def callingcard():
while True:
name = input('请输入姓名,长度控制在6-20:')
number = input('请输入11位电话号码:')
gender = input('请输入性别:')
flag = True
if len(name) < 6 or len(name) > 20:
print('姓名长度为6-20!')
flag = False
if not number.isdigit():
print('电话号码只能是数字!')
flag=False
if (len(number) != 11):
print('请输入正确长度的电话号码!')
flag = False
if gender != '男' and gender != '女':
print('性别输入有误!')
flag = False
if flag:
print('=' * 30)
print(f'||\t姓名:{name}')
print(f'||\t电话号码:{number}')
print(f'||\t性别:{gender}')
print('=' * 30)
break
else:
print('请重新输入!')
callingcard()
2.使用函数求前20个斐波那契数列斐波那契数列:1,1,2,3,5,8,13,21...即: 起始两项均为1,此后的项分别为前两项之和
def fib(n):
f=[1 for x in range(0,n)] #表示长度为n、每个元素都为1的列表 [1,1,1,...,1] n个1
i=2
while i<n:
f[i]=f[i-1]+f[i-2]
i+=1
print(f)
fib(20)
3.编写一段代码,定义一个函数求1-100之间所有整数的和,并调用该函数打印出结果
def sum1(n):
i=1
result=0
while i<=n:
result+=i
i+=1
print(result)
sum1(100)