今日内容之8月18日

函数(中)与封装

概要

* 函数的返回值

* 函数的类型

* 函数的参数

* 注册登录功能用函数封装

* 常见的内置函数

详情

函数的返回值

返回值是函数执行完后得到的结果,表示如下
def index():
    print('return')
    return      # 返回值可为空
    print('return')# 在return后面,不执行

变量可通过变量名和赋值号的方式获取返回值。
    #变量名 = 函数()
    需要注意的有以下几点
    1.函数没有return关键字,默认返回空即None
    2.函数的返回值在return后面
    3.若return后有多个参数,会组合成元组的形式返回,见1
    4.函数体遇到return会结束整个函数的运行,见图2

image

​ 图1.返回值有多个

image

​ 图2.返回值为空

*补充:1.函数在定义阶段(def)只检测函数体的语法不执行代码。

​ 2.函数在调用阶段(函数名())若定义参数则调用时必须传递参数给函数。


函数的类型

1.无参函数:未定义参数,调用时不传递参数

def func():
    print('This is a function.')
func()

2.有参函数:定义了参数,调用需要传递正确的参数

def func(x):    #参数个数需一致
    print('This is a function.',x)
func(0)         #参数为0,打印This is a function. 0

3.空函数:没有详细的函数体,用于补全格式

def func():
    pass
print(func())   #打印None

函数的参数

1.形参与实参的关系

形参:函数的形式参数为定义阶段括号内书写的变量名。
实参:函数的实际参数为调用阶段传递给括号内变量名的值。
    #调用函数时两者绑定,函数运行结束以后分开
def index(name):   #这里name是形参
    print(name)
index('Jack')      #这里Jack是实参

2.参数类型

1.位置参数:按照位置一一对应传递参数,数量必须相同,不多不少
	def index(x,y)
    	print(x,y)
#错误情况
	index()               #定义了参数,调用必须赋值
	index(1)              #数量缺少
	index(0,1,2,3,4,5)    #数量过多

2.关键字参数:根据关键字给形参传递参数,顺序可换
 eg:index(x=0,y=1)或index(y=1,x=0)均可

3.默认参数:函数定义阶段给形参赋值
    def register(name,age,gender ='male'):
        print(name,age,gender)
#例如在阳盛阴衰的理科班信息表可以预先给性别赋值为男性

4.可变长参数:打破函数对参数个数的限制,使用更为灵活多变
    #接收多余的位置参数组合成元组的形式赋值给*后面的变量名
    def func(a,*b):
        print(a,b)
    func(1,2,3,4,5,6)

    #接收多余的关键字参数组合成字典的形式赋值给**后面的变量名
    def func(a,**b):
        print(a,b)
    func(0,q=1,w=2,e=3,r=4,d=5,f=6)

'''无论接收多少个位置参数还是关键字参数都可以正常运行的函数格式如下:'''
def func(*a, **b):
    print(a, b)
#此类函数一般形参中的可变长参数用*args,**kwargs表示

image
图3.可接受不定项位置参数或关键字参数的可变长参数一般表达
3.*与**在实参中的作用

list = ['aa','bb','cc','dd']
dic = {'name':'FengHuaXueYue','age':18,'hobby':'write'}
def func(*args,**kwargs):
    print(args,kwargs)
#  *会将列表/元组内的元素散装成多个位置参数分别传递给函数
func(*l)等价于func('aa','bb','cc','dd')
#  **会将字典内的元素散装成多个位置参数分别传递给函数
func(**d)等价于func(name='FengHuaXueYue',age=18,hobby='write')

注册登录功能用函数封装

大致的思路:

​ 1.def关键字和函数名

​ 2.缩进代码

​ 3.查看内部还需要哪些数据

​ 4.将以上数据在形参中定义

'''注册'''
'''注册'''
def register():
    #1.获取输入的用户信息,并提取用户名
    userInfo = getUserInfo()
    userName = userInfo[0]
    passwd = userInfo[1]
    #2.校验用户名是否重复,重复需重新输入
    if isUserNameRepeated(userName):
        return False
    #3.未发现重复的用户名,写入用户信息
    with open(r'userInfo.txt', 'a', encoding='UTF-8') as f:
        f.write('{}|{}\n'.format(userName, passwd))
        print('用户{}注册成功!'.format(userName))
    return True
