目录
1 函数
1.1 函数定义
- 函数必须先定义再调用
- 语法:
def 函数名(形参):
代码1
代码2
......
调用函数:
函数名(实参)
- 注意:
- 函数以
def开头,后接函数名和() - 形参:是用来接收用户数据的参数
- 实参:调用函数时,传入的真实数据的参数
- 函数以
【例子】
def sum(i,j): # 定义函数,同时设置两个形参,i和j用来接收用户数据
a=i+j # 将i+j赋值给一个变量
print(a) # 打印这个变量
sum(2,5) # 调用函数时,传入真实数据2和5,真实数据是实参
# 7
1.2 函数说明文档
- 语法:
【定义函数的说明文档】
def 函数名(形参):
"""说明文档位置"""
代码
......
【查看函数的说明文档】
help(函数名)
- 注意:
- 说明文档的位置一定要写在
def下面缩进的第一行。 - 说明文档可以换行。
- 说明文档的位置一定要写在
【例子】
def sum(i,j):
"""这是一个
说明文档"""
a=i+j
print(a)
help(sum)
'''
sum(i, j)
这是一个
说明文档
'''
1.3 参数
1.3.1 位置参数
- 定义:在定义函数时,参数的名字和位置已被确定。
【例子】
def infor(name,age,gender):
print(f'你的姓名是{name},年龄是{age},性别是{gender}')
infor('YHY',20,'man')
# 你的姓名是YHY,年龄是20,性别是man
1.3.2 关键字参数
- 定义:传入实参时,明确形参的变量名,参数之间不存在先后顺序。
- 注意:
- 函数调用时,通过“键=值”的形式指定,清楚了参数的顺序问题
- 调用函数时,如果有位置参数,位置参数必须在关键字参数之前,否则报错。
【例子】
def infor(name,age,gender):
print(f'你的姓名是{name},年龄是{age},性别是{gender}')
infor('YHY',gender='man',age=20)
# 你的姓名是YHY,年龄是20,性别是man
1.3.3 默认参数(缺省参数)
- 定义:参数指定默认值,调用时不传实参,就用默认值。
- 注意:调用函数时,位置参数必须在关键字参数之前,否则报错。
【例子】
def infor(name,age,gender='man'):
print(f'你的姓名是{name},年龄是{age},性别是{gender}')
infor('YHY',age=20) # 你的姓名是YHY,年龄是20,性别是man
infor('DW',age=18,gender='girl') # 你的姓名是DW,年龄是18,性别是girl
1.3.4 可变参数(收集参数)
- 1.位置可变参数:(接收所有的位置参数,返回一个元组)
- 语法:
【例子】def 函数名(*args): print(args)def name(*args): print(args) name(20,3,'asd') # (20, 3, 'asd') - 2.关键字可变参数:(接受所有关键字,返回一个字典)
- 语法:
【例子】def 函数名(**kwargs): print(kwargs)def name(**kwargs): print(kwargs) name(name='DW',age=3,gender='man') # {'name': 'DW', 'age': 3, 'gender': 'man'}
1.4 局部/全局变量
1.4.1 局部变量
- 定义:定义在函数内部的变量,即只在函数内部生效。
【例子】
def name():
a=100 # 定义局部变量
print(a) # 函数内部访问,可以访问到a这个变量
name() # 调用函数
print(a) # 报错!!a是内部变量,无法外部访问
1.4.2 全局变量
- 定义:定义在函数外部的变量,即对函数内部和外部都有效,
【例子】
a=100 # 定义全局
def name():
print(a) # 函数内部访问,可以访问到a这个变量
name() # 调用函数
print(a) # 100
1.4.3 全局变量声明
- 作用:在函数内部修改全局变量(global)
- 注意:不要轻易修改全局变量,除非万不得已!!
【例子】
a=100 # 定义全局
def name():
global a # 声明a为全局变量
a=520 # 对变量a重新赋值
print(a)
name() # 520
1.4.4 多函数共用全局变量
- 流程:
1.声明全局变量
2.定义两个函数
3.函数1修改全局变量,函数2访问全局变量
4 先定义函数1,再调用函数2时就可以使用修改后的全局变量了
【例子】
a=100 # 定义全局
def name(): # 函数1
global a # 声明a为全局变量
a=520 # 对变量a重新赋值
def p(): # 函数2
print(a)
name() 调用函数1
p() # 520
1.4.5 nonlocal声明
- 作用:如果要修改闭包作用域中的变量,需要使用
nonlocal关键字。它的作用是把变量标记为自由变量,即使在函数中为变量赋予新值了,也会变成自由变量。 - 注意:
nonlocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量。
【例子】
def name1():
a=0
def name2():
nonlocal a # nonlocal关键字声明
a+=1 # 对闭包作用域内的变量a进行了更改,所以需要nonlocal声明
return a
return name2()
print(name1()) # 1
print(a) # NameError: name 'a' is not defined
注意:
对于函数内的变量而言,如果没有对变量进行修改,之前已经定义好的就可以直接使用。如果对变量进行修改了,看变量是全局变量还是在函数内部定义的变量。
1.5 函数的返回值
1.5.1 返回值的定义
- 语法:
函数返回值:return - 注意:
- 如果有多个
return语句,只执行第一个 - 遇到
return语句,就退出当前函数 - 多个返回值,可以写成
return a,b,返回的是一个元组(a,b)
- 如果有多个
【例子】
def sum(a,b): # 调用函数,设两个形参,a和b
return a+b # return返回a+b的值,退出当前函数
print('打印不到')
c=sum(1,2) # 用变量名保存函数的返回值
print(c) # 3
1.5.2 多函数返回值做参数
- 多函数返回值做参数传递:
1.定义函数1,return返回一个值
2.定义带形参的函数2,打印形参
3.将调用函数1的返回值,赋值给一个变量
4 调用函数2,用刚才的变量做参数
【例子】
def name1(): # 定义函数1,return返回一个值
return 100
def name2(a): # 定义带形参的函数2,打印形参
print(a)
b=name1() # 将调用函数1的返回值,赋值给一个变量
name2(b) # 调用函数2,用刚才的变量做参数
1.5.3 元组拆包
def num():
return 520,1314
a,b=num()
print(a) # 520
print(b) # 1314
1.5.4 字典拆包
a={'name':'haha','age':20}
def num():
return a
b,c=num()
print(b) # name
print(c) # age
print(a[b]) # haha
print(a[c]) # 20
1.6 函数递归
1.6.1 闭包
- 定义:在一个内部函数里对外层的非全局作用域的变量进行引用,这个内部函数就被认为是闭包。
- 闭包作用域:通过闭包可以访问外层非全局变量作用域的变量,这个作用域称为闭包作用域。
1.6.2 递归
- 定义:函数内部调用自己,必须留有出口。
【例子】
def sum(a):
if a==1: # 如果是1,直接返回1----设置出口
return 1
b=a+sum(a-1) # 如果不是1,重复执行累加
return b # 返回累加的结果
c=sum(100)
print(c) # 5050
【图示】
版权声明:本文为OohMuYi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。