函数的本质
可以把函数理解成一个工具 我们需要用它时在用它不是不用就放那 也不会影响代码的运行
定义好的函数 以后可以无限的使用它
就比如现在要编写一个功能
我们可以提前定义一个函数编写 也可以不用函数编写
如果一个py文件下要使用多次这个功能如果不用函数编写的话 我们就要反复的编写这个代码这样就会大大降低我们编写代码的效率
而如果我们是把编写好的代码通过函数封装起来时 这样我就可以通过这个函数来调用这个功能 这样不管你需要多少次这个功能只要调用即可 不需要重新编写
主意:函数必须先定义 才可以调用
函数的定义(制造工具)
需要使用关键字 def
def func():
pass
函数的调用(使用工具)
只需要函数名加括号
func()
函数的语法结构
def 函数名(参数1,参数2): '''注释(简绍这个函数的使用)''' 函数体代码 return 返回值
1.def
def是定义函数的时候必须使用的关键字
2.函数名
相当于变量名 尽量做到见名知意
3.()
括号后面必须跟上冒号 :
4.参数
定义函数阶段可以在括号内填写参数(个数不固定),也可以不写
用于接收外界传递给函数代码内部的数据
5.注释
相当于一个工具的说明书 用于简绍函数的主题功能和具体用法
6.函数体代码
是整个函数的核心
7.return
控制函数的返回值
函数的定义和调用
1.函数必须先定义后调用
定义函数的代码必须是在调用函数的代码的上面
2.定义函数必须使用关键字def 调用函数使用函数名加括号(可能还需要添加额外的参数)
3.函数在定义阶段只检测函数体代码语法 不会执行函数体代码 定义的时候只要语法没有错整体代码都可以执行
只有在调用阶段吹真正的执行函数体代码
4.函数名的意思
函数名相当于变量名 只不过变量名是绑定的数据值的内存地址 函数名绑定的也是内存地址 而里面放的是函数体代码
想要运行改代码 就需要调用函数>>>:函数名加括号
主意:函数名加括号的优先级是最高的(定义阶段除外)
1.定义函数
2.调用函数
3.执行函数的子代码
4.打印函数的返回值因为没写返回值就返回None
5.将返回值赋值给res
6.打印res的值
所以说在一行代码中函数加括号的优先级是最高的
函数得到分类
1.内置函数
解释器提前帮你定义号的函数 用户可以直接调用 eg:len()
内置函数可以直接调用 数据类型的内置方法其实也是函数
但是数据类型的内置方法必须使用数据类型的方式才可以调用
相当于是数据类型独有的一些内置方法
2.自定义函数
自定义函数可以分为 空函数、无参函数、有参函数
1.空函数
空函数就是函数体代码没有实际意义的函数
函数体代码使用pass顶替
主要用于前期的项目的搭建 提示主要功能
def func(): pass # 没有实际意义
2.无参函数
函数定义阶段括号内没有填写参数
调用函数时就可以不用填写参数
def func(): print('form func') # 无参函数直接使用函数名加括号即可调用
3.有参函数
有参函数就是在函数定义阶段在括号内填写参数
调用阶段必须在括号内填写参数
def func(x, y): print('from func') # 有参函数调用函数需要函数名加括号并且填写数据值
函数的返回值
返回值就是调用函数之后产生的结果 可有可无
获取函数的返回值的方式是固定的
变量名 = 函数()
如果有返回值则直接赋值给变量名 没有则默认接收None
1.函数体代码没有return关键字
def func(): print('from func') res = func() # 执行函数体代码 并把返回值赋值给res print(res) # None # 因为函数体代码没有编写所以默认返回None
2.函数体代码有return关键字:后面没有写
def func(): print('from func') return res = func() # 执行函数体代码 并把返回值赋值给res print(res) # 因为return后面没有写 所以也会是返回None # renturn后面没有写的话默认返回None
3.函数体代码有return关键字:后面写了
def func(): print('from func') return 123 res = func() # 执行函数体代码并且把返回值赋值给res print(res) # 因为return后面写了数据 就会打印123 # 如果return后面写了变量名 def func(): print('from func') name = 'tony' return name res = func() # 执行函数体代码并且把返回值赋值给res print(res) # 因为return后面写了数据 就会打印'tony' ''' return 后面如果写了数据那么些什么就会返回什么 如果是返回了变量名那就回找到变量名绑定的值并返回 '''
4.函数体代码renturn关键字:后面写了多个数据值
# 第一种情况 def func(); print('from func') return 1, 2, 3, 4 # 多个数据值使用逗号隔开 res = func() # 执行函数体代码并且把返回值赋值给res print(res) # 如果是多个数据值那么就会组织成元祖并返回 (1, 2, 3, 4) # 如果return后面是多个数据值 默认情况下会组织成元祖返回 # 第二种情况 def func(); print('from func') return [1, 2, 3, 4] res = func() # 执行函数体代码并且把返回值赋值给res print(res) # 如果是列表那么就会返回列表 [1, 2, 3, 4] # 列表、字典、元祖、集合都是一样的 # 第三种情况 def func(): print('from func') return [1, 2, 3, 4], {'a' : 1, 'b' : 2}, 12 res = func() # 执行函数体代码并且把返回值赋值给res print(res) # 如果是混合写人也会是返回元祖 ([1, 2, 3, 4], {'a': 1, 'b': 2}, 12) # 不管return后面写多少个值只要是逗号隔开 那么就会组织成元祖返回 数据值按逗号隔开
主意:函数体代码在运行中如果中途遇到return那么就会立刻结束函数体代码的运行
def func(): print('我在return上面') # 会执行这行代码 return 123 print('我在return下面') # 因为这行代码的上方就是return关键字不会执行这行代码 func() # 函数体代码只要遇到return关键字就会直接结束运行 不管你下方有多少行代码都不会运行
函数的参数
参数有两大类>>>:形式参数 实际参数
1.形式参数
函数在定义阶段括号内填写的参数 简称为'形参'
2.实际参数
函数在调用阶段括号内填写的参数 简称为'实参'
形参与实参的关系
形参相当于变量名
实参相当于数据值
在函数调用阶段形参会临时与实参进行绑定 函数运行结束就会立刻解除绑定>>>动态绑定 动态解除
def func(x, y): print(x, y) func(1, 2) ''' 1.首先定义一个func()函数括号内有两个形参 2.然后调用函数 这个时候x就会临时与1绑定 y也会临时与2绑定 3.执行函数体代码 这样就会打印 1,2 4.执行完函数后x,y就会与1和2解除绑定 '''
1.位置参数
位置参数有两种 位置形参与位置实参
1.位置形参
在函数定义阶段括号内从左往右依次填写的变量名称之为位置形参
2.位置实参
在函数调用阶段括号内从左往右依次填写的数据值称之为位置实参
def func(x, y): # x和y就是位置形参 print(x, y) name1 = 'tony' name2 = 'jason' func(name1, name2) # tony jason 实参可以是绑定了数据值的变量名 func(1, 2) # 1,2就是位置实参 # func(1) # 报错 # func(1, 2, 3) # 报错 ''' 当你位置形参只有两个时 那么你实参就必须传两个即可 传多传少多会报错 两者必须匹配 '''
2.关键字参数
关键字参数只有关键字实参
关键字参数就是在调用阶段括号内以什么等于什么的形式传值 称之为关键字实参
关键字实参
1.指名道姓的给形参传值(打破了位置的限制)
2.位置实参必须才关键字实参的前面
小诀窍:无论是形参还是实参 都遵守短的在前面 长的在后面
3.通过一个形参在一次调用中只能传一次值
def func(x, y): # x和y就是位置形参 print(x, y) func(1, 2) # 1,2 func(y=3, x=4) # 4 3 # 可以先写y的值 再写x的值 # func(y=1, 2) # 报错 # func(x=1, 2) # 报错 # func(99999, x=1) # 报错 x只能赋值一次 func(2, y=1) # 2,1 # func(x=1,y=3,z=3) # 报错 ''' 1.首先你的位置实参必须在关键字实参前面 2.关键字实参可以改变位置 3.每个形参调用是只能赋值一次 4.可以先写位置实参 但是后面的关键字实参只能赋值给后面那个形参 5.形参的数量决定了关键字的数量这是不变的 '''
3.默认值参数
默认值参数只有默认值形参
默认值形参就是在定义阶段括号内以什么等于什么的形式填写的形参称之为默认值形参
调用的时候可以改也可以不用改
def register(name, age, gender='male'): print(name) print(age) print(gender) register('jason', 18) # jason 18 male register('oscar', 28) # oscar 28 male register('jerry', 38) # jerry 38 ,ale register('lili', 18, 'female') # lili 18 female ''' 默认形参就是提前赋值后了参数 后续如果调用该函数时可以不用写改形参对应的实参 不过也可以自己定义该位置的实参 该位置形参就会临时绑定该位置的实参 不过还是要遵循前面总结的规律(简单的左边 复杂的在右边) '''
4.可变长参数
可变长参数只有可变长形参
可以打破形参与实参的个数限制 随意传值
# 第一种 * def func1(*x): print(x) func1() # () 因为函数中没有形参所以不会报错 func1(1, 2, 3) # (1, 2, 3) func(x=1, y=2) # 报错 因为它只能接收位置实参 func(1,y=1) # 报错 ''' *在形参中的作用 接收多余的位置参数然后组织成元祖形式赋值给*号后面的变量名 ''' def func2(a,*x): print(a,x) func2() # 报错 因为函数中有一个位置形参 所以必须传入一个实参才可以 func2(1) # 1 () func2(1,2) # 1 (2,) func2(1,2,3,4) # 1 (2, 3, 4) # 因为位置形参就一个所以是需要一个位置实参足以 其他的位置实参就会组织成元祖赋值给x
第二种
def func1(**x): print(x) func1(1) # 报错 因为这个只能接收位置实参func1(1,2,3) # 报错 func1() # {} func1(name=1,name2=2) # {'name': 1, 'name2': 2} func1(name1=1,name2=2,name=3) # {'name1': 1, 'name2': 2, 'name': 3} ''' **在形参中的作用 接收多余的关键字参数然后组织成字典赋值给**号后面的变量名 ''' def func2(a, **b): print(a, b) func2() # 报错 func2(1) # 1 {} func2(name=1,name2=2) # 报错 因为函数内有一个形参必须先填写一个实参才行 func2(a=1,1,2,3) # 报错 因为位置实参必须在关键字实参前面 func2(1, name1=2, name2=3) # 1 {'name1': 2, 'name2': 3} func2(a=1, name1=2, name2=3) # 1 {'name1': 2, 'name2': 3}
作业
尝试将之前所有的编程题切换成函数形式
1.员工管理系统
user_data_dict = {} def register(): while True: emp_id = input('请输入员工编号,输入q退出>>>:').strip() if emp_id == 'q': break # 2.判断员工编号是否已存在 if emp_id in user_data_dict: print('员工编号已存在,无法添加') continue emp_name = input('请输入员工姓名>>>:').strip() emp_age = input('请输入员工年龄>>>:').strip() emp_post = input('请输入员工岗位>>>:').strip() emp_salary = input('请输入员工薪资>>>:').strip() # 3.创建一个小字典 data_dict = {'emp_id': emp_id, 'emp_name': emp_name, 'emp_age': emp_age, 'emp_post': emp_post, 'emp_salary': emp_salary} # 4.存入到大字典 user_data_dict[emp_id] = data_dict # 5.提示信息 print(f'员工{emp_name}添加成功') def amend_salary(): target_id = input('请输入员工编号>>>:').strip() if target_id not in user_data_dict: print('员工编号不存在,无法修改') return # 提取改员工的字典 user_dict = user_data_dict[target_id] # 获取新的薪资 new_salary = input('请输入该员工新的薪资>>>:').strip() # 修改该员工的薪资 user_dict['emp_salary'] = new_salary # 修改大字典 user_data_dict[target_id] = user_dict # 提示信息 print(f'员工编号{target_id}的薪资已修改为{new_salary}') def check_all(): if len(user_data_dict) == 0: print('没有员工信息') else: # for i in user_data_dict.values(): # staff,d,a,c,e = tuple(i.values()) # print(staff,d,a,c,e) # user_data_dict >>> {'1': {'emp_id': '1', 'emp_name': 'jason', 'emp_age': '18', 'emp_post': "python'", 'emp_salary': '99999'}} for staff in user_data_dict.values(): # emp_id, emp_name, emp_age, emp_post, emp_salary = tuple(staff.values()) print('staff info'.center(30, '*')) print(f""" 员工编号:{staff.get('emp_id')} 员工姓名:{staff.get('emp_name')} 员工年龄:{staff.get('emp_age')} 员工岗位:{staff.get('emp_post')} 员工薪资:{staff.get('emp_salary')} """) print('end'.center(30, '*')) def check_assig(): target_id = input('请输入员工编号>>>:').strip() # 判断员工编号是否存在 if target_id not in user_data_dict: print('员工编号不存在,无法查看') return # 提取改员工的字典 user_dict = user_data_dict[target_id] # 可以for循环也可以解压赋值 # emp_id, emp_name, emp_age, emp_post, emp_salary = user_dict.values() print('staff info'.center(30, '*')) print(f""" 员工编号:{user_dict.get('emp_id')} 员工姓名:{user_dict.get('emp_name')} 员工年龄:{user_dict.get('emp_age')} 员工岗位:{user_dict.get('emp_post')} 员工薪资:{user_dict.get('emp_salary')} """) print('end'.center(30, '*')) def delete_staff(): delete_id = input('请输入员工编号>>>:').strip() # 判断员工编号是否存在 if delete_id not in user_data_dict: print('员工编号不存在,无法删除') return # 删除 res = user_data_dict.pop(delete_id) print(f'员工编号{delete_id}已删除', res) func_dict = { '0': ['退出', None], '1': ['注册', register], '2': ['修改薪资', amend_salary], '3': ['查看指定员工', check_assig], '4': ['查看所有员工', check_all], '5': ['删除员工', delete_staff] } while True: for func in func_dict: # '1': ['注册', register] print(func, func_dict[func][0]) choice = input('请输入功能编号>>>:').strip() if len(choice) == 0: print('请输入正确功能编号') continue # 5.不能输入其他字符 if not choice.isdigit(): print('请输入数字') continue if choice in func_dict: func_dict[choice][1]() else: print('没有功能编号')
标签:函数,dict,emp,func,print,实参 来源: https://www.cnblogs.com/stephenwzh/p/16435511.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。