绝大部分编程语言都必须回答下面这几个基本问题:

1. 怎样暂存信息(变量)

2. 怎样进行数学计算、比较、逻辑运算

3. 怎样进行字符串处理

4. 怎样在代码中写注释

5. 怎样调用函数

6. 怎样根据信息做不同的处理(分支语句)

7. 怎样重复类似的工作(循环语句)

8. 怎样定义自己的概念(函数与对象)

9. 怎样把代码保存在不同的文件中(多文件)

在几乎每个程序中都涉及到这几个问题,我们将它称作一个编程语言的基本结构。

本节课讲后面4点。




python测试网络抖动 python获取网速_python测试网络抖动


06 分支语句

根据不同的情况做不同处理,这是智能的基础。即使在汇编语言中也有分支判断语句的存在。基本的语法规则是:如果某个条件成立,就执行某些语句;否则,就执行另外一些语句

什么叫做条件?所谓条件,就是一个判断,回答只有两种情况。回答是就代表条件成立,否就代表条件不成立。这种判断,既可以用上一教程中所提到的条件表达式(还可以用逻辑表达式进行组合)来表现,也可以用一个函数的返回值来表现。

python分支语句的语法是具有python特色的“冒号语句”。分支语句的结尾是半角冒号,下一行是满足条件后执行的语句,必须缩进若干空格(推荐统一缩进4个空格,不使用TAB键)。在python中,冒号语句是最常用的一种特殊语句格式,在后面的循环语句和函数定义语句中都会用到。

比如判断一个数字a的奇偶性,可以用下面的语句来表现:

a=32             #a的值可以改动if a%2==0:    print('这个数字是偶数')else:    print('这个数字是奇数')

其中的%,我们在前一教程中讲过,是取余数的意思。这个程序的含义是如果这个数字除以2的余数为0,那么就是偶数;否则就是奇数。

这里else,代表所有不满足条件的情况。如果我们想在不满足条件时做进一步的区分,python提供了一个elif语句,显然就是将else和if结合起来了。比如判断数字a的正负性,可以用这样来表现:

a=-5             #a的值可以改动if a>0:    print('这个数字是正数')elif a==0:    print('这个数字是零')else:    print('这个数字是负数')

07 循环语句

所谓循环语句,就是在一定条件下,反复做一件事。对于编程语言来说,一般提供两种循环语句的表现方式:第一种是固定次数的循环第二种是符合某种条件下的循环。按说,第一种循环本质上是包含在第二种循环中的,可以由第二种循环方式替代。但为了使用方便,几乎所有的编程语言都为第一种循环方式提供了专门的语法,而且在实际使用中,第一种循环的使用频率也远高于第二种

循环语句的格式,也是冒号语句

我们先看第一种固定次数循环的一个例子,显示一个数字的所有因子:

a= 50             #a的值可以改动for i in range(1,a):    if a%i==0:        print(i)


python测试网络抖动 python获取网速_循环语句_02


很多循环语句都会与分支语句嵌套使用,这是很合理的,它的含义是:从整个数据集合中找出符合某个条件的数据,这是计算机的基本能力。

这里的range(1,a)的含义是从1到a-1的所有数字,通过for语句逐个将这些数字赋给变量i,这里i称为循环变量。我们注意到这里的因子输出,没有包含自身(50),这是range函数自身的特征决定的,如果我们希望包含50在内,可以把语句改为range(1,a+1)。

第二种循环方式叫做while语句,也是冒号语句。我们看看怎样用它来计算同样的需求:

a= 50             #a的值可以改动i=1while i<=a:    if a%i==0:        print(i)    i+= 1

在这种情况下,语句数量明显多了一些。必须给变量i赋予一个初值1,并且必须明确地在每次循环对i做+1的运算。这里的语句i+=1,就是i=i+1的语法缩写。或许你明白了为什么for循环虽然在逻辑上可以被while循环替代,但几乎在所有编程语言中都保留了自己的一席之地——在进行固定次数循环的时候,它的使用简单而含义明确。

