【Python学习手册(第四版)】学习笔记10-语句编写的通用规则

个人总结难免疏漏,请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。

本文较简单,5-10分钟即可阅读完成。介绍Python基本过程语句并讨论整体语法模型通用规则(冒号、省略、终止、缩进、其他特殊情况),以及简短示例。暂不介绍函数、类、模块以及异常。


目录

语句

Python的语句

语法-冒号(:)

语法-省略括号

语法-终止语句

语法-缩进

为什么使用缩进语法

 语句特殊情况示例

一行多个

横跨多行

代码块规则

简短示例

交互式循环

输入数据做数学运算

检查输入处理错误

try语句处理错误

嵌套三层


语句

语句就是写出来要告诉Python你的程序应该做什么的句子。如果程序是“用一些内容做事情”的话,那么语句就是你指定程序要做哪些事情的方式。

Python程序结构

程序构成:

  1. 1.程序由模块构成。
  2. 2.模块包含语句。
  3. 3.语句包含表达式。
  4. 4.表达式建立并处理对象。

Python的语法实质上是由语句和表达式组成的。表达式处理对象并嵌套在语句中。语句编码实现程序操作中更大的逻辑关系——它们使用并引导表达式处理对象。

此外,语句还是对象生成的地方(例如,赋值语句中的表达式),有些语句会完全生成新的对象类型(函数、类等)。语句总是存在于模块中的,而模块本身则又是由语句来管理的。

Python的语句

下图表10-1总结了Python的语句集。

这里会介绍Python基本过程语句并讨论整体语法模型。暂不介绍函数、类、模块以及异常,后续其他文章继续介绍。

表10-1中包含了Python 3.0中的语句形式,每部分代码都说明了其具体语法和用途。如下是关于内容的一些说明:

  • ·赋值语句以不同的语法形式呈现,基本的、序列的、扩展的等等。
  • print在Python 3.0中不是一个保留字,也不是一条语句,而是一个内置的函数调用;由于它几乎总是作为一条表达式语句运行(即,自己单独一行),通常将其看做是一条语句类型。

语法-冒号(:)

所有Python的复合语句(也就是语句中嵌套了语句)都是首行以冒号结尾,首行下一行嵌套的代码往往按缩进的格式书写,如下所示:

冒号是不可或缺的,遗漏掉冒号可能是Python新手最常犯的错误之一。要使得输入冒号变成潜意识里的一种习惯。

语法-省略括号

在Python中,可以省略括号而语句依然会正常工作:

从技术角度来讲,由于每个表达式都可以用括号括起来,在这里的Python程序中加上括号也没什么问题,不会被视为错误的if形式。但是不要这么做,Python方式就是在这类语句中完全省略括号

>>> x = 1
>>> y = 0>>> if x < y:print('1')
else:print(0)0
>>> if (x < y):print('1')
else:print(0)0

语法-终止语句

Python之中你不需要像类C语言那样用分号终止语句:

在Python中,一般原则是,一行的结束会自动终止出现在该行的语句。就是可以省略分号并且程序会正确工作:

有些方式可以避开这一原则。但是一般来说,绝大多数Python程序代码都是每行一个语句,不需要分号。

语法-缩进

缩进的结束就是代码块的结束,Python中一致地把嵌套块里所有的语句向右缩进相同的距离,Python能够使用语句的实际缩进来确定代码块的开头与结尾:

缩进,是指这里的两个嵌套语句至左侧的所有空白。Python并不在乎怎么缩进(你可以使用空格或制表符)或者缩进多少(你可以使用任意多个空格或是制表符)。

实际上,两个嵌套代码块的缩进可以完全不同。语法规则只不过是给定一个单独的嵌套块中所有语句都必须缩进相同的距离。如果不是这样就会出现语法错误,而程序就无法运行了,直到把缩进修改一致。

为什么使用缩进语法

缩进Python迫使程序员写出统一、整齐并具有可读性程序的主要方式之一。

根据逻辑结构将代码对齐是令程序具有可读性的主要部分,因而具备了重用性和可维护性,对自己和他人都是如此。

即使你之后不使用Python,也应该在任何块结构的语言中对齐代码让程序更具可读性。

