Python流程控制和导入模块语句详解
off999 2024-10-02 18:41 25 浏览 0 评论
一、流程控制语句
1.程序结构
计算机在解决问题时,分别是顺序执行所有语句、选择执行部分语句、循环执行部分语句,分别是:顺序结构、选择结构、循环结构。如下图:
2.选择语句
2.1最简单的if语句
Python使用保留字if来组成选择语句,其格式如下:
if 表达式:
代码块
表达式可以是一个单纯的布尔值或者变量,也可以是比较表达式或者逻辑表达式,如果表达式值为真,则执行“代码块”;如果值为假,就跳过“代码块”,执行后面语句,如图
注:1.在Python中,当表达式的值为非零的数或者非空的字符串时,if语句也认为是条件成立(即为真值)。
·· 2.使用if语句时,如果只有一条语句,那么语句块可以直接写到冒号“:”的右侧。但为了代码可读性不建议这么做。
3.常见错误:
1.if语句后面未加冒号
number = 3
if number == 3 #后面未加冒号,正确的是结尾处添加英文半角的冒号:if number == 3:
print(number)
2.使用if语句时,如果在符合条件时,需要执行多个语句,一定要记得按照逻辑顺序进行代码缩进,否则程序的本意会有变化,但程序不会报错,且bug不容易发现。
代码1:
number = 3
if number == 3:
print(number)
print('这个是5')
代码2:
number = 3
if number == 3:
print(number)
print('这个是5'
2.2.if …… else 语句
Python中提供 if …else 语句来解决两个选择问题,其格式如下:
if 表达式:
语句块1
else:
语句块2
使用 if …else 语句时, 表达式可以是一个单纯的布尔值或者变量,也可以是比较表达式或者逻辑表达式,如果表达式值为真,则执行“代码块”;如果值为假,执行else后面的代码块。如图所示:
技巧:
if…else额语句可以使用条件表达式进行简化,如下:
a = 5
if a > 0:
b = a
else:
b = -a
print(b)
简化:
a = 5
b = a if a > 0 else -a
print(b)
注:1. 在使用else 语句时,else一定不可以单独使用,它必须和保留字if一起搭配使用。
2.程序中使用if…else 语句时,如果出现多个if 语句多余else语句的情况,那么该else语句将会根据确定该else 语句属于哪个if语句。
2.3.if…elif…else语句
在开发程序时遇到多选一的情况,则可以使用if …elif…else语句,具体情况如下:
if 表达式1:
语句块1
elif 表达式2:
语句块2
elif 表达式3:
语句块3
…
else:
语句块n
使用 if …elif…else 语句时, 表达式可以是一个单纯的布尔值或者变量,也可以是比较表达式或者逻辑表达式,如果表达式值为真,则执行语句;如果值为假,则跳过该执行语句,进行下一个elif判断,只有表达式全部为假的情况下,执行else后面的代码块。如图所示:
注:1. if 和 elif 都需要判断表达式的真假,而 else 则不需要判断;另外 elif 和 elif 都需要跟 if 一起使用,不能单独使用。
2. 使用if语句时尽量遵循以下原则:
(1).当使用布尔类型的变量作为判断条件时,假设布尔类型变量为flag,较为规范格式;
if flag: #表示为真
if not flag #表示为假
不符合规范格式:
if flag == True:
if flag == False:
(2).使用 " if 1 == a: " 这样的书写格式可以防止错写成 " if a = 1: "这种形式,从而避免出错
2.4 if 语句的嵌套
前面已经介绍了3种形式的 if 语句,这三种都可以进行相互嵌套:
(1) . 在最简单的if语句中嵌套 if……else语句,形式如下:
if 表达式1:
if 表达式2:
语句块1
else:
语句块2
(2). 在if……else中嵌套 if……else 语句,形式如下:
if 表达式1:
if 表达式2:
语句块1
else:
语句块2
else:
if 表达式3:
语句块3
else:
语句块4
注:if 选择语句可以有多种嵌套方式,开发时可以可以根据自身的需要进行选择合适的嵌套方式,但一定要严格控制好不同级别代码的缩进量。
3.条件表达式
在程序开发过程中,经常会根据表达式的结果,有条件的进行赋值,例如返回最大值:
a = 6
b = 3
if a > b:
c = a
else:
c = b
针对以上代码,使用条件表达式进行简化,如下:
a = 6
b = 3
c = a if a > b else b
4.循环语句
4.1 while 循环
while循环是通过一个条件来控制是否要继续反复执行循环体(循环体是指一组被重复执行的语句)中的语句。
while 条件表达式:
循环体
当条件表达式的返回值为真时,则执行循环体中的语句,执行完毕后,重新判断条件表达式的返回值,直到表达式返回的结果为假是退出循环体。
注:在使用while循环语句时,一定不要忘记添加将循环条件改变为Flase的代码,否则,将产生死循环。但开发中也离不开死循环,可根据情况进行编写。
4.2. for循环
for 循环是一个依次重复执行的循环,通常适用于枚举、遍历序列和对象中的元素。语法如下:
for 迭代变量 in 可迭代对象:
循环体
迭代变量用于保存读除的值,对象为遍历或迭代的对象,该对象可以是任何有序的序列对象,如字符串,列表,元组等,循环体为一组被重复执行的语句。
for循环语句可以最基本的应用就是进行数值循环和遍历字符串。还可以进行遍历列表、元组、集合和字典。
4.3. 循环嵌套
在Python中,是允许在一个循环体中嵌套另一个循环。
(1). 在while循环中嵌套while循环
while 条件表达式1:
while 条件表达式2:
循环体2
循环体1
(2). 在for 循环中嵌套 for 循环
for 迭代变量1 in 对象1:
for 迭代变量2 in 对象2:
循环体2
循环体1
(3). 在while 循环中嵌套 for 循环
while 条件表达式:
for 迭代变量 in 对象:
循环体2
循环体1
(4). 在 for 循环中嵌套 while 循环
for 迭代变量 in 对象:
while 条件表达式:
循环体2
循环体1
特殊案例:九九乘法表
for i in range(0,10):
for j in range(1,i+1):
print(str(j) + "*" + str(i) + "=" + str(i * j) +"\t" ,end = " "
print("")
5.跳转语句
当循环满足一定条件时,程序会一直执行下去,如果需要在中间离开循环,也就是for循环结束重复之前,或者while循环找到结束条件之前,即break语句和continue语句。
5.1 break语句
break可以终止当前循环,包括for循环和while循环在内的所有控制语句。
在while中使用break语句:
while 条件表达式1:
执行语句
if 条件表达式2:
break
在for 中使用break语句
for 迭代变量 in 对象:
if 条件表达式:
break
while语句使用break for语句中使用break
5.2.continue语句
continue语句的作用没有break语句强大,他只能终止本次循环而提前进入下次循环中。
在while中使用continue语句
while 条件表达式1:
执行代码
if 条件表达式2:
continue
在for 中使用continue语句
for 迭代变量 in 对象:
if 条件表达式:
continue
while语句使用continue for语句中使用continue
注:break与continue的区别
break语句一般会结合if 语句进行搭配使用,表示在某种条件下,跳出循环。如果使用嵌套循环,break语句将跳出最内层循环。
continue语句一般也会结合if语句进行搭配使用,表示在某种条件下,跳出当前循环的剩下语句,继续进行下一轮循环,如果使用嵌套循环,continue语句将只跳过最内层循环中剩余语句。
6.pass语句
在Python中pass语句表示空语句,它不做任何事情,一般起到站位作用,常用在代码调试等。
#例:
for i in range(1,10): #输出1~10的数不包含10
if i % 2 == 0: #判断是否是偶数
print(i,end="") #在同一行打印偶数
else: #不是偶数
pass #占位符,不做任何事情,直接跳过
#输出结果为:
2 4 6 8
二、导入模块语句import *,from * import * 解析
python代码,一般第一行代码都是import *或from * import *,作用是导入功能模块,然后利用模块内的函数编写代码,减少大量的代码编写时间,是python的一大特色。但是,在实际写码过程中,初学者往往因对import * 处于一知半解,导致经常出现一些莫名其妙的问题,严重影响学习心情和效果。本文特对此进行详细解读,帮助避坑。
导入的是什么?
用import *导入时,*代表的是模块,也就是说,import导入的是模块,不是包、类、函数。
用from * import *时,第一个*代表的也是模块,第二个*代表的则是模块内的类或函数。意思是从模块里导入其中的某个函数或类。具体下面有详解。
什么叫模块
模块是含有类或函数的py文件,也就是说,我们写的每一个py文件,都是模块。只不过专门的模块文件里面必须有函数或类,而我们一般写的py文件,是直接写功能代码,不一定需要有函数或类。举个例子:
不含函数直接写功能代码的Py文件:
print('hellow')
运行结果:hellow
含函数的功能模块Py文件:
def打印():print('hellow')if__name__=="__main__":打印()
运行结果:hellow
其中,def 打印()就是定义名为“打印”的函数。通过if __name__ == "__main__":在本模块文件内调用“打印”函数,执行函数内的“print('hellow')”代码。为何要用if语句,本号在if name == main的作用文章里已经讲解,有疑问的可移步查看。
将上面含函数的功能模块py文件取文件名为“试验”,保存后得到“试验.py”文件,就是一个可供其他py文件导入调用的模块。调用方法为:
import试验试验.打印()
运行结果:hellow,注意调用是文件后缀.py不要写,只写文件名。
另一种调用方法为:
from试验import打印打印()
运行结果:hellow,from 试验 import 打印:意思就是从“试验”模块文件里导入“打印”函数到本文件,导入后,就可直接使用函数名,函数名前面不加模块名。
专门用作模块的py文件,一般没有if语句,只能被调用,独自不能运行。比如上面的“试验.py”文件,如果我们删掉if语句,变成下面的代码:
def打印():print('hellow')
直接运行得不到hellow的结果,用上面的两个调用方法,则不受影响。
什么叫函数
通过上面的例子,我们不仅知道了py文件都是模块文件,而且知道了在调用模块时,最终使用的是模块文件里的函数,比如上面案例里的“打印”就是函数。所以,函数其实就是包含了具体功能代码,用def 函数名()定义的功能代码块。
在模块导入方面,类的性质和函数是一样的,只不过类有其专有的属性和方法,此处不细讲。
什么叫包
我们知道了import * 后面的 * 号代表的都是模块,但有时候我们会遇到这种用法:
importtkinter.filedialogtkinter.filedialog.askopenfilenames(filetypes=[('excel文件','.xlsx')])
import后面代码的中间有个小点,这就是导入包内模块的用法:小黑点前面是包的名称,后面是包含在包内的模块名称。
tkinter:就是一个功能包,包内含有多个子包或模块。
filedialog:是包含在tkinter包内的其中一个模块。
askopenfilenames:是包含在filedialog模块内的其中一个函数。
初学者有时候依葫芦画瓢会弄成这种用法:
importfiledialog.askopenfilenames
这就是误将函数作为模块进行导入了,程序会报错。如果真想导入askopenfilenames函数,可用form import用法,但注意,模块名必须带上包名,写成下面的样子:
formtkinter.filedialogimportaskopenfilenames
若漏了包名:
formfiledialogimportaskopenfilenames,也会报错
了解这些概念和用法后,严格按这个用法,基本就没有问题了。但有时也会遇到报错,这是因为模块导入顺序的问题。
模块分类
python的模块函数分4类:
1、python自带函数:不需进行import导入可直接使用,比如print()函数,就是直接用。
2、python标准函数库:安装Python时,会随带着安装一些标准函数,在python安装路径下的lib文件夹里,打开lib文件夹会发现很多py文件,这些就是标准函数,通过import导入后就可使用。
3、第三方库:有很多功能强大的模块函数,没有在标准库里,比如操作excel用到的openpyxl模块。这时用import导入时,会提示找不到这个模块文件。需要将其提前下载安装到lib文件夹里,然后再导入。下载方法为:打开cmd,输入pip install openpyxl,回车即可。
4、自己写的py文件模块:自己写的含有def 函数的py文件,可作为模块导入使用。前面的含有打印函数的试验.py文件,就是使用自建模块的例子。
import试验试验.打印()
模块导入顺序
我们知道,python标准库里有很多模块文件,比如下面的这个文件:
其实这是我自建的一个模块文件,功能是拆分合并excel文件。导入该功能模块后,拆分或合并excel文件的代码为:
importcfjoinimporttkinter.filedialogasaif__name__=="__main__":ff=a.askopenfilenames(filetypes=[('excel文件','.xlsx')])cfjoin.breakfile(ff)#拆分选中的excel文件
在运行时,上面的代码有时候可以,有时候却报错,对新手来说,这是很费解的。但其实,问题很简单。检查一下,是不是运行的Py文件所在文件夹里是否也存在一个与导入的模块文件同名的cfjoin.py文件,如果有,而且这个文件里的内容与lib文件夹里的cfjoin.py内容不同。则运行时会报错,如果没有、或者与lib文件夹里的cfjoin.py完全相同,则运行正常。这就是模块导入顺序造成的问题。
python导入模块时,不是直接从lib库里导入,而是先从当前py文件所在文件夹里找需要导入的模块文件,找到后则导入使用;如果没找到,再到lib文件夹里找,如果还没找到,则提示未找到。如果当前文件夹下某个py文件名正好与lib库里的模块文件同名,则会导入当前文件夹下的py文件而不是导入lib库里的模块文件,导致出错。避免的方法就是将自己写的py文件取名不要与一些常用lib库模块文件同名。
另外,python导入模块时只从当前文件夹下和lib库里导入,如果模块文件放在其他位置,则会提示找不到模块。移到当前文件夹或lib库中任何一个位置就可以了,如果是成熟的py功能文件,最好放在lib库里,可以避免编辑器误报错误。
比如,我上面的cfjoin.py文件,如果我将其放在当前文件夹下,删掉lib库里的该文件,上面的拆分excel表格代码运行功能没任何问题,但编辑器里会报错:
虽然是误报错,但对强迫症患者来说,看到那些黄波浪号会很不好受。这时,我们将cfjoin.py文件移到lib库里就可以了。
相关推荐
- Alist 玩家请进:一键部署全新分支 Openlist,看看香不香!
-
Openlist(其前身是鼎鼎大名的Alist)是一款功能强大的开源文件列表程序。它能像“万能钥匙”一样,解锁并聚合你散落在各处的云盘资源——无论是阿里云盘、百度网盘、GoogleDrive还是...
- 白嫖SSL证书还自动续签?这个开源工具让我告别手动部署
-
你还在手动部署SSL证书?你是不是也遇到过这些问题:每3个月续一次Let'sEncrypt证书,忘了就翻车;手动配置Nginx,重启服务,搞一次SSL得花一下午;付费证书太贵,...
- Docker Compose:让多容器应用一键起飞
-
CDockerCompose:让多容器应用一键起飞"曾经我也是一个手动启动容器的少年,直到我的膝盖中了一箭。"——某位忘记--link参数的运维工程师引言:容器化的烦恼与...
- 申请免费的SSL证书,到期一键续签
-
大家好,我是小悟。最近帮朋友配置网站HTTPS时发现,还有人对宝塔面板的SSL证书功能还不太熟悉。其实宝塔早就内置了免费的Let'sEncrypt证书申请和一键续签功能,操作简单到连新手都能...
- 飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
前面分享了两期TVGate:Q大的转发代理工具TVGate升级了,操作更便捷,增加了新的功能跨平台内网转发神器TVGate部署与使用初体验现在项目已经开源,并支持Docker部署,本文介绍如何通...
- Docker Compose 编排实战:一键部署多容器应用!
-
当项目变得越来越复杂,一个服务已经无法满足需求时,你可能需要同时部署数据库、后端服务、前端网页、缓存组件……这时,如果还一个一个手动dockerrun,简直是灾难这就是DockerCompo...
- 深度测评:Vue、React 一键部署的神器 PinMe
-
不知道大家有没有这种崩溃瞬间:领导突然要看项目Demo,客户临时要体验新功能,自己写的小案例想发朋友圈;找运维?排期?还要走工单;自己买服务器?域名、SSL、Nginx、防火墙;本地起服务?断电、关...
- 超简单!一键启动多容器,解锁 Docker Compose 极速编排秘籍
-
想要用最简单的方式在本地复刻一套完整的微服务环境?只需一个docker-compose.yml文件,你就能一键拉起N个容器,自动组网、挂载存储、环境隔离,全程无痛!下面这份终极指南,教你如何用...
- 日志文件转运工具Filebeat笔记_日志转发工具
-
一、概述与简介Filebeat是一个日志文件转运工具,在服务器上以轻量级代理的形式安装客户端后,Filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并将来自...
- K8s 日志高效查看神器,提升运维效率10倍!
-
通常情况下,在部署了K8S服务之后,为了更好地监控服务的运行情况,都会接入对应的日志系统来进行检测和分析,比如常见的Filebeat+ElasticSearch+Kibana这一套组合...
- 如何给网站添加 https_如何给网站添加证书
-
一、简介相信大家都知道https是更加安全的,特别是一些网站,有https的网站更能够让用户信任访问接下来以我的个人网站五岁小孩为例子,带大家一起从0到1配置网站https本次配置的...
- 10个Linux文件内容查看命令的实用示例
-
Linux文件内容查看命令30个实用示例详细介绍了10个Linux文件内容查看命令的30个实用示例,涵盖了从基本文本查看、分页浏览到二进制文件分析的各个方面。掌握这些命令帮助您:高效查看各种文本文件内...
- 第13章 工程化实践_第13章 工程化实践课
-
13.1ESLint+Prettier代码规范统一代码风格配置//.eslintrc.jsmodule.exports={root:true,env:{node...
- 龙建股份:工程项目中标_龙建股份有限公司招聘网
-
404NotFoundnginx/1.6.1【公告简述】2016年9月8日公告,公司于2016年9月6日收到苏丹共和国(简称“北苏丹”)喀土穆州基础设施与运输部公路、桥梁和排水公司出具的中标通知书...
- 福田汽车:获得政府补助_福田 补贴
-
404NotFoundnginx/1.6.1【公告简述】2016年9月1日公告,自2016年8月17日至今,公司共收到产业发展补助、支持资金等与收益相关的政府补助4笔,共计5429.08万元(不含...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)