Python学习第八课-函数
一、函数简介
1.1 简介
-
函数是一个对象
-
特点
-
- 函数中可以保存一些可执行的代码,可以重复调用
-
- 函数中的代码不会立即执行,需要调用的时候代码才会执行
-
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
1.2 规则
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号 : 起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方,不带表达式的 return 相当于返回 None。
1.3 语法
语法
Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表):
函数体
1.4 函数的创建与调用
def fun():#fun是函数名,又可以称呼为函数对象
print('这是我的第一个函数')
fun() #函数调用
二、函数的参数
2.1 形参
- 形参(形式参数) 定义形参就相当于在函数内部声明了变量,但是并不是赋值
2.2 实参
- 实参(实际参数)指定了形参,那么在调⽤函数时必须传递实参,实参将会赋值给对应的形参,简单来说有⼏个形参就要有⼏个实参
2.3 案列解析
def fun(a,b):#函数的参数相当于在函数内部定义了,这两个变量,并没有实质性的意义,因为没有赋值,a,b就是一个形参(形式上的参数)
print(a+b)
fun(1,2) #1,2 则是实际上的参数
# 调用函数 ,如果有形参,那么必须传递实参(实际的参数),需要与形参对应
'''
3
'''
2.4 实参的类型
- 整数
def fun(a):
print(a)
b=123#整数
fun(b)
'''
123
'''
- 列表
def fun(a):
print(a)
b=[1,2,3]#列表
fun(b)
'''
[1, 2, 3]
'''
- 布尔型
def fun(a):
print(a)
b=None#布尔型
fun(b)
'''
None
'''
- 字符串
def fun(a):
print(a)
b='abcd'#字符串
fun(b)
'''
abcd
'''
- 元组
def fun(a):
print(a)
b=('a','b','c','d')#元组
fun(b)
'''
('a', 'b', 'c', 'd')
'''
- 字典
def fun(a):
print(a)
b= {'a':1,'b':2,'c':3,'d':4}#字典
fun(b)
'''
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
'''
三、参数的传递方式
3.1 位置传参
- 位置传参就是将对应位置的实参赋值给对应位置的形参
def fun(a,b,c,d):
print(a)
print(b)
print(c)
print(d)
fun(1,2,3,4)
'''
fun(1,2,3,4)
'''
3.2 关键字传参
- 关键字传参:关键字传参可以不按照形参定义的顺序去传递,⽽根据参数名进⾏传递
def fun(a,b,c,d):
print(a)
print(b)
print(c)
print(d)
fun(d=1,a=2,c=3,b=4)
'''
2
4
3
1
'''
3.3 默认值传参
- 默认值传参:在设置形参时,可以直接设置默认值,当该位置设置实参时,引用实参,没有设置直接引用默认值
def fun(a,b,c=20,d=0):
print(a)
print(b)
print(c)
print(d)
fun(1,2,3)
'''
1
2
3
0
'''
def fun(a,b,c=20,d=0):
print(a)
print(b)
print(c)
print(d)
fun(1,2,d=3)
'''
1
2
20
3
'''
3.4 混合传参
- 混合传参:将位置传参和关键字传参混合使用时需要注意,位置传参需要设置在关键字传参之前
def fun(a,b,c=20,d=0):
print(a)
print(b)
print(c)
print(d)
fun(1,2,b=3)
'''
TypeError: fun() got multiple values for argument 'b'
#b获得了多个传参
'''
def fun(a,c=20,d=0,b):
print(a)
print(b)
print(c)
print(d)
fun(1,2,b=3)
'''
SyntaxError: non-default argument follows default argument
# 将没有默认值的b放在了有默认值的形参后面
'''
def fun(a,b,c=20,d=0):
print(a)
print(b)
print(c)
print(d)
fun(1,2,d=3)
'''
1
2
20
3
'''
四、不定长参数
- 不知道会接受几个参数,所以用不定长参数(形参)来接受实参
4.1 传参顺序
4.2 *args不定长参数
- 不定长参数,在定义函数是用 *args 来接受,其中 * 是规定的,args可用其他名称替换,但一般习惯用 args 来表示。参数在传入函数后,被封装成一个 tuple 来进行使用。所以我们在函数内部,可以通过操作 tuple 的方法来操作参数
def fun(*args):
print(*args)
print(args) #不定长参数的数据类型是元组
r=0
for i in args:
r+=i
print(r)
fun(1,2,3,4,5)
'''
1 2 3 4 5
(1, 2, 3, 4, 5)
15
'''
def fun(a, b, *args):
print(a)
print(b)
print(args)
print(args[1])#元组访问规则
ret = a + b
for i in args:
ret += i
print(ret)
fun(1,2,3,4) #1,2分别赋值给a,b,剩下的参数以元组的形式赋值给args
'''
1
2
(3, 4)
4
10
'''
def fun(b,*args,c):
print(*args)
print(args)
r=0
for i in a:
r+=i
print(r)
fun(1,2,3,4,5)
'''
TypeError: fun() missing 1 required keyword-only argument: 'c'
#当*a和位置传参混使用的时候,位置参数一定要放到*a前面
'''
def fun(b,*args,c):
print(*args)
print(*args)
r=0
for i in a:
r+=i
print(r)
fun(1,2,3,4,b=2)
'''
TypeError: fun() got multiple values for argument 'b'
#当*a和关键字传参一起使用时,关键字传参要放到最后面
'''
def fun(c,*args,b):
print(*args)
print(args)
r=0
for i in a:
r+=i
print(r)
fun(1,2,3,4,b=2)
'''
2 3 4
(2, 3, 4)
9
#传参顺序是 位置传参,不定长参数,关键字传参
'''
def print_numbers(*args):
print(args,type(args)) # tuple
for n in args:
print(n,type(n)) # int
l = [1, 2, 3, 4]
print_numbers(*l) # *l,等价于 print_numbers(1, 2, 3, 4)
print_numbers(l) # 将 l 作为一个整体传入,这样函数接受到的其实只有一个参数,且参数类型为 list
'''
(1, 2, 3, 4) <class 'tuple'>
1 <class 'int'>
2 <class 'int'>
3 <class 'int'>
4 <class 'int'>
([1, 2, 3, 4],) <class 'tuple'>
[1, 2, 3, 4] <class 'list'>
'''
4.3 **kwargs不定长传参
**kwargs,加了两个星号 ** 的参数会以字典的形式导入,因为返回的是字典,所以传入时需要指定参数名
def fun(a, b, **kwargs):
print(a)
print(b)
print(*kwargs)
print(kwargs)
print(kwargs['c'],kwargs['d'])
fun(1, 2, c=3, d=4)
'''
1
2
c d
{'c': 3, 'd': 4}
3 4
'''
五、参数的拆包
def fun(a,b,c):
print(a, b, c)
x = (1,2,3) # 元组数据
y = [4,5,6] # 列表数据
z = {'a':7, 'b':8, 'c':9} # 字典数据
fun(*x) # 元组解包 *
fun(*y) # 列表解包 *
fun(**z) # 字典解包 通过 **对字典进行解包
'''
1 2 3
4 5 6
7 8 9
'''
def test1(a, b, c=0, *args, **kwargs):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kwargs)
def test2(a, b, c=0, *args, d, **kwargs):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'args=', args, 'kw =', kwargs)
# 定义一个元组和字典用作参数传入
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
test1(*args, **kw)
# a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
test2(*args, **kw)
#a = 1 b = 2 c = 3 d = 99 args= (4,) kw = {'x': '#'}
六、作业
6.1 名片打印
1.打印名片程序:输入姓名,电话号码,性别,最后打印出来名片
- 控制姓名长度为6-20
- 电话号码长度11
- 性别只能允许输入男或女
- 每一样信息不允许为空
#@author:mianhua
#@Time:2021/4/27
#@File:作业.py
#@Describition:
print('欢迎使用财源广进名片打印系统')
def user_check():
global user_name
user_name=input('请输入姓名:')
if 6<=len(user_name)<=20:
phone_check()
else:
print('用户名长度限制6-20,请重新输入')
user_check()
def phone_check():
global user_phone
user_phone=input('请输入您的手机号:')
if len(user_phone)!=11 :
print('手机号码为11位,请重新输入')
phone_check()
elif not user_phone.isdigit():
print('手机号码必须为纯数字,请重新输入')
phone_check()
else:
sex_check()
def sex_check():
global user_sex
user_sex = input('请输入您的性别:')
if user_sex not in ['男','女']:
print('请输入正确的性别,男或者女')
sex_check()
else:
print('恭喜您,信息输入成功!\n您的姓名是:{},性别:{},手机号码:{}'.format(user_name,user_sex,user_phone))
user_check()
'''
欢迎使用财源广进名片打印系统
请输入姓名:棉花糖
用户名长度限制6-20,请重新输入
请输入姓名:
用户名长度限制6-20,请重新输入
请输入姓名:草莓小棉花糖
请输入您的手机号:
手机号码为11位,请重新输入
请输入您的手机号:1234567890
手机号码为11位,请重新输入
请输入您的手机号:1234567890a
手机号码必须为纯数字,请重新输入
请输入您的手机号:13150040170
请输入您的性别:你说什么
请输入正确的性别,男或者女
请输入您的性别:男
恭喜您,信息输入成功!
您的姓名是:草莓小棉花糖,性别:男,手机号码:13150040170
'''
6.2 斐波那契数列
2.使用函数求前20个斐波那契数列斐波那契数列: 1.1,2,3,5,13,2…即0: 起始两项均为1,
此后的项分别为前两项之和
def Fibonacci_sequence(a):
list1=[0,1]
for i in range(2,a):
num=list1[i-2]+list1[i-1]
list1.append(num)
print(list1)
Fibonacci_sequence(20)
'''
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
'''
6.3 求和函数
3.编写- -段代码,定义一个函数求1- 100之间所有整数的和,并调用该函数打印出结果
def get_number(a):
num = 0
for i in range(a + 1):
num += i
print(num)
get_number(100)
'''
5050
'''