在任何代码块结构的语言中,无论是Python还是其他语言,如果嵌套代码块缩进的不一致,它们将很难解释、修改或者再使用,因为代码不再能形象地反应其逻辑含义。可读性是很重要的,缩进又是可读性的主要元素。

举个例子,考虑下面这个C语言的语句:

这个else是属于哪个if的呢?这个else是属于嵌套的if语句[if(y)],即使它看上去很像是属于外层if(x)的。

这种事在Python中是不可能发生的:因为缩进很重要,程序看上去什么样就意味着它将如何运行。考虑一个等价的Python语句:

if x:if y:print('1')
else:print('0')

这个例子里,else垂直对齐的if就是其逻辑上的if(外层的if x)。从某种意义上来说,Python是WYSIWYG语言——所见即所得(what you see is what you get)。

目前几乎每个对程序员友好的文本编辑器都有对Python语法模型的内置支持。

缩进没有绝对的标准:常见的是每层四个空格或一个制表符,但是你想怎么缩进以及缩进多少都由你自己决定。嵌套越深的代码块向右缩进的越厉害,越浅就越靠近前一个块。

不应该在同一段Python代码中混合使用制表符和空格,除非你一贯这么做;在一段给定的代码中,使用制表符或空格,但不要二者都用

不管用何种语言编写代码,都应该一致地缩进以保持可读性,这一点怎么强调都不过分。

 语句特殊情况示例

正如前面提到的,在Python的语法模型中:

·一行的结束就是终止该行语句(没有分号)。

·嵌套语句是代码块并且与实际的缩进相关(没有大括号)。

这些规则几乎涵盖了实际中你会写出或看到的所有Python程序。然而,Python也提供了一些特殊用途的规则来调整语句和嵌套语句的代码块。

一行多个

虽然语句一般都是一行一个,但是Python中也有可能出现某一行挤进多个语句的情况,这时它们由分号隔开:

>>> a = 1; b = 2; print(a+b)
3

这是Python中唯一需要分号的地方——只能把简单语句放在一起作为语句界定符。例如,赋值操作、打印和函数调用。复合语句还是必须出现在自己的行里。

横跨多行

可以让一个语句的范围横跨多行。只需要用一对括号把语句括起来就横跨多行:括号(())、方括号([])或者字典的大括号({})。

任何括在这些符号里的程序代码都可横跨好几行。语句将一直运行,直到Python遇到包含闭合括号的那一行。例如,连续几行列表的常量:

list = [1,2,3]dict = {'a':1,'b':2,'c':3}tuple1 = (1,2,3)

由于程序被括在一对方括号里,Python就会接着运行下一行,直到遇见闭合的方括号为止。花括号包含的字典(以及集合常量、字典解析以及集合解析)也可以用这个方法横跨数行,并且圆括号可以处理元组、函数调用和表达式。

连续行的缩进是无所谓的,尽管常识告诉我们为了让程序具有可读性,那几行也应该对齐。

括号是可以包含一切的——因为任何表达式都可以包含在内,只要插入一个左边括号,你就可以到下一行接着写你的语句。

x = (a + b +c + d)

括号也适用于复合语句。不管你在什么地方需要写一个大型的表达式,只要把它括在括号里,就可以在下一行接着写:

if (a == 1 andb == 2 andc == 3):print('hi')

代码块规则

前面说嵌套代码块中的语句一般都与向右缩进相同的量相关联。

下面的特殊案例,说明复合语句的主体可以出现在Python的首行冒号之后。

if x > y: print(x)

这种可以编辑单行if语句、单行循环等。只有当复合语句本身不包含任何复合语句的时候,才能这样做。只有简单语句可以跟在冒号后面,比如赋值操作、打印、函数调用等。较复杂的语句仍然必须单独放在自己的行里。复合语句的附带部分(例如if的else部分)也必须在自己的行里。

如果将所有语句都分别放在不同的行里并总是将嵌套代码块缩进,那么程序代码会更容易读懂并且便于后期的修改。


简短示例

下面通过简单的实例来说明实际应用中语句语法和语句嵌套相结合的方式,并在其间介绍一些语句。

交互式循环

假设要写个Python程序,要求在控制窗口与用户交互。你需要写一个能够读取用户键盘输入数据的循环并打印每次读取的结果。也就是写一个标准的“读取/计算/打印”的循环程序。

在Python中,这种交互式循环的典型模板代码可能会像这样。