'''登录'''
def login():
    #1.获取输入的用户信息,并提取用户名
    userInfo = getUserInfo()
    userName = userInfo[0]
    passwd = userInfo[1]
    #2.只读模式打开用户信息文件
    with open(r'userInfo.txt', 'r', encoding='UTF-8') as f:
        #3.逐行比对,切割数据
        for line in f:
            realName, realPasswd = line.split('|')
            #4.校验有无用户的用户名与密码均和输入的相同
            if userName == realName and passwd == realPasswd.strip('\n'):
                print('用户{}登录成功!'.format(userName))
                return True
    print('用户名或密码错误!')
    return False

常用的内置函数

eg:
abs(-111)              #返回参数的绝对值
all({1,2,3})           #元素中有布尔值为False返回False,否则返回True
any({1,2,0})           #元素中有布尔值为True返回True,否则返回False
chr(65)                #返回Ascii码中数字对应的字符,此处为'A'
callable()             #判断变量是否可被调用即是否为函数   

​ .format()与%s类似,定义字符串的格式

print('name : {} || age : {}'.format('HuaHua',18))
#按位置给参数赋值,顺序可打乱
print('is {0} {1} {1} and is {1} {0}'.format('HuaHua',18))             
#按关键字给参数赋值,顺序可打乱
print('{name} {age}{name}  and {age}'.format(name='HuaHua',age=18))  

image

​ 图4.给参数赋值

image

​ 图5.按位置给参数赋值,顺序可打乱

image

​ 图6.按关键字给参数赋值,顺序可打乱


作业

1.注册、登录用户信息表优化3.0版本


'''获取用户信息'''
def getUserInfo():
    '''获取用户信息'''
    userName = input('请输入用户名>>>').strip()
    passwd = input('请输入密码>>>').strip()
    uPlusP = [userName, passwd]
    return uPlusP

'''校验用户名是否重复'''
def isUserNameRepeated(userName):
    #1.只读模式打开用户信息文件
    with open (r'userInfo.txt', 'r', encoding='UTF-8') as f:
        #2.逐行比对用户名是否与输入的相同
        for line in f:
            realName = line.split('|')[0]
            #3.存在相同的用户名,打印提示并结束校验
            if userName == realName:
                print('用户名已存在,请重新输入!')
                return True
    return False
'''注册'''
def register():
    #1.获取输入的用户信息,并提取用户名
    userInfo = getUserInfo()
    userName = userInfo[0]
    passwd = userInfo[1]
    #2.校验用户名是否重复,重复需重新输入
    if isUserNameRepeated(userName):
        return False
    #3.未发现重复的用户名,写入用户信息
    with open(r'userInfo.txt', 'a', encoding='UTF-8') as f:
        f.write('{}|{}\n'.format(userName, passwd))
        print('用户{}注册成功!'.format(userName))
    return True

'''登录'''
def login():
    #1.获取输入的用户信息,并提取用户名
    userInfo = getUserInfo()
    userName = userInfo[0]
    passwd = userInfo[1]
    #2.只读模式打开用户信息文件
    with open(r'userInfo.txt', 'r', encoding='UTF-8') as f:
        #3.逐行比对,切割数据
        for line in f:
            realName, realPasswd = line.split('|')
            #4.校验有无用户的用户名与密码均和输入的相同
            if userName == realName and passwd == realPasswd.strip('\n'):
                print('用户{}登录成功!'.format(userName))
                return True
    print('用户名或密码错误!')
    return False

'''用户信息系统   Ver.3.0'''
dict = {'1':register, '2':login}
while True:
    print('用户信息系统   Ver.3.0\n'
                '1.注册\n'
                '2.登录'
          )
    choice = input('请输入想要执行的功能>>>').strip()
    if choice in dict:
        funcName = dict.get(choice)
        funcName()
    else:
        print('此功能不存在,请重新输入!')
posted @ 2021-08-18 22:17  Leguan001  阅读(47)  评论(0)    收藏  举报