python-study-10
上节课复习
上节课复习: 文件部分: 1、文件指针的移动 都是按照字节为单位 f.seek(3,0) f.seek(3,1) f.seek(-3,2) f.read(3) #t模式read是以字符为单位只有这一个特殊 f.tell() #文件开头到当前位置的指针距离 f.flush() #内存立刻刷到硬盘 2、文件的修改 文件在硬盘上都是用新内容覆盖旧内容,根本没有修改这么一说 但是内存中的数据是可以修改的,所以我们想要改文件,只能将文件内容 读入内存后才能修改,改完再刷回硬盘,具体的操作分2种 方式1: 1、把文件内容一次性全读入内存 2、在内存中修改完毕 3、写入硬盘 方式2: 1、循环读取文件的每一行内容 2、把每一行内容修改后写入一个新的文件,周而复始直到源文件全部读取完毕 3、删除原文件,将新文件重命名为原文件名 函数部分: 1 什么是函数? 2 为什么要用函数? 减少代码冗余 增强程序的扩展性 增强程序的结构性与可读性 3 函数的分类 自定义函数def 内置函数 4 如何自定义函数 语法 def 函数名(参数1,参数2,。。。): '''文档注释''' code1 code2 .... return 值 定义有参数函数,及有参函数的应用场景 定义无参数函数,及无参函数的应用场景 定义空函数,及空函数的应用场景 今日内容:调用函数 1、如何调用函数 2、函数的返回值 3、函数参数的应用 1、形参和实参 2、参数详解 位置参数 关键字参数 默认参数 *args,**kwargs
函数的返回值
1、什么是返回值 返回值是一个函数的处理结果, 2、为什么要有返回值 如果我们需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须有返回值 3、函数的返回值的应用 函数的返回值用return去定义 格式为: return 值 注意: 1、return是一个函数结束的标志,函数内可以有多个return, 但只要执行一次,整个函数就会结束运行 2、return 的返回值无类型限制,即可以是任意数据类型 3、return 的返回值无个数限制,即可以用逗号分隔开多个任意类型的值 0个:返回None,ps:不写return默认会在函数的最后一行添加return None 1个:返回的值就是该值本身 多个:返回值是元组
调用函数
1 什么是调用函数 函数名(...)即调用函数,会执行函数体代码,直到碰到return结束或者一直运行完毕所有代码 2 为何要调用函数 用函数的功能 3、函数调用分为三种形式 max2(1,2) res=max2(3000,2000) * 12 res=max2(max2(1000,2000),3000) def max2(x,y): if x > y: return x else: return y形式一:max2(1,2)形式二:res=max2(3000,2000) * 12print(res)形式三:res=max2(max2(1000,2000),3000)print(res)
函数的参数
总的分类:#1、形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名def foo(x,y): #x=1,y=2 print(x) print(y)#2、实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参,本质就是变量的值foo(1,2) 详细的分类:一、位置参数:位置形参:在函数定义阶段,按照从左到右的顺序依次定义的形参,称之为位置形参特点:但凡是按照位置定义的形参,都必须被传值,多一个不行,少一个也不行def foo(x,y): print('x:',x) print('y:',y) 位置实参:在函数调用阶段,按照从左到右的顺序依次定义的实参,称之为位置实参特点:按照位置为对应的形参依次传值foo(1,2)foo(2,1) 二、关键字实参:在调用函数时,按照key=value的形式为指定的参数传值,称为关键字实参特点:可以打破位置的限制,但仍能为指定的形参赋值foo(y=2,x=1) 注意:1、可以混用位置实参与关键字实参,但位置实参必须放在关键字实参的前面foo(1,y=2)foo(y=2,1) #SyntaxError: positional argument follows keyword argument 2、可以混用,但不能对一个形参重复赋值foo(1,y=2,x=10) 三:默认参数:在函数定义阶段,就已经为形参赋值,该形参称为默认形参特点:在定义阶段就已经被赋值,意味着在调用可以不用为其赋值,如果赋值则按赋值的来def foo(x,y=10): print('x:',x) print('y:',y) foo(1) #输出1,10foo(1,3) #输出1,10注意:1、位置形参必须放到默认形参的前面,否则报语法错误def foo(x=1,y): pass 2、默认参数的值只在定义阶段赋值一次,即默认参数的值在函数定义阶段就已经固定死了 m=10def foo(x=m,y=11): print(x) print(y)m=1111111111111111111111111111111111111111111111111111111111foo() 3、默认参数的值通常应该定义不可变类型 def register(name,hobby,hobbies=[]): hobbies.append(hobby) print('%s的爱好' %name,end=':') print(hobbies) register('egon','play')register('alex','piao')register('lxx','烫头') def register(name,hobby,hobbies=None): if hobbies is None: hobbies=[] hobbies.append(hobby) print('%s的爱好' %name,end=':') print(hobbies) register('egon','play')register('alex','piao')register('lxx','烫头') 总结:实参的应用:取决于个人习惯,形参的应用:1、位置形参:大多数情况下的调用值都不一样,就应该将该参数定义成位置形参2、默认形参:大多数情况下的调用值都一样,就应该将该参数定义成默认形参def register(name,age,sex='male'): print(name) print(age) print(sex) register('egon',18,)register('大脑门',73,'female')register('小脑门',84,)register('大高个',18,) 四:可变长参数:指的是在调用函数时,传入的参数个数可以不固定而调用函数时,传值的方式无非两种,一种位置实参,另一种时关键字实参所以对应着,形参也必须有两种解决方案,来分别接收溢出的位置实参(*)与关键字实参(**) 1、形参中某个参数带*形参中的*会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给*后的变量名def foo(x,y,*z): #x=1,y=2,z=(3,4,5,6,7) print(x) print(y) print(z)foo(1,2,3,4,5,6,7) 应用def my_sum(*nums): res=0 for num in nums: res+=num return res print(my_sum(1,2,3,4,5)) 2、实参中的参数也可以带*实参中带*,*会将该参数的值循环取出,打散成位置实参ps:以后但凡碰到实参中带*的,它就是位置实参,应该立马打散成位置实参去看def foo(x,y,z): print(x,y,z) foo(1,*[2,3]) #foo(1,2,3)foo(1,*'he') #foo(1,'h','e')foo(1,*(2,3,4)) #foo(1,2,3,4) def foo(x,y,z,*args): print(x) print(y) print(z) print(args) foo(1,2,3,4,5,6,7,*[8,9,10,11]) #foo(1,2,3,4,5,6,7,8,9,10,11)注意:约定俗成形参中的*变量名的写法都是:*args 1、形参中某个参数带**形参中的**会将溢出的关键字实参全部接收,然后存储字典的形式,然后把字典赋值给**后的变量名def foo(x,y,**z): #x=1,y=2,z={'c':5,'b':4,'a':3} print(x) print(y) print(z)foo(1,2,a=3,b=4,c=5) 2、实参中的参数也可以带**,该参数必须是字典实参中带**,**会将该参数的值循环取出,打散成关键字实参ps:以后但凡碰到实参中带**的,它就是关键字实参,应该立马打散成关键字实参去看def foo(x,y,z): print(x) print(y) print(z) foo(1,2,**{'a':1,'b':2,'c':3,'z':3}) #foo(1,2,c=3,b=2,a=1,z=3)foo(**{'z':3,'x':1,'y':2}) #foo(y=2,x=1,z=3) 注意:约定俗成形参中的**变量名的写法都是:**kwargs def index(name,age,sex): print('welecome %s:%s:%s to index page' %(name,age,sex)) def wrapper(*args,**kwargs): #args=(1,),kwargs={'x': 1, 'y': 2, 'z': 3} index(*args,**kwargs) #index(*(1,),**{'x': 1, 'y': 2, 'z': 3}) #index(1,x=1,y=2,z=3) wrapper(name='egon',sex='male',age=18) 五 命名关键字形参:在函数定义阶段,*后面的参数都是命名关键字参数(**)特点:在传值时,必须按照key=value的传,并且key必须命名关键字参数指定的参数名def register(x,y,z,**kwargs): #kwargs={'b':18,'a':'egon'} if 'name' not in kwargs or 'age' not in kwargs: print('用户名与年龄必须使用关键字的形式传值') return print(kwargs['name']) print(kwargs['age'])register(1,2,3,a='egon',b=18) def register(x,y,z,*args,name='egon',age): print(args) print(name) print(age)register(1,2,3,4,5,6,7,age=18) def foo(x,y=1,*args,z=1,a,b,**kwargs): pass foo(1,*[1,2,3],a=1,**{'x':1,'y':2}) #foo(1,1,2,3,a=1,y=2,x=1) foo(1,2)foo(x=1,y=2) open('a.txt','w',encoding='utf-8')
# 形参:位置,默认# 实参:位置,关键字# 可变长参数: 形参(* **) 实参(* **)
作业
函数作业: 1、复习函数参数的使用 2、实现如下功能 编写用户注册函数,实现功能 1、在函数内接收用户输入的用户名、密码、余额 要求用户输入的用户名必须为字符串,并且保证用户输入的用户名不与其他用户重复 要求用户输入两次密码,确认输入一致 要求用户输入的余额必须为数字 2、要求注册的用户信息全部存放于文件中
def func():tag = True# 取出当前文件所有的用户名,用于判断后面用户是否已经存在name_line = []with open('db', 'rt', encoding='utf-8') as f_db:for line in f_db:line = line.strip('\n').split(':')name_line.append(line[0])while tag:# 验证注册用户名的合法性name_inp = input('username>>: ').strip()if not name_inp.isalpha():print('用户名必须全是字符')continueif name_inp in name_line:print('用户名已注册')continuewhile tag:# 验证密码的合法性pwd_inp = input('password>>: ')pwd_inp_chk = input('password>>: ')if pwd_inp != pwd_inp_chk:print('两次密码不一致')continuewhile tag:# 验证余额的合法性balance = input('balance>>: ').strip()if not balance.isdigit():print('必须为整数')continue# 以上条件全成立,则写入文件with open('db', 'at', encoding='utf-8') as f_info:f_info.write('%s:%s:%s\n' % (name_inp, pwd_inp, balance))print('注册成功')tag = False func()
View Code
编写用户转账函数,实现功能 1、传入源账户名(保证必须为str)、目标账户名(保证必须为str)、转账金额(保证必须为数字) 2、实现源账户减钱,目标账户加钱
def func_transfer():import ostag = True#取出当前文件内所有的用户名,用于后面判断账号名是否存在line_name = []with open('db', 'rt', encoding='utf-8') as f_name:for line in f_name:line = line.strip('\n').split(':')line_name.append(line[0])while tag:#验证转出账号名的合法性name_s = input('转出账户名>>: ').strip()if not name_s.isalpha():print('必须为纯字母')continueif name_s not in line_name:print('转出账户名不存在')continue#取出此账号名转账前的账号余额,用于后面判断后面转账金额是否足够with open('db','rt',encoding='utf-8') as f_b:for line in f_b:line = line.strip('\n').split(':')if name_s == line[0]:balance = line[2]balance = int(balance)print('当前余额:%s' %balance)while tag:#验证转入账号名的合法性name_d = input('转入账户名>>: ')if not name_d.isalpha():print('必须为纯字母')continueif name_d not in line_name:print('转出账户名不存在')continuewhile tag:#验证转账金额是否充足transfer_amount = input('转账金额>>: ')if not transfer_amount.isdigit():print('转账金额必须为整数')continuetransfer_amount = int(transfer_amount)if transfer_amount > balance:print('余额不足,从新输入')continue#上面的条件都符合,则修改文件with open('db','rt',encoding='utf-8') as read_f,\open('db.swap','wt',encoding='utf-8') as write_f:for line in read_f:line = line.strip('\n').split(':')if name_s == line[0]:line[2] = int(line[2]) - transfer_amountline[2] = str(line[2])if name_d == line[0]:line[2] = int(line[2]) + transfer_amountline[2] = str(line[2])line_new = ':'.join(line)line_new = line_new +'\n'write_f.write(line_new)os.remove('db')os.rename('db.swap','db')print('转账完成')tag = False func_transfer()
View Code
编写用户验证函数,实现功能 1、用户输入账号,密码,然后与文件中存放的账号密码验证 2、同一账号输错密码三次则锁定 3、这一项为选做功能:锁定的账号,在五分钟内无法再次登录 提示:一旦用户锁定,则将用户名与当前时间写入文件,例如: egon:1522134383.29839 实现方式如下: import time current_time=time.time() current_time=str(current_time) #当前的时间是浮点数,要存放于文件,需要转成字符串 lock_user='%s:%s\n' %('egon',current_time) 然后打开文件 f.write(lock_user) 以后再次执行用户验证功能,先判断用户输入的用户名是否是锁定的用户,如果是,再用当前时间time.time()减去锁定的用户名后 的时间,如果得出的结果小于300秒,则直接终止函数,无法认证,否则就从文件中清除锁定的用户信息,并允许用户进行认证
import time import osname_info = [] with open('db','rt',encoding='utf-8') as f0:for line0 in f0:line0 = line0.strip('\n').split(':')name_info.append(line0[0]) # print(name_info) lock_users = [] with open('db_lock','rt',encoding='utf-8') as f_lock:for line1 in f_lock:line1 = line1.strip('\n').split(':')lock_users.append(line1[0]) # print(lock_users) tag = True while tag:name_inp = input('username>>: ').strip()if name_inp not in name_info:print('用户名不存在')continueif name_inp in lock_users:current_time = time.time()# print('用户已被锁定')with open('db_lock', 'rt', encoding='utf-8') as f_lock_time:for line2 in f_lock_time:line2 = line2.strip('\n').split(':')if name_inp == line2[0]:name_lock_time = line2[1]name_lock_time = float(name_lock_time)# print(name_lock_time,type(name_lock_time))valid_time = current_time - name_lock_time#时间戳差值转为秒if valid_time < 300:print('锁定状态')tag = Falseelse:with open('db_lock','rt',encoding='utf-8') as f3,\open('db_lock.swap','wt',encoding='utf-8') as f4:for line3 in f3:line3_new = line3.strip('\n').split(':')if name_inp != line3[0]:f4.write(line3)os.remove('db_lock')os.rename('db_lock.swap','db_lock')with open('db', 'rt', encoding='utf-8') as f1:for line in f1:line = line.strip('\n').split(':')if name_inp == line[0]:name_pwd = line[1]breakcount = 1while count <= 3:pwd_inp = input('password>>: ')if pwd_inp == name_pwd:print('验证成功')tag = Falsebreakelse:print('密码错误')count += 1if count == 4:current_time = time.time()current_time = str(current_time)lock_user = '%s:%s\n' % (name_inp, current_time)with open('db_lock','at',encoding='utf-8') as f2:f2.write(lock_user)print('%s 用户已被锁定五分钟' %name_inp)tag = False
View Code
明日默写: 1、什么是形参?什么是实参?形参与实参的关系是什么?
形参:在函数定义阶段括号内定义的参数,称之为形式参数,简称形参,本质就是变量名实参:在函数调用阶段括号内传入的值,称之为实际参数,简称实参,本质就是变量的值形参即变量名,实参即变量值,函数调用时,将值绑定到变量名上,函数调用结束,解除绑定
2、介绍所有形参与实参及其特点
1、位置参数:按照从左到右的顺序定义的参数位置形参:必选参数位置实参:按照位置给形参传值 2、关键字参数:按照key=value的形式定义的实参无需按照位置为形参传值注意的问题:1. 关键字实参必须在位置实参右面2. 对同一个形参不能重复传值 3、默认参数:形参在定义时就已经为其赋值可以传值也可以不传值,经常需要变得参数定义成位置形参,变化较小的参数定义成默认参数(形参)注意的问题:1. 只在定义时赋值一次2. 默认参数的定义应该在位置形参右面3. 默认参数通常应该定义成不可变类型 4、可变长参数:可变长指的是实参值的个数不固定而实参有按位置和按关键字两种形式定义,针对这两种形式的可变长,形参对应有两种解决方案来完整地存放它们,分别是*args,**kwargs 5、命名关键字参数:*后定义的参数,必须被传值(有默认值的除外),且必须按照关键字实参的形式传递 可以保证,传入的参数中一定包含某些关键字
View Code
转载于:https://www.cnblogs.com/xujinjin18/p/9145357.html
python-study-10相关推荐
- python 堆叠柱状图 多列 复杂_[Python Study Notes]堆叠柱状图绘制
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- Python 3.10来了!!!
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨机器之心 编辑丨极市平台 导读 不用再自己琢磨如何实现 swi ...
- 2019学习Python的10个原因
如果你经常关注我,那你可能想知道为什么我要写一篇文章来告诉你们学习Python?但是几年前我曾向你们说过Java比Python更具有优势,哦,这就尴尬了,但确实,这几年情况有所改变,在2016年,Py ...
- 刚刚,Python 3.10 正式发布了,我发现了一个可怕的功能..
就在( 2021年10月4日) Python 终于正式发布了 3.10 版本,看了下这个版本的一些特性,最受关注的应该就是 结构模式匹配 了吧?也就是大家所熟悉的 switch-case ,写错了不好 ...
- 独家 | Python 3.10发布——你应该知道的五大新特性
作者:Varun Singh 翻译:欧阳锦校对:王可汗本文约1700字,建议阅读5分钟 本文为大家介绍了新版本Python的新特性. 图片来源:Canva--由Varun Singh编辑 我们都知道P ...
- Python 3.10的几个好用的新特性
来源:Deephub Imba本文约1200字,建议阅读5分钟 本文为你介绍Python 3.10新的有用的特性. 3.10版没有添加新的模块,但是引入了很多新的并且有用的特性.让我们来一起看看吧. ...
- python 3.10 新增 switch-case 简介
目录 01 通用语法 02 在元组中运用 03 类(class) 04 if 子句模式 05 复杂模式和通配符 01 通用语法 Switch 语句存在于很多编程语言中,早在 2016 年,PEP 31 ...
- 【Python】刚刚,Python 3.10 正式发布了!我发现了一个可怕的功能...
就在2021年10月4日, Python 终于正式发布了 3.10 版本,看了下这个版本的一些特性,最受关注的应该就是 结构模式匹配 了吧?也就是大家所熟悉的switch-case,写错了不好意思,是 ...
- 【Python】利用Conda尝鲜Python 3.10
1 简介 就在几天前,Python3.10的第一个正式版本3.10.0发布,之前我们只是从其各个测试版本中捕风捉影地知晓了一些可能加入的新特性,而在正式版本中,我们得以一睹其正式加入的诸多新特性. 本 ...
- 利用Conda尝鲜Python 3.10
来自公众号:Python大数据分析 1 简介 就在几天前,Python3.10的第一个正式版本3.10.0发布,之前我们只是从其各个测试版本中捕风捉影地知晓了一些可能加入的新特性,而在正式版本中,我们 ...
最新文章
- Re: 求助:5道算法题
- Flutter UI自动化测试技术方案选型与探索
- 加入新的地方,要开始积累了
- Linux根文件系统结构再认识
- git push命令_Git Push命令解释
- LINUX系统服务总结之三:nis服务器全集
- JAVA如何选中一行上移_js操作table中tr的顺序实现上移下移一行的效果
- qmail 发邮件故障
- python建模与仿真控制系统_系统建模与仿真
- 学校老师要求微信群里的家长下载钉钉建群,解散微信群,钉钉是不正当商业竞争吗?
- Arch LInux | 网络管理工具iproute2(网络接口、ip地址、路由表)
- 虚拟机运行python_《虚》字意思读音、组词解释及笔画数 - 新华字典 - 911查询
- c语言编程利用泰勒级数,C语言程序设计:用泰勒级数计算cos
- 2017年迪培思昆明国际广告标识及LED照明展会刊(参展商名录)
- [python][IDLE]IDLE使用说明文档
- 利用go语言创建钱包并遍历钱包(wallet)
- Java入门(四)JAVA SE 02
- 来钱快的3种副业,虽然不起眼,不过很赚钱
- phonegap 修改app的名称
- 邮件发送-JavaWeb
热门文章
- 18岁参加工作,工龄30年
- 微商人赚钱的4个落地动作
- 直播电商要处理好五个关系
- 最近我一个朋友在职场上陷入了迷茫
- 互联网公司大厂中厂小厂分别指哪些公司?
- 计算机网络class1(概念、组成、功能和分类)
- windows上cppcheck检查不出任何错误解决
- [leetcode] 24. Swap Nodes in Pairs
- mysql交互式查询_客户机程序5―MYSQL交互式查询程序[图]_MySQL
- dmv 统计数据库io_使用内置功能和动态管理视图(DMV)发现特定于数据库的信息