while True:reply = input('输入信息:')if reply == 'stop': breakprint(reply.upper())

这段代码使用了一些概念:

  • 利用了Python的while循环,它是Python最通用的循环语句。简单地说,它的组成为:while这个单词,之后跟一个其结果为真或假的表达式,再接一个当顶端测试为真(这时的True看做是永远为真)时不停地迭代的嵌套代码块。
  • input内置函数,在这里用于通用控制台输出,它打印可选的参数字符串作为提示,并返回用户输入的回复字符串。
  • 利用嵌套代码块特殊规则的单行if语句也在这里出现:if语句体出现在冒号之后的首行,而并不是在首行的下一行缩进。
  • Python的break语句用于立即退出循环。也就是完全跳出循环语句而程序会继续循环之后的部分。如果没有这个break退出语句,while循环会因为测试总是真值而永远循环下去。

语句组合实质上是指:从用户那里读取一行并用大写字母打印,直到用户输入"stop"为止。还有一些其他的方式可以编写这样的循环。

要注意的是,在while首行下面嵌套的三行的缩进是相同的。由于它们是以垂直的方式对齐的,所以它们是和while测试相关联的并重复运行的代码块。源文件的结束或是一个缩进较少的语句都能够终止这个循环体块

这个程序取得的某种程度上的交互:

输入信息:1
1
输入信息:22
22
输入信息:hi
HI
输入信息:stop

Python 2.6或之前的版本应该使用raw_input而不是input,并且你可以在print语句中省略外围的圆括号。

输入数据做数学运算

现在想对数值的输入做些数学运算。例如,求平方。

由于用户输入的是文本信息,需要转为整数,用int()

>>> reply = '20'
>>> reply ** 2
Traceback (most recent call last):File "<pyshell#28>", line 1, in <module>reply ** 2
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'>>> int(reply) ** 2
400

现在重新编写循环来执行必要的数学运算。

while True:reply = input('输入信息:')if reply == 'stop': breakprint(int(reply) ** 2)
print('bye')

像以前一样,这个脚本用了一个单行if语句在"stop"处退出,但是也能够转换输入来进行需要的数学运算。

这个版本在底端加了一条结束信息。最后一行的print语句不像嵌套代码块那样缩进,不会看做是循环体的一部分,只能退出循环之后运行一次。

输入信息:2
4
输入信息:10
100
输入信息:stop
bye

检查输入处理错误

上面输入的是数字,如果输入的是非数字呢?

输入信息:r
Traceback (most recent call last):File "<pyshell#37>", line 4, in <module>print(int(reply) ** 2)
ValueError: invalid literal for int() with base 10: 'r'

内置int函数会发生异常。如果想要我们的脚本够健全,可以事先用字符串对象的isdigit方法检查字符串的内容。

>>> s = '123'
>>> t = 'xx'
>>> s.isdigit(),t.isdigit()
(True, False)

下面这个新版本的交互式脚本使用全方位的if语句来避免错误导致的异常。

while True:reply = input('输入信息:')if reply == 'stop':breakelif not reply.isdigit():print('输入错误,请输入数字')else:print(int(reply) ** 2)print('bye')

完整形式的构成是:if这个关键字后面接测试以及相配的代码块,一个或多个选用的elif(else if)测试以及代码块,以及一个选用的else部分和末尾的一个相配的代码块来作为默认行为。

Python会执行首次测试为真所相配的代码块,按照由上至下的顺序,如果所有测试都是假,就执行else部分。

运行新脚本时,程序会在错误发生前捕捉它,然后打印出(虽然不灵活)错误消息来进行说明。

输入信息:3
9
输入信息:r
输入错误,请输入数字
输入信息:1
1
输入信息:stop
bye

try语句处理错误

在Python中,处理错误最通用的方式是使用try语句,用它来捕捉并完全复原错误。这里不深入,后续文章做详细介绍。

使用try会让有些人认为这要比上一个版本更简单一些:

while True:reply = input('输入信息:')if reply == 'stop':breaktry:num = int(reply)except:print('输入错误,请输入数字')else:print(num ** 2)print('bye')

这个版本的运作方式和上一个版本的相同,这里把刻意进行错误检查的代码,换成了假设转换可工作的代码,然后把无法运作的情况,包含在异常处理器中。

