今日内容函数的本质
-
关键字
def -
理解
函数可以看作是工具,提前制造好,然后可以一直拿出来用。
-
有函数和没有函数的区别
没有函数:
没有函数就相当于没有工具,如果我们想要使用什么工具的时候,还要自己现场制造。用完之后就会被丢掉,下次用的时候再制造。
有函数
有函数就相当于有工具,我们提前准备好工具,用的时候直接拿来用就可以了。
注意:函数要先定义,再使用,否则会报错
- 函数的定义(准备工具的过程)
def index(): pass # 不全代码语法结构 index() # 直接调用函数,就可以使用了函数的语法结构
- 格式
def 函数名(参数1,参数2): # 函数注释(很重要) 函数体代码 return 返回值
格式信息的解释
| 格式结构 | 解释 |
|---|---|
| def | 定义函数的关键字 |
| 函数名 | 与变量名的命名时一致的,尽量做到见名知意 |
| 括号 | 我们在定义函数名的时候,后面必须加括号 |
| 参数 | 这是写在括号里的,我们可以写参数(个数不固定),也可以不写参数,用于接收外界传给内部代码的数据 |
| 函数注释 | 相当于说明书,用于解释函数体的主要功能 |
| 函数体代码 | 整个函数最重要的部分,决定函数的主要功能 |
| return | 控制函数的返回值,向外界返回内部函数体的结果 |
1.函数必须先定义,再调用
eg:
如果是这种情况,pychram都会告诉我们,这样是不对的。
正确使用方法
这样就没有任何问题
2.定义函数使用def关键字的时候,调用函数使用函数名加上括号,可能需要加参数
正确调用函数方式:
eg:
3.函数在定义的时候只检测函数体语法,不执行函数体代码,只有在调用函数的时候才会去执行代码。
eg:
当你不去调用函数的时候,运行结果是没有报错的,因为没有调用
eg:
如果你调用了函数,系统就会去执行函数体代码,就会报错
4.函数名的含义:函数名就是在内存里绑定一个地址,里面存放函数体代码,想要使用就需要调用函数
eg:
产生的是一个地址
函数名加括号优先级更高(不包含定义阶段)
函数的分类函数分为内置函数和自定义函数
-
内置函数
内置函数是解释器提前帮你定义好的函数,直接调用就好了
eg:len(),open()…
注意:内置函数可以直接调用,但是数据类型的内置方法(函数),必须使用数据类型加点.的方式才可以被调用,相当于数据类型独有的一些内置方法
-
自定义函数
可以理解为需要自己去写的函数
1.空函数
函数体代码使用pass顶替,暂时没有任何功能。所以我们会下意识觉得空函数没有什么作用,但是,空函数相当有用,前期可以帮助我们搭建项目功能,有助于我们的代码结构思考。
def run():pass
2.无参函数
函数定义阶段括号内没有任何的参数
def run():
print('加油!')
然后直接调用就好了(函数名加括号)
eg:
函数的返回值3.有参函数
函数定义阶段括号内填写参数
用于接收外界传给内部的代码数据值
def index(a, b)print('加油!')
有参函数调用需要函数名加括号并且给函数值
-
理解
返回值就是调用函数之后产生的结果,可有可无。 获取函数返回值的方式是固定的 变量名 = 函数() 如果没有则默认为接收None
-
关键字
return -
返回情况一
函数体代码没有关键字return,则默认返回None
eg:
-
返回情况二
函数体代码有关键字return:后面不写,也是返回None
eg:
-
返回情况三
函数体代码有关键字return:return后面写什么就返回什么。如果是数据值就直接返回,变量名的话,就需要找到对应的数据值返回
eg:
def index():
print('加油!') # 加油!
return 123
data = index()
print(data) # 123
eg:
def index():
print('加油!') # 加油
name = 'lzq'
return name
data = index()
print(data) # lzq
-
返回情况四
函数体代码有关键字return并且后面写了多个数据值(名字),逗号隔开
注意:在默认情况下是以元组返回
eg:
def index():
return 1, 2, 3
data = index()
print(data) # (1, 2, 3)
不在默认模式下,我们是可以自己设置的
eg;
def index():
return {'name': 'jason', 'pwd': 123}
data = index()
print(data) # {'name': 'jason', 'pwd': 123}
eg:
def index():
return [1, 2, 3], {'name': 'jason'}, 123
data = index()
print(data) # ([1, 2, 3], {'name': 'jason'}, 123) 还是元组
-
返回情况五
函数体代码遇到关键字return会立即结束,就好似循环里的break
eg:
系统也会提示你不正确,也只输出了123
函数的参数有两大类:形式参数和实际参数
1.形式参数:
是在函数在定义的时候括号里填写的参数,简称为’形参’
def index(a):2.实际参数
是在函数调用阶段括号内填写的参数,简称为’实参’
index(123)
形参与实参的关系
形参相当于是变量名 实参相当于是数据值 在函数调用的阶段形参会临时与实参绑定关系,但是函数运行结束之后,会自动解除绑定(动态绑定,动态解除)
eg:
def index(a):
print(a)
index(123) # 123
index(456) # 解除绑定,再输出456
index(789) # 789
位置参数
位置参数分为位置形参和位置实参
1.位置形参
在函数定义阶段括号内从左往右依次填写的变量名称之为位置形参
2.位置实参
在函数定义阶段括号内从左往右依次填写的数据值称之为位置形参
实参可以是数据值也可以是绑定了数据值的变量名
给位置形参传值的时候必须个数一致,多一个不行,少一个也不行
eg;
def index(a,b):
print(a)
print(b)
index(123) # 报错,因为形参和实参个数不一致
正确方法:
def index(a,b):
print(a)
print(b)
index(123,321) # 123,321
关键字参数
-
理解
关键字实参 在函数调用的阶段,括号里以什么等于什么的形式传值称为关键字参数
这里我们需要注意几个格式的规范
1.指名道姓的给形参传值
2.位置参数写在关键字参数的前面
3.小技巧:简单的和短的写在复杂和长的前面
def index(a,b):
print(a)
print(b)
index(123,b='jason') # 123就是简单的,b='jason'就是复杂的
如果我们反正写的话,这里pycharm都告诉我们是不行的
4.同一个形参在一次调用中只能传一次值
eg:
def index(a, b):
print(a)
print(b)
index(123, b='jason') # 123, jason
index(111, b=2) # 111, 2
index(b=1,2) # 报错,因为b已经关键字传有一个值了,但是后面那个位置参数又给了b一个值,所以就会报错
默认值参数
-
理解
默认值形参 在函数定义阶段括号内以什么等于什么的形式填写的形参称之为默认值形参。
eg:
def register(name, age, gender='male'): # 第三个变量名为关键字形参
print(f"""
-------------info-----------
name:{name}
age:{age}
gender:{gender}
----------------------------
""")
register('jason',18) # 当第三个变量名没有时,就会被默认为关键字形参
register('oscar',28) # 默认情况下,为关键字形参
register('jerry',38)
register('lili',18,'female') # 不是在默认的情况下,这里的值就是第三个形参的值
这里也有注意情况
1.在函数定义阶段就给形参绑定值,后续调用阶段就不用传值了。
2.调用阶段不传值就使用默认的,如果传了就用传了的
-
理解
可变长形参 可以打破形参与实参的个数限制,随意传值
*在形参中的作用
接收多余的位置参数并组成元组的形式赋值给*后面的变量
eg:
def index(*x):
print(x)
index() # ()
index(1,2,3) # (1, 2, 3)
*x不是变量名
如果有形参的时候:
eg:
def index(a,*x):
print(a)
print(x)
index() # 报错
index(1,2,3) # 1 是形参a的值 (2,3)是多余的*x的值
**在形参里的作用
接收多余的位置参数并且组织成字典的形式赋值给**后面的变量名
eg:
def index(**x):
print(x)
# index()
index(a=1, b=2, c=3) # {'a': 1, 'b': 2, 'c': 3}
index(name='jason', age=18) # {'name': 'jason', 'age': 18}
当*和**都存在的时候
eg:
如果为();则分别为()和 {}。
因为*c和**y都不是变量名
将用户管理用函数修改一下
l1 = {'001': {'name': 'jason', 'age': '25', 'post': '讲师', 'poy': '3w'},
'002': {'name': 'kevin', 'age': '28', 'post': '运营', 'poy': '2.5w'}
}
user_name = [
{'name': 'lzq', 'pwd': '123'},
{'name': 'gsy', 'pwd': '520'}
] # 创建的一个多管理人员表
def tage():
# 登录输出
username = input('please input yours name>>>:')
password = input('please input yours password>>>:')
return {'name': username, 'pwd': password}
def index():
# 用户查看
for i in l1:
print(f'''
----------------------------------------info----------------------------------------------
id:{i}, tname:{l1[i]['name']}, tage:{l1[i]['age']}, tpost:{l1[i]['post']}, ttpoy:{l1[i]['poy']}
------------------------------------------------------------------------------------------
''')
def judge():
# 判断
if i in l1:
return True, i
return False, i
is_tage = True
while is_tage:
res = tage()
if res in user_name:
print('登录成功')
else:
print('登录失败')
continue
while is_tage:
print('''
输入1执行添加用户名功能
输入2执行查看所有用户名功能
输入3执行删除指定用户名功能
输入4退出系统
''')
order = input('please input yours order>>>:')
if order == '1':
i = input('please input her id>>>:')
if not judge()[0]:
name = input('请输入新增员工的姓名:')
age = input('请输入新增员工的年龄:')
post = input('请输入新增员工的职业:')
poy = input('请输入新增员工的薪资:')
sum = l1.fromkeys([i], {'name': name, 'age': age, 'post': post, 'poy': poy})
l1.update(sum)
print(f'员工{i}已添加成功')
continue
else:
print('用户已存在')
continue
elif order == '2':
index()
continue
elif order == '3':
if not judge()[0]:
print('员工不存在')
else:
f = input('请输入你想删除员工的编号>>>:')
if f in l1:
del [l1[f]]
print('已删除')
elif order == '4':
print('拜拜你嘞!!!')
is_tage = False
else:
print('未收到正确指令')
continue



