手把手教你学python3第十讲(‘花心’的else语句和with语句以及EasyGUI的使用)

8 篇文章 0 订阅
5 篇文章 0 订阅

如果图片出不来请去https://www.bilibili.com/read/cv266162,都是本人写的。

标题为什么是‘花心’的else语句呢?这是因为在python里else不仅可以和if搭配,还可以和while,for和上一讲学到的try搭配。

‘花心’的else语句

if和else搭配前面已经有很多例子了,就不再写了,下面就先说一下else和while搭配。如果while或者for语句循环结束,才会进入else里面。如果不是循环结束而是通过break跳出的循环,那么else里的语句就不会被执行。下面是一个求 最大约数的程序:



我们看到如果for循环完毕,for里面的数是从b//2开始的,因为最小的约数是2嘛(1不算约数好吧),减一直到2,注意,range后一个参数是达不到的,所以是1。如果for循环里的if条件判断一直不满足,也就不能break,我们才能进入else执行打印a是质数的命令。其实这个else语句我时可以用别的语句来替代的,只需要加一个变量n。这里我要插一点,其实如果让我写只判断一个数是不是质数的程序,应该是这样的。

1

里面pow(b.0.5)就是对b开平方。

你用b**0.5也行,就是让大家知道pow是什么用法,见到这么函数知道它是干什么的。

我来稍微解释一下我的这个质数的程序,一个正整数分解为两个数相乘,一定有一个数大于等于这个数的开平方,另一个数小于等于这个数的开平方,它们是一一配对的。就根据这个配对关系,我们只需要找2到int(b ** 0.5)即可,就找全了所有的对数。这样的效率明显比从b//2开始找高很多,虽然上面的问题不是单纯找指数,还要给出最大约数,但是我们可以灵活应用

2

你们都可以试一试结果是不是一样的。这样优化循环次数就少了很多。可能数字小看不出来效果,数字大的时候效率就差很多,因为b很大的时候b//2比b**0.5要大很多。

我加了一个n,n初始化为0(初始化可以按照你的想法任意初始化,但是必须和for下面

这个判断条件要匹配,比如我让n初始化为0,判断条件就是not n,才打印a是质数),如果for里面的if条件满足,也就是说b找到了约数,就让n=1,那么下面not in就是假,就不打印。但是这样只是很简单的情况,可能会有很复杂的情况,迫使你去使用和for或者while配套的else去完成一些操作或者说使用了和for或者while配套的else去完成这些操作会很简单,都是有可能的。所以说,else的这种用法还是值得我们去学习的。细心的小伙伴可能会发现,我上面12中代码有细微的不同,没错,1里面是没有用break的,2用了break,我这里也只是想说明编程是很灵活的,不一定非要用什么什么函数,其他方式也可以实现,只是效率不一样,用了break效率明显高很多,因为它会让程序提早跳出循环,执行的循环次数要少。我要再说一个东西,也就是有的时候我们会用到while 1这样永远循环的语句,你让else和它搭配是没有意义的,因为它要想循环结束,只能靠break,那么你后面搭配的else(注意一定是要和while 1搭配的else)里的语句永远不可能被执行的。拿上面一段程序为例


这个else里的c=1永远不会被执行,这个else是一条没有用的语句,还有你们要注意我这个else的缩进,它是和while1搭配的。我们实际上是可以把while 1语句改一改的,只需要加一个参数


我还是要提醒一点,m的初始化和满足跳出循环条件m的赋值和while 后面的条件要匹配,比如我初始化m=1,while 后面就是m,满足跳出循环的条件是m=0。那如果你初始化m=0,while后面就是not m,满足跳出循环的条件是m=1。这样做我就盘活了else,是else里面的语句可以被执行。

下面就讲一讲和try搭配的else,这种else是必须try里面的语句没有出现异常,才能进入到

else执行里面的语句。举个例子

men

我们看到else里的a=2没有被执行。下面对比

a=2被执行了。但是我还可以不用else

也是ok的啊,看过上一讲的朋友应该知道为什么可以写在那里。我还是那句话,你要有足够多的只是储备去应对现实中可能发生的无数种复杂情况,有些情况我们甚至想象不到的。