这个try语句的组成是:try关键字后面跟代码主要代码块(我们尝试运行的代码),再跟except部分,给异常处理器代码,再接else部分,如果try部分没有引发异常,就执行这一部分的代码。Python会先执行try部分,然后运行except部分(如果有异常发生)或else部分(如果没有异常发生)。

从语句嵌套来看,try、except以及else这些关键字全都缩进在同一层次上,它们全都被视为单个try语句的一部分。

在Python中,else可出现在if语句中,也可以出现在try语句以及循环中——其缩进会告诉你它属于哪个语句。在这个例子中,try语句从单词try开始,一直到else语句下面缩进的代码结束,因为else和try为相同的缩进层级。

嵌套三层

如果有必要的话,嵌套甚至可以让我们再深入一步。例如,我们可以根据有效输入资料的相对大小,分支到一组替代动作上。

while True:reply = input('输入信息:')if reply == 'stop':breakelif not reply.isdigit():print('输入错误,请输入数字')else:num = int(reply)if num < 20:print('太小')else:print(num ** 2)print('bye')

这个版本包含一个if语句,嵌套在了另一个if语句(嵌套在while循环中)的else子句中。当代码是条件式时,或者像这样重复时,我们只要再往右缩进即可。结果就像前几版那样,不同的是我们现在可以为小于20的数字打印"太小"。

输入信息:20
400
输入信息:19
太小
输入信息:stop
bye

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CAN通讯系列5】CAN数据帧及其仲裁

在CAN通讯系列3-CAN通讯如何传递信号中&#xff0c;由于传递信号的分析需要&#xff0c;引出了CAN数据帧的ID&#xff0c;长度和数据段的概念&#xff0c;它们都与CAN协议帧相关。CAN协议帧有5种类型&#xff0c;如下表&#xff1a; 而我们当前使用到的是数据帧&#xff0c;故本…

正向解析、反向解析、DNS主从、多区域、ntp时间同步

DNS配置回顾 编号主机名IP地址说明1web服务器192.168.1.17发布部署web服务2dns服务器192.168.1.20用于解析域名和IP地址3clien主机192.168.1.18用于模拟客户机 修改 client主机&#xff1a;修改了dns的访问主机&#xff1b;临时修改echo "nameserver IP地址"&…

【Web开发手礼】探索Web开发的秘密(十三)-Vue(3)好友列表、登录

前言 主要介绍了好友列表、登录界面所涉及的vue知识点&#xff01;&#xff01;&#xff01; 好友列表 从云端API读取数据信息 地址 https://app165.acapp.acwing.com.cn/myspace/userlist/方法&#xff1a;GET是否验证jwt&#xff1a;否输入参数&#xff1a;无返回结果&…

基于okhttp3拦截器实现短时间内重复请求的拦截

基于okhttp3拦截器实现短时间内重复请求的拦截 背景 某次需求代码实现存在缺陷, 导致用户在点击某标签的时候发起了2次请求(即一次重复请求)。由于开发自测阶段没有盯着抓包软件看请求次数, 测试也没有关注接口请求次数问题, 最终将问题带上线。 影响面 导致被调用的接口QPS翻…

C#知识|文件与目录操作:文本读写操作

哈喽,你好啊,我是雷工! 今天学习文件与目录的操作,以下为文本读写操作的学习笔记。 01 文件操作说明 1.1、数据的存取方式 数据库:适合存取大量且关系复杂并有序的数据; 文件:适合存取大量但数据关系简单的数据,像系统的日志文件; 1.2、文件存取的优点 ①:读取操…

ECharts - 坐标轴刻度数值处理

写图表时&#xff0c;Y轴的数值过大&#xff0c;不太可能直接展示&#xff0c;这时候就得简写了&#xff0c;或者百分比展示的也要处理&#xff0c;如下图&#xff1a; yAxis: {type: value,// Y轴轴线axisLine: { show: false }, // 刻度线axisTick: { show: false },// 轴刻度…

收藏!2024年GPU算力最新排名

​GPU&#xff08;图形处理单元&#xff09;算力的提升是驱动当代科技革命的核心力量之一&#xff0c;尤其在人工智能、深度学习、科学计算和超级计算机领域展现出了前所未有的影响力。2024年的GPU技术发展&#xff0c;不仅体现在游戏和图形处理的传统优势上&#xff0c;更在跨…

