题主是大一学生,刚刚开始学习python,但是题主有一定的c语言基础,在这里以两者对比的形式做一些学习笔记。
本系列的0-2篇取名叫python学习笔记,感觉会造成误导,对于大多数python初学者来说,我的文章可能帮助并不大,因此从本篇开始,标题取为“从c语言到Python”
第四次学习的内容是分支语句。计算机基础告诉我们,一切复杂问题都可以使用顺序、分支、循环三种结构来解决,所以任何编程语言都会有分支语句相关的语法。题主在比较两个语言的分支语法的时候,发现最有趣的区别在于“缩进”
#分支都需要什么?
试想我们想自己创造一个编程语言,语言里要实现分支语句。我们需要一个条件:如果某个东西是正确的,接着需要满足这个条件的时候进行的操作,最后需要如果不满足这个条件的时候进行的操作。接着我们发现,有的时候我们有多个并列的分支,条件abc—>操作abc,如果都不满足->操作d。无论如何,“条件”和”操作“是一一对应的。
在解决绝大多数问题时,我们可以发现,条件往往比较简单,一句话可以解决(a>b、a=0等等),但是操作可能会有很多很多,这就很像是高中数学的分类讨论。当然,很多时候会在一个条件的情况内再分情况,这就需要下图的结构:
很容易发现,这种分支套分支的情况多了,要是我们还是一行一行的来写,很容易混淆条件和包含的关系,所以我们在语法的设置中需要用一些操作来进行明确。
所以综上,分支语句的语法需要:条件、对应操作、明确包含关系
#分支的语法
##python
python条件分支的基础语句是:
if 条件:
操作
else if 条件:
操作
else:
操作
这里对应的操作要比条件开头多一个制表符“tab”,也就是,这句话比哪个条件多一个tab它就是那个条件下的操作。
##c语言
c语言条件分支的基础语句是:
if(条件)
{操作}
elif(条件)
{操作}
else
{操作}
大括号就是用来区分条件内外的标识。
我们在使用c语言的时候,往往也会使用到缩进,缩进不影响运行效果,但是代码的可读性会更强。
#include <stdio.h>
int main()
{
int a = 0;
if (a==0)
{
printf("1");
}
else
{
printf("2");
}
}
#include <stdio.h>
int main()
{
int a = 0;
if (a==0)
{
printf("1");
}
else
{
printf("2");
}
}
你喜欢看哪个?
如果嵌套的再复杂一点,不使用缩进的代码会很大程度影响代码的理解。这种代码会被叫做“shi山代码”。所以在代码中使用缩进是个非常好的习惯。
#缩进
缩进的作用是把同一层次的操作使用前面增加制表符“tab”的方式来对齐,从而达到声明不同层次的操作的作用。
这个声明在python中是计算机层面的,在c语言中是阅读者层面的。
对于较早的c语言来说,编程者们习惯使用缩进一定是程序员界约定俗成的规矩,不写缩进的人就是创造“shi山”的拉shi者。所以后来创造python的时候,干脆就把这种好习惯规定成了语法,不使用缩进的代码直接就不合法了,而在c语言里,如果有严格使用缩进的好习惯,其实不使用大括号也可以达到区分的效果,所以干脆直接使用缩进来体现分支内外的区分,这样就可以既做到计算机层面的声明又做到代码阅读者层面的声明。(这也太妙了)
#补充
有的时候我们会遇到一些简单的分支,这些时候我们写冒号括号大括号这些东西的时间都会比实际操作麻烦,所以两种语言分别提供了一些简单的操作。
##c语言偷懒
在条件下只有一个操作时,可以省略大括号,也可以写到同一行
#include <stdio.h>
int main()
{
int a = 0;
if (a==0)printf("1");
}
使用?: 的操作
<表达式1>?<表达式2>:<表达式3>
表达式1为真,返回表达式2,表达式1为假,返回表达式3
##python偷懒
<表达式1> if<表达式2>else<表达式3>
在满足表达式2的时候执行表达式1否则执行表达式3
#switch case
这是c语言独有的语句
switch(判断的表达式) {
case 情况1 :
statement(s);
break;
case 情况2 :
statement(s);
break;
default :
statement(s);
}
break和default不是必须的,break后不会判断下一个case,default是指没有case满足时则运行default。
当switch后面的变量值和case后面的常量值匹配相等后,case后面的代码将会被执行,直到break语句被执行后跳出switch代码块
一般在条件是等式而且分支较多时使用,例如:
#include <stdio.h>
int main () {
char grade;
scanf("%c", &grade);
switch(grade) {
case 'A' :
printf("A\n" );
break;
case 'B' :
printf("B\n" );
break;
case 'C' :
printf("C\n" );
break;
case 'D' :
printf("D\n" );
break;
case 'F' :
printf("F\n" );
break;
default :
printf("Invalid grade\n" );
}
return 0;
}