非程序员的编程之旅——Python基础篇(4)流程控制与异常处理

作者:李禹锋,重庆芝诺大数据分析有限公司数据挖掘工程师。

        前两篇知识性的东西太多了,不免有些枯燥无味,从流程控制开始,你会慢慢发现编程的乐趣。流程控制主要有条件判断和循环,异常处理对于程序老出错而又不爱看红字的同学来说是个福音。(老感觉是老师打了一把大×。。。)

本文导读:

01

条件判断

        在前文介绍布尔型变量时曾谈到过条件判断时布尔型变量使用最为频繁,条件判断也是决定一个程序逻辑最重要的一个部分。一个程序在运行时,需要有一个流程,就有如一个故事的发展有一个主线一样(多主线的同学麻烦避一下),有支线无所谓(之后讲到模块时会有支线程序的出现)。

        同样在编写一个程序的时候,总是希望自己一个程序能够解决更多的问题,而不是只针对解决一两个小问题,这一部分思想在下篇函数和类的介绍里面会突出讲解。目前讲解面向流程(面向流程和面向对象在下一篇里会详细讲解)的程序如何能够扩展自己的功能。

        实际上就是通过逻辑值的判断,来决定之后的程序如何来运行。例如在网络爬虫中经常会出现如下情况:需要爬取淘宝和天猫的商品信息(爱逛淘宝的同学应该都知道淘宝网里,淘宝的店铺和天猫的店铺是混合在一起的),但是淘宝和天猫商品的网页结构是不一样的,在进行网页解析的时候很难用一套通用的解析代码来进行提取,所以需要用两套解析代码,但如何确定什么时候用淘宝的解析代码,什么时候用天猫的解析代码?就是利用一个条件判断,如果URL(暂时理解成网址就行了)的前面部分字符是

“https://item.taobao.com”那么使用淘宝的解析代码,如果是

”https://detail.tmail.com”那么使用天猫的解析代码。(其实几乎每一种计算机语言都有这些东西,包括下一篇讲解的函数,之后讲解的模块,都是基础,也是核心,只要一门语言能够理解其精髓,其他语言可以很快上手,因为这些精髓都是相通的,也就是通常所说的计算机思维)

        在python中使用if  (elif)  else来进行条件判断。在if和elif后跟一个逻辑值,如果为真执行接下来的语句,如果为假执行else中的语句。在python中没有如Java的switch语句、SQL中的case  when语句,全部用elif来进行代替(效用等也同于其他一些语言的else if,因为就是一个简写)。

        再举一个例子,下面这种方式我在爬虫的时候经常会用到。可以爬的就执行try,不能爬的就执行except。

        很多教程中同样是利用数值大小的判断或字符串的匹配来讲解的,因为数值型、字符型的判断最为简单易懂,而且在很多时候用数值型、字符型的判断就已足够,同时适合初学者理解条件判断。但前文也说过,获取逻辑值的操作太多了,比如上半年闹得比较凶的勒索病毒(本质也是一个程序),它在感染一台电脑的时候就会进行一个检测:几个文件传输的端口是否开启(端口理解成一台电脑的多个USB接口就行了),倘若有开启的端口便会将勒索文件传到它的服务器并加密后返还(所以当时流传出来一个快速避免病毒感染的方法就是关闭自己电脑上那几个端口)。这其中进行检测的过程实际上就是一个获取逻辑值的过程,整个判断就是一个if  else的操作(虽然只是一个超简化过程,但核心思想不变)。

02

循环

        循环说白了就是把同样一个操作(或一系列操作),不停的重复执行。机械重复的工作对于计算机来说是很简单的一件事(这里的简单并不是指运行速度,而是指计算机理解起来很快,运行速度部分会在高级篇中涉及到)。

        Python中和绝大多数语言一样有两种循环,while循环和for循环。两种循环有些时候可以互通,while循环的理解是不停执行同一个操作,一直到预先设定的值为止,for循环的理解是将一个列表中的每个元素按照顺序执行同一个操作,列表元素遍历完了循环也就结束了。

        语法为while后跟逻辑判断或逻辑值。以下例子意思是初始化i为0,不停的打印出第几个元素小于10这句话,每次循环结束的时候i自增1.

        for循环后跟的值和其他语言有一些不同,语法为for 索引值 in 列表。这里的索引值其实是代表着每一次循环时列表中的一个元素,下一次循环时索引值会变成列表中的下一个元素,当然列表可以是一个用range和len函数生成如[0,1,2,3,…]的列表,这时候的索引值可以代表是第几次循环,其他语言中后面一种方式更常见,但在python中前一种方式操作更简便。(这个索引值在python中专业的说法叫做迭代变量,迭代的意思其实就是循环)

        上图第二个代码块中的序列为一个范围,其值为0到9十个数。

        以上方式是最基本的方式,关于更高深的迭代问题、迭代函数在以后的进阶篇里再做讲解(特别是算法的效率问题,可否优化迭代几乎决定了一个算法运算速度是否有提升空间)。除此之外while循环和for循环都有一些令人惊艳的操作,通常情况会结合if  else语句或下文的异常处理,而且还需要使用两个关键词。

continue跳过本次循环,执行下一次循环;

break:跳出整个循环。

具体操作拿代码来给大家体会一下。

        上图中第二个代码块中原本是一个死循环(执行到天荒地老都不会停止的循环),因为检测值永远都为真,但是在下面加上if语句的判断条件后可以在循环内部停止整个循环(也可以是检测到循环到特定值的时候,也就是说在if判断的条件里写也可以,如下图)。

        其结果是否和一个简易版的进度条相似,其实很多时候的进度条就是使用print函数打印出当前循环在整个循环中的位置,如果在打印出结果的时候,把上面几行的结果去掉就活生生是一个进度条了。

        for循环和while循环都有continue和break的使用,而且含义并没什么改变,可以下来之后自行尝试。