最后来说一下配对问题和顺序问题

对比

还有

说明else搭配也是就近原则,但是必须匹配最近的相同缩进等级的for 或者whil(当然如果有同缩进等级的if而且if是最近的,else就匹配到了if)。并且else必须是在for 和while语句之后。所以说else虽然花心,但是也只能一对一,2p,3p它都是玩不了的。下面是异常处理的顺序

首先说一个上一讲没有说到的,try是不能单独使用的,也就是说可以没有finally和else,但是try必须搭配一个或者多个except语句不然会报语法错误。

因为有异常,所以只有except和finally里的代码被执行。

没有报错,else和finally里面代码被执行。


else必须放在它搭配的try对应的所有except的后面。那么else和finally顺序如何?

else必须在try和except后面,finally前面。else就近原则这里也不讲了。和上面一样,还是强调缩进。

with语句

with不是花心的,花心只修饰else。我们来,想这样一个问题,每次打开一个文件最后都要加上close,不然可能会出错,是不是很烦。with就可以解决这个问题

如果是以前不用、with的时候,我们必须要加一个close,输入的内容才会被存进硬盘,现在with会自动为你关闭文件。但是你对这个文件的操作必须都在with的内部,否则会报错,因为文件已经关闭了嘛。除非你在外面再open一次,才能在with外面对这个文件进行操作。还有,你可以在with里面用close是不会报错的

你用with 尝试去打开一个不存在的文件也会报错




对比用了with的

所以说使用with是一种很好的方法,它让你不用担心忘记写close或者上面那种close没有被执行的情况,它会自动帮助你关闭文件以确保内容被保存在硬盘里,断电也不会丢失。

with还可以后面带多个文件。形式如下

这个地方是固定格式

在这里我要再吹一波异常,让你编一个简单的通讯录程序,输入一个联系人,如果通讯录没有这个联系人,就会打印输入错误,如果有,就打印出号码,通讯录以字典保存。

一般来说我们会这么写

事实上,这样的代码效率是不高的,因为程序会两次访问字典的键,一次判断是否存在(if a in t.keys()),一次打印出号码(print(a+...t[a]))。我们可以用异常处理提高代码效率,并且还能防止Ctrl+C和Ctrl+D带来的一些问题

红色的表示这一行有语法错误

异常类型必须加上括号

这些括号都是可以用过编译的,但是[]和{}实际运行时会发生

所以只能用小括号

ok的,我们用异常处理提高了代码的效率,虽然你写的代码长了那么一点,但是有些代码

不一定会运行的啊,没有异常就不会进入except。也就还多写了几个异常处理里的类型,但是用户体验好了啊,代码效率高了啊,如果多写代码可以使代码效率高,我宁愿多写几行,用我多写几行换取运行时间短,时间就是生命啊。

EasyGUI

什么是GUI?

图形用户界面的简称就是GUI。EasyGUI是一个比较简单的GUI,学习EasyGUI和我们前面学习BIF和内置方法是一样的,都是学习函数或者方法的参数类型,参数个数,参数位置,返回值。掌握了这些,你就掌握了EasyGUI。

大家一定要去看http://bbs.fishc.com/thread-46069-1-1.html。后面演示的时候上面有的就不讲了,比如说导入easygui模块的三种方法,上面都有,就不再重复了。

安装教程:

首先要调出命令行

输入cmd

回车

默认当前目录是C如果你把EasyGUI解压安装在别的盘,要先切换到别的盘。我是安装在D盘,输入D:,回车

然后切换到easygui的文件夹 ,输入cd easygui-0.96回车

就切换到了easygui-0.96文件夹里,你可以输入dir查看文件夹里的文件

我们要装的就是setup.py。

然后输入python.exe的路径加上setup.py最后加上install如下(我的python是安装在D盘里的)

就安装完毕了。安装在D:/python/Lib/site-packages里

然后就可以用了。

还不懂的可以去看https://www.bilibili.com/video/av4050443/index_36.html#page=36。

如何不用IDLE运行,避免冲突?