08 函数与对象定义

如果描述所有事情都必须重头讲起,那我们的沟通就会大受限制。在自然语言中,人类发明了成语,把一个故事所蕴含的意思用一个词汇表达出来。比如我们大家如果都了解刻舟求剑的故事,在描述类似的情况时,就不用每次都把它讲述一遍了,一个词语就说明了问题。函数和对象,就是为了起这个作用:提供了一种抽象方式。

函数

函数的功能大致可以分为两类:一类是为了做一件事(改变世界),一类是为了获得一个结果(不改变)。比如创建一个文件,就是做事的函数;而获得一个文件的创建时间,就是获得结果的函数。一般来说,获得结果的函数可以多次调用并且得到返回值不变(但获取随机数、获取当前时间这种就是为了获取变化值的函数,当然返回的数值不可能不变,但多次调用仍然是安全的)。而做事的函数,每次调用产生的作用都会不同,一般不能多次调用。

在python中,这两类函数的区别更多是在含义上,而形式上则没有区别。定义也是通过冒号语句来实现的。

比如我们求解一个韩信点兵问题:今有物不知其数(但不超过105),三三数之余二,五五数之余三,七七数之余二。问物几何?

用计算机遍历求解是很容易的,我们只须遍历从1到105的每个数(使用range(1,106)的for循环),在判断这个数字是否符合题目预定的条件就可以了。由于题目给定的条件比较复杂,我们在这里定义一个函数就比较清晰。

def check(a):    if a%3==2 and a%5==3 and a%7==2:        return True    else:        return Falsefor i in range(1,106):    if check(i):        print(i)

程序中,函数check,对输入的a进行检测,如果满足除以3余2,除以5余3,除以7余2的条件,则返回,否则返回。这个函数,就起到了条件判断的作用。

在循环中,只须用for循环语句逐个检测从1到105的每个数字,并用if分支语句进行检测,如果满足这个条件,将它输出就可以了。

对象

接下来,对象定义是什么?对象提供了一种更高水平的抽象。目前我们只须了解,它仍然是用冒号语句来定义的即可。

还是用前面的这个韩信点兵的例子。

class HanXin:    def __init__(self, y3, y5, y7):        self.y3= y3        self.y5= y5        self.y7= y7              self.calc()    def check(self, a):        if a%3==self.y3 and a%5==self.y5 and a%7==self.y7:            return True        else:            return False    def calc(self):        for i in range(1,106):            if self.check(i):                self.result= ih1= HanXin(2,3,2)print(h1.result)

我们注意到,在class韩信(HanXin)中,我们定义了三个函数,第一个名字比较奇怪,是初始化函数,第二个和第三个与我们前面的函数类似,但略有改动。对象的定义是比较复杂的,但最后的主程序则非常简单,初始化一个韩信点兵问题:h1= HanXin(2,3,2),三个参数分别代表除以3、5、7的余数,然后直接输出结果(h1.result)就可以了。

更多关于对象的使用,等我们能够用到时再细讲。

09 多文件

稍微复杂一点的程序,都不能在一个源代码文件(*.py)中完成,否则这个文件就太大了,不便于修改、查看和多次使用。

python系统本身提供了大量的源代码文件,提供了各种各样的功能。在开源世界中,有许多人写了更多的源代码,提供了更多的实用功能。为了使用这些功能,都用到多文件技术。在python中,用法是非常简单的。

import 文件名#或者from 文件名 import *

这里的“文件名”不带py的扩展名。

第一种写法,使用该文件中所有函数和全局变量的时候,在前面加文件名.函数即可;而后一种写法,则相当于把该文件的所有内容都合并过来了,虽然使用起来更加方便,但也增加了重名的可能。我们现在只须了解它的基本语法,在后面课程的编程学习中,我们在具体应用几次后,很容易就能掌握了。


python测试网络抖动 python获取网速_python 3 测试无线网速编程_03