函数
函数的应用场景
函数是广泛应用于编程语言的一个方法,能够用于解决代码冗余的问题。
我们来看这么一个场景:
# 校验程序
userinfo = { # 用字典存储用户的状态
'name': 'leethon',
'is_pass': True,
'readable': True,
}
if userinfo.get('name') == 'leethon' and \ # 每个条件都满足了
userinfo.get('is_pass') is True and \
userinfo.get('readable') == True:
# 校验用户状态成功可以进行读取操作等
pass
userinfo['is_pass'] = False # 用户状态发生变化
if userinfo.get('name') == 'leethon' and \
userinfo.get('is_pass') is True and \ # 这一个条件没有满足不执行
userinfo.get('readable') == True:
# 校验用户状态成功可以进行读取操作等
pass
在上述场景中,可以看见当多次需要校验的时候,那段庞杂的校验每次都要重新写一遍,使代码有很多重复的部分,这种情况多了很占用空间。而且抛去这一点不谈,当需要校验时,重新找到这段代码复制过来也是十分麻烦的,所以就要用到我们今天要说的主角——函数。
# 函数演示
def checkout(userinfo):
if userinfo.get('name') == 'leethon' and \
userinfo.get('is_pass') is True and \
userinfo.get('readable') == True:
# 校验用户状态成功可以进行读取操作等
pass
userinfo = { # 用字典存储用户的状态
'name': 'leethon',
'is_pass': True,
'readable': True,
}
checkout(userinfo)
userinfo['is_pass'] = False # 用户状态发生变化
checkout(userinfo)
对比两份程序可以看出,当我们想用那一段庞杂的代码时,就不用在重新写一段了,只要在用的时候简单的写一句checkout(userinfo)
就达到了同样的效果。
而具体的操作将在下文继续详解。
函数的语法结构
- 基础结构
def 函数名(): # 定义
函数体代码
函数名() # 调用
函数的定义与调用
-
定义:def后面跟函数名加括号冒号,下一行缩进开始写函数体代码。这个过程是定义。
这个过程也被描述为把函数体代码封装起来,函数带着功能属性。
-
调用:当我们想使用某个已经定义了的函数功能时,只需要用函数名加括号的形式就能使用,这个过程叫做调用。
三种进阶结构
在基本结构上,我们还可以加入参数和返回值得到另外三种结构
-
空函数结构
def 函数名(): pass # 指什么都不做
当我们在定义一个函数的时候,有时可能只是先确定一个大概的功能,但还没有具体的函数体代码,那我们就可以用pass执行一个空语句,这样做仅仅是为了补全代码结构,防止报错。
-
含参结构
def 函数名(参数): # 定义 函数体代码 函数名(对应参数) # 调用
当定义时,括号里有变量名,则这些变量为参数。
在调用阶段可以填入数据值,这些参数变量会以一定的方式接受变量。
-
含返回值结构
def 函数名(): # 定义 函数体代码 return 一个值 print(函数名()) # 调用函数,并打印返回值
这里先简单的书写一下结构,在后文再进行说明。
函数的返回值
什么是返回值
在我们学习内置方法pop时,我们称这种删除列表元素的方法成为‘弹出’
我们将pop()视为一个函数的话,那我们在执行完这个函数完得到的值就是返回值,这个返回值不仅能打印,如果是数字还能用于计算,等等。
l1 = [1, 2, 3, 4]
print(l1.pop()) # 4
# 执行了删除末尾元素的功能,并且拿到了这个元素,还能打印
print(l1.pop() + 6) # 9
# 第二次执行了删除末尾元素的功能,即拿到了3这个元素,与6进行加和,得到了9
返回值的实现 —— return
返回值的关键字是return,它只能在def下的函数体中使用。
-
函数体中可以没有return,视为没有返回值,或者返回值为None
-
函数体可以单独使用return,函数体代码的结束,返回值同样为None
def func(): print('我是函数体代码') print('看到我就结束了') return print('我应该是不会被打印的,你可以试试') func() ## 运行结果 我是函数体代码 看到我就结束了
-
return后可以跟一个数据值,返回值为这个数据值
def func(): return '我是返回值' print(func()) # 我是返回值
-
return后可以跟多个数据值(用逗号隔开),会自动将多个数据值组合为元组作为返回值
def func(): return 111, 222 ,333 print(func()) # (111, 222, 333)
总的来说,调用函数时,会执行到return之前的函数体代码,并得到一个返回值,这个返回值是return后面的数据值。
函数的参数
根据定义阶段,函数名()括号内部有没有变量,可以将函数分为无参函数和有参函数。
无参函数不必多说了,就是上文的基础结构函数。
而关于有参函数,我们要提出两个概念。
- 形参:形式参数,指定义阶段在括号里面的变量名,它们模拟变量参与代码的操作与运算
- 实参:实际参数,指调用阶段在括号里面的数据值,它们实际参与代码的操作与运算
# 例子
def my_sum(num1, num2): # num1和num2就是形参
print(num1,num2)
return num1 + num2
print(my_sum(1, 2)) # 这里括号里的1和2就是实参
## 运行结果
1 2
3
##
1.先是定义了函数my_sum,定义了形参num1,num2
2.调用了函数my_sum
3.传入了实参,1和2
4.执行函数体代码,打印了1和2
5.返回了两个参数的和,为3,由print打印了出来。
练习
将上一篇文章中的注册功能和登录功能封装为函数(定义并调用)
def register(): # 注册功能
while True:
# 输入用户名和密码
username = input('注册的用户名:')
password = input('请输入密码:')
# 判断用户名是否存在
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
user, pwd = line.strip().split('|')
if user == username:
print('用户名已经存在,请更换用户名')
break
else:
# 注册,把用户和密码存到文件里
with open(r'userinfo.txt', 'a', encoding='utf8') as f1:
f1.write(f'{username}|{password}\n')
print(f'用户{username}注册成功')
break
def login(): # 登录功能
while True:
# 输入用户密码
username = input('请输入用户名:')
password = input('请输入密码:')
# 核验密码登录
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
user, pwd = line.strip().split('|')
if user == username and pwd == password:
print('登录成功')
break
else:
print('用户名或密码输入错误,请重新输入')
break
while True:
choice = input('1注册|2登录|q退出:')
if choice == '1':
register()
elif choice == '2':
login()
elif choice == 'q':
break
else:
print('请输入有效的编号!')
标签:return,函数,python,语法,userinfo,print,返回值,True
From: https://www.cnblogs.com/Leethon-lizhilog/p/16773525.html