一、函数介绍
函数就是代码片段的封装,实现某一特定功能,当程序中需要执行该功能时,可以通过函数调用方式,执行函数中封装的代码片段
函数中三要素
-
函数名 必须定义
-
参数 (可选)将数据传递函数中使用
-
返回值 (可选)将函数中的数据传递外部进行使用
二、函数使用
2-1 语法格式
-
def 是定义函数的关键
def 函数名(参数): 代码的逻辑片段 return 返回值
-
函数的调用执行
函数名()
2-2 函数的基本定义和使用
# 函数的介绍 # 功能1 def login(name_list,password_list): # 接受参数 # 函数作用域 # 通过四个空格,来确认函数所执行的逻辑从哪里开始 for num in range(3): # [0,3) 0,1,2 name = input('请输入用户名:') password = input('请输入密码:') # 先判断用户名是否正确 if name in name_list: # 在判断密码是否正确 if password in password_list: print('登录成功') # 适应break关键,会结束循环,不再进行取值 break else: print('密码不正确') else: print('用户名不正确') # 功能2 def register(): name = input('请输入注册的用户名:') password = input('请输入出注册的密码:') name_list = [name] password_list = [password] # 将函数的的数据返回到外部 return name_list, password_list # 功能3 def pay(): print('支付') # 功能4 def order(): print('下单') name_list = None password_list = None while 1==1: num = input('1-登录 2-注册 3-支付 4-下单 5-退出程序:') if num == '1': # 函数功能的调用 # namelist和password_list 是函数的参数 login(name_list,password_list) # 函数名() elif num == '2': name_list, password_list = register() elif num == '3': pay() elif num == '4': order() else: break
2-3 函数参数
-
将数据传递到函数中使用
-
可以在函数调用时,将需要处理的数据传递函数中代码片段进行处理
-
参数分类
-
形参 函数中定义参数
-
实参 函数调用时传递的数据
-
# 函数的参数使用 # 加法计算 def add_fucn(a,b): # a和b是函数的参数 该参数在函数内定义叫做函数的形参 # 参数本质就是一个变量,用来接收数据的 # 在函数调用时,可以向函数内容传递具体的数据值,参数可以接收传递的值 data = a+b print(data) # 函数调用 # 可以将数据传递到函数内 add_fucn(15,22) # 15和22的数据叫做实参 add_fucn(28,31)
2-4 参数接收数据类型
-
参数可以接收传递任意类型的数据
-
自己定义函数时,要明确处理的数据类型
# 函数参数能接受的数据类型 data_str = 'itcast' data_list = ['hadoop', 'spark'] data_tuple = ('hadoop', 'spark') data_set = {'hadoop', 'spark'} data_dict = {'id': 1} def func(data): # 要求传递的数据是字典 # 判断传递的数据是什么类型 if type(data) == dict: # 参数的类型由传递的数据决定 print(type(data), data) # 按照字典进行操作 data.get('id') # 函数的调用 func(data_str) func(data_set) func(data_list) func(data_tuple) func(data_dict)
2-5 函数的返回值
-
在函数内使用关键字return,return只能有一个
-
将函数内部的数据返回到调用处,在调用函数时,需要指定一个变量接收函数的返回值
-
默认情况,没有指定返回值时,返回的一个None值
-
返回任意类型数据
-
返回多个值会放入元组中返回
# 函数的返回值 # 将一个函数内的数据返回外部使用 def add_func(a,b): # data是函数内的变量 data = a+b print(data) # 将函数内的变量值返回到函数外部 return data # 在调用函数时,如果有返回值,需要在调用后定义变量接收返回值 return_data = add_func(10,20) def func(data): # 使用data变量值进行其他处理 res = data *2 print(res) # 将上一个函数返回值传递到当前函数内使用 func(return_data)
# 返回多个值 def func(): # 返回值可以是任意类型的数据 # 返回值可以返回多个数据,返回多个值时,会将多个值放入元组中 return 1,'张三',['asd','asd'],{'id':1,'name':'aaa'} # 调用函数时接受返回值 return_data = func() print(return_data) # 定义多个接收变量,分别接收不同返回值 a,b,c,d = func() print(a) print(b) print(c) print(d) def func2(): data = 10+29 # 没有返回值时,res变量接收到的是空值 res = func2() print(res)
2-6 函数的文档
函数文档就是对函数的描述
类似sql中的
create table tb(
id int comment '表的id'
)comment '用户表'
-
格式
-
函数文件在描述函数功能时,可以对接收的参数进行描述
-
def func(): """ 信息描述 """
# 函数文档 def add_func(a,b): ''' 加法计算功能 :param a: 接收一个数据 类型 int :param b: 接收一个数据 类型 int :return: 没有返回值 ''' data = a+b print(data) add_func(10,20) # ctrl+b跳转到函数定义处,可以查看文档描述信息
2-7 函数的嵌套调用
在一个函数内部调用其他函数
# 函数嵌套调用 def func1(): print('func1') def func2(): print('func2') func1() func2() def func3(): # 函数3内使用函数1的功能 func1() print('func3') # 函数3内执行函数2的功能 func2() func3()
# 函数的嵌套调用2 def func1(): print('func1') def func2(): #调用func1 func1() print('func2') def func3(f): """ :param f: 接收一个函数 :return: """ # 调用接收到函数 f() print('func3') func2() print('----------') # 函数名当成参数传递 func3(func1)
三、变量作用域
变量的作用域就是指在代码中变量能使用的位置
3-1 变量的引用
引用本质就是变量的赋值
data = '张三' # 数据直接赋值
data_new = data # 将一个变量值赋值给另一个变量 该过程就是变量的引用过程
def func(a): print(a) data = 10 func(data) # a=data 参数a引用了data的数据 data2 = 20 func2(data2)
在函数中可以通过参数引用外部数据
3-2 变量的分类
-
全局变量
-
在函数外定义,可以在代码中任意位置使用的变量
-
-
局部变量
-
在函数内定义,在函数内能使用
-
# 变量引用 data = 10 # 外部的变量值叫做全局变量 def func(data): # 参数传参引用方式 获取外部的变量值进行计算 # 内部的变量值叫局部变量 data = data+1 print(data) def func2(): # data没有参数是,当成局部变量,但是此时局部变量data没有被定义会报错 # 通过 global 声明外部变量值作为局部变量使用 global data data = data+1 print(data) def func3(): global data data = data+1 print(data) def func4(data): data = data+1 print(data) func(data) func4(data) # func2() # func3()
变量的作用域 指的变量能使用的范围
全局变量 可以代码的任意位置使用
局部变量 只在当前函数内有效
在函数内使用全局变量 有两种方式
第一种 当成参数传参 将全局变量传递给函数参数(函数内的局部变量)
当成参数使用时 则相当于参数引用了全局变量的值,对参数进行操作,不影响全局全局变量的值
第二种 global声明 在函数内进行使用
在函数内直接操作全局变量,会修改全局变量的值
# 多个函数中都要使用的变量可以定义成全局变量,通过global声明,就可在多个函数就可以共享全局数据 name_list = [] password_list = [] # 登录注册功能 def login(): # 函数作用域 # 通过四个空格,来确认函数所执行的逻辑从哪里开始 # 列表,元组,集合,字典数据可以省略global声明 global name_list global password_list for num in range(3): # [0,3) 0,1,2 name = input('请输入用户名:') password = input('请输入密码:') # 先判断用户名是否正确 if name in name_list: # 在判断密码是否正确 if password in password_list: print('登录成功') # 适应break关键,会结束循环,不再进行取值 break else: print('密码不正确') else: print('用户名不正确') def register(): global name_list global password_list name = input('请输入注册的用户名:') password = input('请输入出注册的密码:') # 将用户的名字和密码添加到全局的数据列表 name_list.append(name) password_list.append(password) while 1==1: num = input('1-登录 2-注册 3-支付 4-下单 5-退出程序:') if num == '1': # 函数功能的调用 login() # 函数名() elif num == '2': register() elif num == '3': pass elif num == '4': pass else: break
data = 10 def func(a): """ 将字符串数据进行复制 :param a: :return: """ data_str = 'itcast' print(data_str * a) def func2(data): """ 数据相加 :param data: :return: """ data = data+25 print(data) func2(data) func(data)
四、函数参数详解
-
形参
-
def func(形参)
-
在函数定义时指定的参数
-
本质形参可以理解为函数定义的内部变量,接收外部传递的数据
-
缺省参数
-
可以定义一个默认值,当形参没有传递数据时,可以使用默认值
-
-
不定长参数
-
接收任意个数的数据
-
*args 不能接受关键字传参的数据 接受位置参数的数据
-
**kwargs 接受关键字参数数据
-
-
-
实参
-
func(实参)
-
在函数调用时指定的参数数据
-
位置参数
-
在传递实参数据时,需要按照参数的位置进行数据的传递
-
传递数据个数个形参个数一致
-
-
关键字参数
-
按照形参的名称传递数据
-
形参=数据
-
-
-
def func(形参): # 函数调用时传递的参数数据 实参 func(实参)
# 使用实参传递数据 # 定义一个学生列表保存多个学生数据 stu_list = [] def add_student(name,age,gender,address): """ 添加学生数据 :param name: 姓名 str类型 :param age: 年龄 int类型 :param gender: 性别 str类型 :param address: 地址 str类型 :return: """ # 往列表中添加学生数据 stu_list.append({'name':name,'age':age,'gender':gender,'address':address}) # 实参传递数据的方式1 位置参数 # 按照参数的顺序和数量传递数据 add_student('张三',20,'男','北京') # 位置传参 print(stu_list) # 方式2 关键字参数 # 使用参数的名称指定数据,和顺序无关 add_student(address='上海',age=22,name='李四',gender='男') # 使用参数名传递数据 print(stu_list) # 混合使用 保证位置参数在前面 关键字参数在后面 # add_student(address='广州',20,'张三') add_student('王五',20,gender='男',address='广州') print(stu_list)
# 使用实参传递数据 # 定义一个学生列表保存多个学生数据 stu_list = [] def add_student(name,age,gender,address='北京'): """ 添加学生数据 :param name: 姓名 str类型 :param age: 年龄 int类型 :param gender: 性别 str类型 :param address: 地址 str类型 默认值北京 缺省参数,当没有传递数据是,使用默认的数据 :return: """ # 往列表中添加学生数据 stu_list.append({'name':name,'age':age,'gender':gender,'address':address}) # 实参传递数据的方式1 位置参数 # 按照参数的顺序和数量传递数据 add_student('张三',20,'男','北京') # 位置传参 print(stu_list) # 方式2 关键字参数 # 使用参数的名称指定数据,和顺序无关 add_student(address='上海',age=22,name='李四',gender='男') # 使用参数名传递数据 print(stu_list) # 混合使用 保证位置参数在前面 关键字参数在后面 # add_student(address='广州',20,'张三') add_student('王五',20,gender='男',address='广州') print(stu_list) add_student('赵六',20,gender='男') print(stu_list)
# 使用形参接受数据 # 定义一个学生列表保存多个学生数据 stu_list = [] # 不确定学生数据到底有哪些数据内容,传递的数据个数无法确定 # 此时就可以使用不定长参数,接受任意个数的数据 def add_student(*args,**kwargs): # *args接受位置参数传递的多个数据,会将数据保存在元组中 # **kwargs接受关键字参数传递多个数据,将数据保存在字典中 # 往列表中添加学生数据 if len(args) !=0: stu_list.append(args) if len(kwargs) !=0: stu_list.append(kwargs) add_student('张三',20,'男') print(stu_list) add_student('李四',22,'男','北京') print(stu_list) add_student(name='张三',age=20) print(stu_list) add_student(name='张飞',age=20,address= '河北') print(stu_list)
五、函数的数据传递
将外部数据传递到内部使用
1- global声明外部数据在函数内使用
2- 通过参数传递到函数内部
将函数内部数据传递外部使用
1-通过return返回函数内的数据
5-1 将函数外部数据传递到函数内部使用
-
使用全局变量传递
-
多数函数都要使用的数据,定义成全局变量
-
全局要先定义,再在函数中使用
-
# 将外部数据传递到函数内部 # 方式1 定义全局变量 data_str = 'itcast' # 不可变类型数据 数据本身不可修改 data_list = ['hadoop','hive','spark','python'] # 可变类型 数据本身可修改 def func(): # 在函数内进行修改全局变量数据 # 需要使用global 声明 global data_str # 不可变类型 data_str = data_str+'python' print(data_str) # global data_list 数据是可变类型,省略global声明 data_list.append('flink') print(data_list) func()
-
使用参数传递
-
每个函数处理不同数据时,可以采用函数传参
-
# # 将外部数据传递到函数内部 # # 方式1 参数传递 data_str = 'itcast' # 不可变类型数据 数据本身不可修改 data_list = ['hadoop','hive','spark','python'] # 可变类型 数据本身可修改 # 在函数定义时,定义参数接收数据 def func(data): print(id(data)) # 函数调用时传递参数数据 相当于是变量赋值 func(data_str) # data = data_str # 当对data进行操作就是对data_str print(id(data_str)) print('----------------------') func(data_list) # data = data_list # 当对data进行操作就是对data_list print(id(data_list))
5-2 函数内部数据传到函数外部使用
函数内定义了变量。该变量是局部变量
局部变量能在函数内进行计算修改,但是不能在函数外使用
# 局部变量数据传递到外部 def func(): data = [1, 2, 3] data.append(4) print(data) # 需要将函数内的局部 变量传递外部使用 # 借助返回值return 将内部的局部变量返回外部使用 print(id(data)) return data # 调用函数时,定义变量接收函数返回值 data_res = func() # 返回值 等价 data_res = data print(data_res) print(id(data_res)) # 可以将上一个函数的返回值传递到下一个函数 def func2(data2): # data2 = data_res print(data2) print(id(data2)) data2.append(5) # 将data_res 传递给func2 func2(data_res) # data,data_res,data2代表的同一个数据 print(data_res)