右键选择属性或者直接选择打开方式,选择Python Launcher那个就可以了。修改代码的时候你可以用记事本或者IDLE打开都是可以的。

我们看第一个例子

运行一下看看

点OK进入

选一个点OK,或者没有你的本名直接选Cancel


点OK

你可以点Continue继续或者Cancel退出

这个字体和框都可以修改,只需要到对应的内置方法源代码里去,我们看到那个选择框方法是

我们去找easygui.py里choicebox的代码,用记事本或者IDLE打开查找choicebox,一直点下一个直到进入choicebox函数的定义,推荐使用IDLE打开,因为代码颜色区分很好,看着舒服


一直点find next知道我们进入choicebox函数的定义

把这个root_width里的0.8改成0.4我们来试一下

比上面窄了,高和定位位置你都可以通过上面方法来修改。

改字体如何改呢?在find里输入PROPORTIONAL—FONT

修改PROPORTIONAL—FONT——FAMIILY后面的参数


你可以去对比,字体和上面是不一样的,只是差别很小。

其它的函数我相信你如果是前面的九讲都已经看过,上面那个中文文档应该不难看懂,里面代码实例和图都挺多的。我默认你现在已经看过了那个文档,下面我们来看几个实例。

我需要提醒一点


如果你在IDLE里导入一个模块,而在文件里没有导入,是会报错的,因为文件是不能够共享到IDLE里的代码,但是因为这个文件是在IDLE编译器里运行的,IDLE当然可以访问到文件的代码内容,前提是文件在IDLE里运行过,没运行过当然IDLE也不可能有这个py文件的信息。

文档里面有些地方可能有错误,比如

这个代码有问题,它只是想告诉你ccbox(cc就是continue和cancel的一个box)返回的是个布c尔值,

选continue返回1,选cancel返回的是0。不用太在意。

0.把前面猜数字的小游戏加上界面吧。


第一张图也可以用异常处理

运行结果我给你们看一下吧


只给大家展示一下猜三次的情况,中途退出的情况不展示了,你们可以自己打代码去试



1实现一个用于登记用户帐号信息的界面,带*的为必填项,要求一定要有输入并且不能是空格。

补充一个str.strip。strip最多一个参数,默认是空格,并且只去除左边和右边的空格,不去掉中间的空格。返回值为字符串,如果左边有2个空格,右边也有两个,用strip()都可以去除,需要注意的是如果最左边不是空格,左边的空格都不能被去掉。给参数就按照上面去空格的规律去给定字符。给定字符如果原字符串不存在不会报错,会原样返回原字符串。



点ok不会把原来填的清空而是还在

我们都填点数字

点OK

如果点NO原来信息也还是有的

如果点Yes

显示信息添加成功。

2.提供一个用户浏览框,打开用户所选择的文本文件,如果用户修改文件,提示用户覆盖保存,另存为或者取消保存。


我就不给你们演示整个运行过程了,情况太多,你们可以自己打代码试一试上面的程序。如果你看完了这个系列前面的所有讲解,还看完了那个中文文档,即使你可能暂时写不出来上面的代码,但是看懂应该是ok的。当然上面的代码不是完美无缺的(代码的bug我可以这么说永远是修不完的,看起来没有bug只是因为你还没有遇到更复杂的环境,没有遇到更皮的用户),比如Ctrl+C和Ctrl+D这样的异常没有处理还可,还可能会有格式不兼容的文件会有UnidodeDdcodeError(上一讲我们试着用普通打开方式打开一个pickle进磁盘的文件出现的就是这种异常),你也需要对这种进行异常处理,你可以自己尝试着加进去,。

3提供一个目录浏览框,统计用户选定的目录下的各种代码文件的个数和行数,给出总共的代码数



当然我没有写这么多行啊,有的是下载的,至于我写了多少,自行脑补。

这一讲4个例子源代码的百度云链接:https://pan.baidu.com/s/1sm0d1CD 密码:h06c

最后给大家推荐一个快捷键网站,里面有很多实用的快捷键哦

https://www.cnblogs.com/liyuanhong/articles/4375890.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值