House of Lore

House of Lore 概述&#xff1a; House of Lore 攻击与 Glibc 堆管理中的 Small Bin 的机制紧密相关。House of Lore 可以实现分配任意指定位置的 chunk&#xff0c;从而修改任意地址的内存。House of Lore 利用的前提是需要控制 Small Bin Chunk 的 bk 指针&#xff0c;并且…

Android中如何手动制造logcat各等级日志(VERBOSE、DEBUG、INFO、WARNING、ERROR、FATAL)

文章目录 1、logcat与log工具2、通过log生成logcat日志2.1、logcat日志等级2.2、log指令说明2.3、log生成日志指令 3、制作日志生成shell脚本4、增加日志生成控制5、附录 1、logcat与log工具 logcat&#xff1a;是Android操作系统中用于记录和查看系统日志的工具。它是Android…

如何在 VPS 上安装和使用 VirtualMin

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 关于 Virtualmin Virtualmin 是 Webmin 的一个模块&#xff0c;允许对&#xff08;多个&#xff09;虚拟专用服务器进行广泛的管理。您…

【华为OD机考】2024D卷最全真题【完全原创题解 | 详细考点分类 | 不断更新题目】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1441了解算法冲刺训练&#xff08;备注【CSDN】否则不通过&#xff09; 文章目录 相关推荐阅读栈常规栈单调栈 队列&#xff08;题目极少&#xff0c;几乎不考&#xff09;哈希哈希集合哈希表 前缀和双指针同向双指针 贪…

七、SpringBoot日志

1. 得到日志对象 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; //打印日志…

C++程序使用开源zlib库对二进制字节流数据进行压缩和解压(附源码)

目录 1、概述 2、zlib开源库与开源zip.cpp和unzip.cpp的区别 3、发送端先调用compress压缩,再将数据发出去 4、接收端接收到数据,调用uncompress解压,解压后再使用 5、最后 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.c…

c++-封装案例-设计学生类

类中的属性和行为统称为成员&#xff0c;属性&#xff1a;成员属性、成员变量&#xff1b;行为&#xff1a;成员函数&#xff0c;成员方法。

黛米·摩尔和她的孙女卢埃塔在这张飘逸的快照很亲密

卢埃塔和她的祖母黛米摩尔显然是最好的朋友&#xff0c;这张飘逸的快照证明了这一点。准备好“哇&#xff01;” 7 月 26 日&#xff0c;摩尔分享了一张非常迷人的照片&#xff0c;照片上有她、她的两个女儿和她的孙女在她昂贵的后院。她在照片中配文说&#xff1a;“夏日&…

vue3-环境变量-JavaScript-axio-基础使用-lzstring-字符串压缩-python

文章目录 1.Vue3环境变量1.1.简介1.2.全局变量的引用1.3.package.json文件 2.axio2.1.promise2.2.安装2.3.配置2.3.1.全局 axios 默认值2.3.2.响应信息格式 2.4.Axios的拦截器2.4.1.请求拦截器2.4.2.响应拦截器2.4.3.移除拦截器2.4.4.自定义实例添加拦截器 3.lz-string3.1.java…

回溯

组合问题 LeetCode77 组合 class Solution { public:vector<vector<int>>res;vector<int>list;void dfs(int begin,int n,int k){if(list.size()k){res.push_back(list);return;}for(int ibegin;i<n;i){list.push_back(i);dfs(i1,n,k);list.pop_back();}…

(源码分析)springsecurity认证授权

了解 1. 结构总览 SpringSecurity所解决的问题就是安全访问控制&#xff0c;而安全访问控制功能其实就是对所有进入系统的请求进行拦截&#xff0c;校验每个请求是否能够访问它所期望的资源。 根据前边知识的学习&#xff0c;可以通过Filter或AoP等技术来实现&#xff0c;Spr…

天津仁爱学院2024级专升本新同学开学报到提示

亲爱的2024级新同学: 亲爱的仁爱新人&#xff0c;你准备好了吗&#xff1f;祝福之余&#xff0c;关于入学报到还有以下几点提示&#xff1a; 01报到时间 报到时间:2024年9月1日。报到时请携带录取通知书和准考证。因参军保留入学资格或因病及其他原因不能按时报到的同学&#x…