-
复合语句
2020-11-29 19:34:47复合语句是包含其它语句(语句组)的语句;它们会以某种方式影响或控制所包含其它语句的执行。 通常,复合语句会跨越多行,虽然在某些简单形式下整个复合语句也可能包含于一行之内。 if, while 和 for 语句用来实现...复合语句是包含其它语句(语句组)的语句;它们会以某种方式影响或控制所包含其它语句的执行。 通常,复合语句会跨越多行,虽然在某些简单形式下整个复合语句也可能包含于一行之内。
if, while 和 for 语句用来实现传统的控制流程构造。 try 语句为一组语句指定异常处理和/和清理代码,而 with 语句允许在一个代码块周围执行初始化和终结化代码。 函数和类定义在语法上也属于复合语句。
一条复合语句由一个或多个‘子句’组成。 一个子句则包含一个句头和一个‘句体’。 特定复合语句的子句头都处于相同的缩进层级。 每个子句头以一个作为唯一标识的关键字开始并以一个冒号结束。 子句体是由一个子句控制的一组语句。 子句体可以是在子句头的冒号之后与其同处一行的一条或由分号分隔的多条简单语句,或者也可以是在其之后缩进的一行或多行语句。 只有后一种形式的子句体才能包含嵌套的复合语句;以下形式是不合法的,这主要是因为无法分清某个后续的 else 子句应该属于哪个 if 子句:
if test1: if test2: print(x)
还要注意的是在这种情形下分号的绑定比冒号更紧密,因此在以下示例中,所有 print() 调用或者都不执行,或者都执行:
if x < y < z: print(x); print(y); print(z)
总结:compound_stmt ::= if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | async_with_stmt | async_for_stmt | async_funcdef suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT statement ::= stmt_list NEWLINE | compound_stmt stmt_list ::= simple_stmt (";" simple_stmt)* [";"]
请注意语句总是以 NEWLINE 结束,之后可能跟随一个 DEDENT。 还要注意可选的后续子句总是以一个不能作为语句开头的关键字作为开头,因此不会产生歧义(‘悬空的 else’问题在 Python 中是通过要求嵌套的 if 语句必须缩进来解决的)。
为了保证清晰,以下各节中语法规则采用将每个子句都放在单独行中的格式。
if 语句
if 语句用于有条件的执行
if_stmt ::= "if" assignment_expression ":" suite ("elif" assignment_expression ":" suite)* ["else" ":" suite]
它通过对表达式逐个求值直至找到一个真值(请参阅 布尔运算 了解真值与假值的定义)在子句体中选择唯一匹配的一个;然后执行该子句体(而且 if 语句的其他部分不会被执行或求值)。 如果所有表达式均为假值,则如果 else 子句体如果存在就会被执行。
while 语句
while 语句用于在表达式保持为真的情况下重复地执行:
while_stmt ::= "while" assignment_expression ":" suite ["else" ":" suite]
这将重复地检验表达式,并且如果其值为真就执行第一个子句体;如果表达式值为假(这可能在第一次检验时就发生)则如果 else 子句体存在就会被执行并终止循环。
第一个子句体中的 break 语句在执行时将终止循环且不执行 else 子句体。 第一个子句体中的 continue 语句在执行时将跳过子句体中的剩余部分并返回检验表达式。
for 语句
for 语句用于对序列(例如字符串、元组或列表)或其他可迭代对象中的元素进行迭代:
for_stmt ::= "for" target_list "in" expression_list ":" suite ["else" ":" suite]
表达式列表会被求值一次;它应该产生一个可迭代对象。 系统将为 expression_list 的结果创建一个迭代器,然后将为迭代器所提供的每一项执行一次子句体,具体次序与迭代器的返回顺序一致。 每一项会按标准赋值规则 (参见 赋值语句) 被依次赋值给目标列表,然后子句体将被执行。 当所有项被耗尽时 (这会在序列为空或迭代器引发 StopIteration 异常时立刻发生),else 子句的子句体如果存在将会被执行,并终止循环。
第一个子句体中的 break 语句在执行时将终止循环且不执行 else 子句体。 第一个子句体中的 continue 语句在执行时将跳过子句体中的剩余部分并转往下一项继续执行,或者在没有下一项时转往 else 子句执行。
for 循环会对目标列表中的变量进行赋值。 这将覆盖之前对这些变量的所有赋值,包括在 for 循环体中的赋值:
for i in range(10): print(i) i = 5 # this will not affect the for-loop # because i will be overwritten with the next # index in the range
目标列表中的名称在循环结束时不会被删除,但如果序列为空,则它们根本不会被循环所赋值。 提示:内置函数 range() 会返回一个可迭代的整数序列,适用于模拟 Pascal 中的 for i := a to b do 这种效果;例如 list(range(3)) 会返回列表 [0, 1, 2]。
注解 当序列在循环中被修改时会有一个微妙的问题(这只可能发生于可变序列例如列表中)。 会有一个内部计数器被用来跟踪下一个要使用的项,每次迭代都会使计数器递增。 当计数器值达到序列长度时循环就会终止。 这意味着如果语句体从序列中删除了当前(或之前)的一项,下一项就会被跳过(因为其标号将变成已被处理的当前项的标号)。 类似地,如果语句体在序列当前项的前面插入一个新项,当前项会在循环的下一轮中再次被处理。 这会导致麻烦的程序错误,避免此问题的办法是对整个序列使用切片来创建一个临时副本,例如 for x in a[:]: if x < 0: a.remove(x)
try 语句
try 语句可为一组语句指定异常处理器和/或清理代码:
try_stmt ::= try1_stmt | try2_stmt try1_stmt ::= "try" ":" suite ("except" [expression ["as" identifier]] ":" suite)+ ["else" ":" suite] ["finally" ":" suite] try2_stmt ::= "try" ":" suite "finally" ":" suite
except 子句指定一个或多个异常处理器。 当 try 子句中没有发生异常时,没有异常处理器会被执行。 当 try 子句中发生异常时,将启动对异常处理器的搜索。 此搜索会依次检查 except 子句,直至找到与该异常相匹配的子句。 如果存在无表达式的 except 子句,它必须是最后一个;它将匹配任何异常。 对于带有表达式的 except 子句,该表达式会被求值,如果结果对象与发生的异常“兼容”则该子句将匹配该异常。 一个对象如果是异常对象所属的类或基类,或者是包含有兼容该异常的项的元组则两者就是兼容的。
如果没有 except 子句与异常相匹配,则会在周边代码和发起调用栈上继续搜索异常处理器。 1
如果在对 except 子句头中的表达式求值时引发了异常,则原来对处理器的搜索会被取消,并在周边代码和调用栈上启动对新异常的搜索(它会被视作是整个 try 语句所引发的异常)。
当找到一个匹配的 except 子句时,该异常将被赋值给该 except 子句在 as 关键字之后指定的目标,如果存在此关键字的话,并且该 except 子句体将被执行。 所有 except 子句都必须有可执行的子句体。 当到达子句体的末尾时,通常会转向整个 try 语句之后继续执行。 (这意味着如果对于同一异常存在有嵌套的两个处理器,而异常发生于内层处理器的 try 子句中,则外层处理器将不会处理该异常。)
当使用 as 将目标赋值为一个异常时,它将在 except 子句结束时被清除。 这就相当于
except E as N: foo
被转写为
except E as N: try: foo finally: del N
这意味着异常必须赋值给一个不同的名称才能在 except 子句之后引用它。 异常会被清除是因为在附加了回溯信息的情况下,它们会形成堆栈帧的循环引用,使得所有局部变量保持存活直到发生下一次垃圾回收。
在一个 except 子句体被执行之前,有关异常的详细信息存放在 sys 模块中,可通过 sys.exc_info() 来访问。 sys.exc_info() 返回一个 3 元组,由异常类、异常实例和回溯对象组成(参见 标准类型层级结构 一节),用于在程序中标识异常发生点。 当从处理异常的函数返回时 sys.exc_info() 的值会恢复为(调用前的)原值。
如果控制流离开 try 子句体时没有引发异常,并且没有执行 return, continue 或 break 语句,可选的 else 子句将被执行。 else 语句中的异常不会由之前的 except 子句处理。
如果存在 finally,它将指定一个‘清理’处理程序。 try 子句会被执行,包括任何 except 和 else 子句。 如果在这些子句中发生任何未处理的异常,该异常会被临时保存。 finally 子句将被执行。 如果存在被保存的异常,它会在 finally 子句的末尾被重新引发。 如果 finally 子句引发了另一个异常,被保存的异常会被设为新异常的上下文。 如果 finally 子句执行了 return, break 或 continue 语句,则被保存的异常会被丢弃:
>>> def f(): ... try: ... 1/0 ... finally: ... return 42 ... >>> f() 42
在 finally 子句执行期间,程序不能获取异常信息。
当 return, break 或 continue 语句在一个 try…finally 语句的 try 子语句体中被执行时,finally 子语句也会‘在离开时’被执行。
函数的返回值是由最后被执行的 return 语句所决定的。 由于 finally 子句总是被执行,因此在 finally 子句中被执行的 return 语句总是最后被执行的:
>>> def foo(): ... try: ... return 'try' ... finally: ... return 'finally' ... >>> foo() 'finally'
有关异常的更多信息可以在 异常 一节找到,有关使用 raise 语句生成异常的信息可以在 raise 语句 一节找到。
-
复合语句 java_java流程控制:复合语句
2021-03-14 00:41:38复合语句:以整个块区为单位的语句,又称块语句有“{"开始,闭括号"}"结束复合语句的每句话都是从上到下 执行的,复合语句可以嵌套复合语句。public class Compound {public static void main(String[] args) {int x...复合语句:以整个块区为单位的语句,又称块语句有“{"开始,闭括号"}"结束复合语句的每句话都是从上到下 执行的,复合语句可以嵌套复合语句。
public class Compound {
public static void main(String[] args) {
int x=20;
//复合语句
{
int y=40;
System.out.println(y);
int z=245;
//boolean b;
{
b=y>z;
System.out.println(b);
}//为被嵌套的复合语句
}
String word="hello java";
System.out.println(word);
}
}
执行结果为:40
false
hello java
复合语句是为局部变量创建了一个作用域,在该作用域中某个变量被创建能够使用。如果在某个变量的作用域外使用该变量,则会发生错误。
作用域:
1.public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用。
2.private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可以使用。
3.protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
作用域 当前类 同一package 子孙类 其他package
-
复合语句 java_Java复合语句的使用方法详解
2021-03-14 00:41:35Java复合语句的使用方法详解发布于 2020-11-24|复制链接摘记: 与 C 语言及其他语言相同, Java 语言的复合语句是以整个块区为单位的语句,所以又称为块语句。下面我们来看看有关复合语句的使用方法和实例。 复合语句...Java复合语句的使用方法详解
发布于 2020-11-24|
复制链接
摘记: 与 C 语言及其他语言相同, Java 语言的复合语句是以整个块区为单位的语句,所以又称为块语句。下面我们来看看有关复合语句的使用方法和实例。 复合语句由开括号“{”开始,闭括号“}”结束。 相信大家在Java的学习过程中已经接触到了这种复合语句,例如,在定义一个类或者方法时,类体就是以“{ }”作为开始与结 ..
与 C 语言及其他语言相同, Java 语言的复合语句是以整个块区为单位的语句,所以又称为块语句。下面我们来看看有关复合语句的使用方法和实例。 复合语句由开括号“{”开始,闭括号“}”结束。 相信大家在Java的学习过程中已经接触到了这种复合语句,例如,在定义一个类或者方法时,类体就是以“{ }”作为开始与结束的标记,方法体同样也是以“{ }”作为标记。复合语句中的每个语句都是从上到下被执行。复合语句以整个块为单位,可以用在任何一个单独语句可以用到的地方,并且在复合语句中还可以嵌套复合语句。 实例:在项目中创建类Compound,在主方法中定义复合语句块,其中包含另一复合语句块。代码如下:
```java
public class Compound {
public static void main(String[] args) {
int x = 20;
{
int y = 40;
System.out.println(y);
int z = 245;
boolean b;
{
b = y > z;
System.out.println(b);
}
}
String word = "hello java";
System.out.println(word);
}
}
```
运行结果如下:40
false
hello java
注意:在使用复合语句时要注意,复合语句为局部变量创建了一个作用域,该作用域为程序的一个部分,在该作用域中某个变量被创建并且能够被使用。如果在某个变量的作用域外使用该变量,则会发生错误,例如,在本实例中,如果在复合语句外使用变量y、z、b将会出现错误,而变量 x 可在整个方法体中使用。
-
java 复合语句定义_Java复合语句的使用方法详解
2021-03-14 11:32:52与 C 语言及其他语言相同, Java 语言的复合语句是以整个块区为单位的语句,所以又称为块语句。下面我们来看看有关复合语句的使用方法和实例。复合语句由开括号“{”开始,闭括号“}”结束。相信大家在Java的学习...与 C 语言及其他语言相同, Java 语言的复合语句是以整个块区为单位的语句,所以又称为块语句。下面我们来看看有关复合语句的使用方法和实例。
复合语句由开括号“{”开始,闭括号“}”结束。 相信大家在Java的学习过程中已经接触到了这种复合语句,例如,在定义一个类或者方法时,类体就是以“{ }”作为开始与结束的标记,方法体同样也是以“{ }”作为标记。复合语句中的每个语句都是从上到下被执行。复合语句以整个块为单位,可以用在任何一个单独语句可以用到的地方,并且在复合语句中还可以嵌套复合语句。
实例:在项目中创建类Compound,在主方法中定义复合语句块,其中包含另一复合语句块。代码如下:
public class Compound {
public static void main(String[] args) {
int x = 20;
{
int y = 40;
System.out.println(y);
int z = 245;
boolean b;
{
b = y > z;
System.out.println(b);
}
}
String word = "hello java";
System.out.println(word);
}
}
运行结果如下:
40
false
hello java
注意:在使用复合语句时要注意,复合语句为局部变量创建了一个作用域,该作用域为程序的一个部分,在该作用域中某个变量被创建并且能够被使用。如果在某个变量的作用域外使用该变量,则会发生错误,例如,在本实例中,如果在复合语句外使用变量y、z、b将会出现错误,而变量 x 可在整个方法体中使用。
希望本文对大家有所帮助。
-
C语言复合语句
2020-02-13 23:07:02复合语句内的变量定义是独立的,即复合语句内定义的变量不影响复合语句外的同一个标识符的变量,且复合语句内定义的变量不能供复合语句外调用,只能在复合语句外单独定义,单独使用。 但是复合语句外定义的变量可以... -
java 复合语句定义,基础>复合语句 <6>
2021-04-22 15:04:22复合语句中的每个语句都是从上到下被执行,复合语句以整个块为单位,可以用在任何一个单独语句可以用到的地方,并且复合语句还可以嵌套复合语句。复合语句实例(//、/*这两个符号代表注释):public ... -
java的复合语句的作用_Java复合语句的使用方法详解
2021-03-16 00:38:38与 C 语言及其他语言相同, Java 语言的复合语句是以整个块区为单位的语句,所以又称为块语句。下面我们来看看有关复合语句的使用方法和实例。复合语句由开括号“{”开始,闭括号“}”结束。相信大家在Java的学习... -
JAVA复合语句
2018-07-14 21:56:52java的复合语句是以整个块为单位的语句,所以又称为块语句,复合语句由“{”开始,以“}”结束。复合语句中的每个语句都是从上到下执行的,并且在复合语句中可以嵌套复合语句。public class Compound { public ... -
dao层mysql复合语句_MySQL的简单复合语句使用
2021-03-07 18:31:56作为一个java开发,一直掌握不好学习MySQL的程度,学精的话毕竟有DBA在没什么必要还浪费时间,但是若学浅了,那简单的复合语句别人都会写就你不会也挺尴尬。所以想借此机会逐渐开始拾起数据库这方面的知识。首先上个... -
声明语句、复合语句、语句作用域
2019-09-23 12:13:37声明语句 在 C++ 中,对象或类的定义或声明也是语句。尽管定义语句这种说法也许更准确些,但定义语句经常被称为声明语句。 复合语句(块) 复合语句,通常被称为块,...复合语句用在语法规则要求使用单个语句但程... -
python语句分为复合语句_对Python中for复合语句的使用示例讲解
2020-11-25 21:19:25当Python中用到双重for循环设计的时候我一般会使用循环的嵌套,但是在Python中其实还存在另一种技巧——for复合语句。简单写一个小程序,用于延时循环嵌套功能如下:#!/usr/bin/pythondefFunc1(ten_num,one_num):for... -
条件语句和循环语句_Java第四章 | 复合语句、条件语句、循环语句
2021-01-29 05:17:09复合语句1、复合语句同C语言或其他语言相同,Java语言的复合语句是以整个块区为单位的语句,所以又称块语句。复合语句由开括号“{”开始,闭括号“}”结束。在前面的学习中已经接触到了这种复合语句。例如在定义一个... -
python语句分为复合语句和_python——这7种复合语句在编写时要遵循什么?
2021-01-30 02:48:04python有几种类型的复合语句:if、for、while、def、class、try/except、with/as等。这些复合类型的语句在编写时,要遵循python的语法风格:1.冒号结尾复合语句的声明,如if expr:、def f():2.通过缩进数量决定代码...