03

异常处理

十年生死两茫茫,写程序,到天亮。千行代码,Bug何处藏。纵使上线又怎样,朝令改,夕断肠。领导每天新想法,天天改,日日忙。相顾无言,惟有泪千行。每晚灯火阑珊处,程序员,又加班,工作狂T_T。

先来给大家补一个多行注释的妙用。

        没错,程序无bug是一种信仰,把我带到bug的身旁。做算法时程序的bug还比较容易调试,做网络爬虫时程序的bug,那种痛你们会有懂的那一天的(说好是非程序员的编程之旅,怎么自嘲程序员了?<---我们的定位是算法工程师,不是一般的程序员2333)。

        对于出现bug,有一个比较快速跳过问题代码的方法(但是没有从根本上解决程序的问题)。

        就是介个,python中采用try  except  else  finally关键词来定义。

        异常处理从理解上和之前讲述的条件判断有些相似,可以理解为程序不出错就为真,程序出错就为假,只是异常处理里的else意义和if语句中的else不同。尝试运行try后的代码,没有发生异常则执行else中的代码(如果有else的话),一旦出错立即跳转执行except中的代码(可对错误进行捕捉,特别是在网络编程中,捕捉错误后返回对应的操作是很常见的事,所谓自主优化代码,但是数据分析的时候要求尽可能在try里就执行正确,捕捉错误部分就略过),在执行完try或except中的操作后执行finally中的操作(不管执行的是try还是except)。

        前文说过元组类型数据无法添加元素,所以第四行代码原本应该是出错的,而且程序运行至此应该停止并报错,但可以看到结果中执行了第三行代码后直接跳转到except中执行之后的代码,程序并没有报错,最后还执行了finally中的代码。

        配合循环使用其实也很棒的,比如上文所述的while True的情况,如果你想一直运行到程序出错才停止,就可以采用这种方式。

        但是加上异常处理之后程序就不会出现error(其实每次看着报错都感觉会心惊胆颤的)。

        再举一个例子,下面这种方式我在爬虫的时候经常会用到。可以爬的就执行try,不能爬的就执行except。

小TIPS

04

        python的字符串中有一种叫做占位符的东西(也称为格式化字符),就跟拿一堆书去图书馆占位置是一样的东西,占位符就是指在一个字符串中,预先留下一些字符的位置,需要在之后的操作中将想要添加进字符串的信息添加上。

        较常用的占位符有三种,%s<---传入字符串、%d<---传入数字、%f<---格式化数字位数和小数位。主要有几点:

        1、单独使用的时候没有特殊含义;

        2、占位后传值的操作是在字符串结束后在后方加上一个“%”,并在“%”后跟上需要传入的值或表达式(必须能够计算得出值的表达式);

        3、一个字符串只有一个占位符,且后方不需要进行表达式运算的时候可以直接把需要传入的值添加在“%”后;

        4、一个字符串有多个占位符或需要传入的是一个表达式的计算结果,那么需要在“%”后用小括号括起来(传入的是一个元组)。

        至于表达式为什么要括起来,理解起来也比较简单,学过小学数学的都知道小括号里面的先算,括号外面的再算(程序里面并没有违背这些基本的数学规定)。在一开始讲解单值变量时,我将1==1的结果赋值给一个变量时,我也是用括号将1==1这个运算括起来的(先运算,运算结果为真),再进行赋值“运算”。不过其实赋值的时候,只有在计算逻辑值时要特殊一些,其他的运算优先级都是高于赋值的。

        最后一个重要的知识点,python的缩进问题。什么叫做缩进?上文中的程序,如果以前没有接触过python的朋友可能会自己输入了代码之后运行的时候老是出错。原因就在于python严格控制着缩进,每一次if语句下一行、循环语句下一行、try、except下一行都往后空了几格,而且同一级代码空的格数必须一致。有一个记忆的诀窍,每一次打冒号的下一行都要往后缩进一行,定义完该冒号下的代码后需要将缩进回复到和该代码一致(使用Jupyter的时候,每次打冒号的下一行会自动往后缩进,但是在定义结束之后不会往前删除缩进,这一部分需要人为删除)

        代码需要自己跟着写才能够学会,如果程序出错,那么先把程序尽可能的按照图中的方式编写,首先保证程序能够正常运行,下来之后再来寻找问题在何处。

        本节的知识有一些多,但是却正式进入编程有趣的地方了,所谓一个程序的逻辑就是靠着本节中的这些内容来控制,学习计算机编程不需要英语很好,不需要数学很好,但是比较需要一个严谨的逻辑思维,之前也说过程序实际上就是将一系列操作按照一定的顺序来执行,这个顺序就是逻辑。

人生苦短,我选python。

本系列会持续更新,如有想更深入学习和了解Python和R的可向公众号后台发布需求,后台小姐姐会及时通知作者。欢迎更多的小伙伴加入讨论相互学习。


      重庆芝诺大数据分析有限公司是国内首批大数据技术应用解决方案的专业服务提供商,是中国商业联合会数据分析专业委员会事务所会员单位。公司基于Apache Hadoop 框架,自主研发的大数据综合分析处理平台—Zeno Data Matrix平台,提供一站式大数据开发环境和工具,包括数据抓取、清洗、储存、分布式计算、分析挖掘及可视化应用的整体解决方案。快速部署,整合数据信息,盘活数据资产,为政府、企业的经营决策提供科学支撑。

     芝诺数据现拥有近20项自主知识产权的软件专利。拥有大数据综合分析处理平台(ZDM平台)、大数据教育(实训)平台、重庆市安全生产综合服务平台、四点半课堂等。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值