fasionchan

读万卷书,行万里路,品万味肴,撸万行码。

控制流

QQ交流群:Python爱好者,群号:278378402

if

工作后,必可避免地要交个税,个税怎么算呢? 如下表,不同的区段按照不同的税率梯级计算:

根据以上税率表,5000块的应纳税所得需要交多少税呢?

1
2
>>> 5000 * 0.20 - 555
445.0

等等,这样算不是还要人参与去判断到底执行哪个公式吗? 如果要计算机帮忙判断计算方式,要怎么做呢? 在Python里,可以用if语句。 if语句接一个逻辑判断表达式,如果表达式判定为真,则执行if下的代码块。 下面看一段代码:

1
2
3
4
5
>>> a = 0
>>> if a == 0:
...     print('a is zero')
...
a is zero

代码中先定义了一个变量a,值为0。 然后通过判断a的值是否等于0,如果是(真),则答应a is zero。 注意到一个新操作符==,这是一个逻辑判断操作符,比较两个操作数是否相等,相等则返回真,不等则返回假。

a的值赋为1,很显然易见,程序就不会输出a is zero了:

1
2
3
4
5
>>> a = 1
>>> if a == 0:
...     print('a is zero')
...
>>>

if语句还可以跟else语句配合使用,在判断逻辑判断表达式判断为假的时候执行。

1
2
3
4
5
6
7
>>> a = 1
>>> if a == 0:
...     print('a is zero')
... else:
...     print('a is not zero')
...
a is not zero

也很好理解不是?

elif语句配合,可以进行多次逻辑判断:

1
2
3
4
5
6
7
8
9
>>> a = 1
>>> if a == 0:
...     print('a is zero')
... elif a == 1:
...     print('a is one')
... else:
...     print('a is other value')
...
a is one

只有前一个判断为假,才会进入下一个判断。 因此,上面第一个if语句先判断,由于a1而不是0,判断结果为假。 这是进入elif判断,这时结果为真,开始执行elif下的代码块,屏幕打印出a is oneelif判断为真了,再往下的所有elif都不会再判断了,else代码块也不执行了。

掌握了ifelifelse等语句之后,我们可以让计算机判断计算方式了。 先定义一个变量5000,判断是否超过80000,是的话按照45%税率计算; 如果不是,再判断是否超过55000,以此类推。 最后,在amount不超过1500的情况下,按照3%的税率计算:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> mount = 5000
>>> if amount > 80000:
...     tax = amount * 0.45 - 13505
... elif amount > 55000:
...     tax = amount * 0.35 - 5505
... elif amount > 35000:
...     tax = amount * 0.30 - 2755
... elif amount > 9000:
...     tax = amount * 0.25 - 1005
... elif amount > 4500:
...     tax = amount * 0.20 - 555
... elif amount > 1500:
...     tax = amount * 0.10 - 105
... else:
...     tax = amount * 0.03
...
>>> tax
445.0

好了,那么现在想算应纳税所得10000元需要纳多少税怎么操作呢? 将上一段代码改一个,amount赋值改成10000,搞定了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> amount = 10000
>>> if amount > 80000:
...     tax = amount * 0.45 - 13505
... elif amount > 55000:
...     tax = amount * 0.35 - 5505
... elif amount > 35000:
...     tax = amount * 0.30 - 2755
... elif amount > 9000:
...     tax = amount * 0.25 - 1005
... elif amount > 4500:
...     tax = amount * 0.20 - 555
... elif amount > 1500:
...     tax = amount * 0.10 - 105
... else:
...     tax = amount * 0.03
...
>>> tax
1495.0

不会吧,要重新输入十几行代码,就算是可以复制粘贴也很烦躁呀! 当然有更加科学的方法,在函数一节,你会看到如何通过函数来组织一个可以复用的代码单元。

for

有一个由单词组成的list,逐一输出,一行一个:

1
2
3
4
5
6
7
8
>>> # 计算单词长度
... words = ['tiger', 'elephant', 'wolf']
>>> print words[0]
tiger
>>> print words[1]
elephant
>>> print words[2]
wolf

如果list里有100个,甚至是成千上万个单词该怎么办! 计算机程序提供一种循环机制,通过这个机制,可以将某段代码执行指定次数。 在Python,有两种语句可以实现循环,先来看看for-in语句。 这个语句用来循环操作可迭代对象(一般是容器对象或者生成器),先看一个例子:

1
2
3
4
5
6
>>> for w in words:
...     print(w, len(w))
...
tiger 5
elephant 8
wolf 4

这个例子的意思是,对于words列表里的每个单词w,执行下面的代码块(缩进部分)。 不管words列表包含多少个单词,都可以通过这两行代码完成输出。 看到没有,这就是批量执行的威力!

while

Python提供的另一个循环机制是while语句。 while后面接一个逻辑判断表达式,Python执行到while语句时,判断表达式是否为真。 如果为真,则执行下面的代码块,代码块执行完毕后再次判断,如果为真再执行一遍,依次循环。 这时,你可能注意到问题了:如果表达式一直为真,就没完没了了吗? 是的,这就是死循环。 因此,代码块里需要有代码可以影响表达式的求值,使循环有机会退出。

接下来,看一个例子,从0开始打印到9(包括):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>>> i = 0
>>> while i < 10:
...     print(i)
...     i = i + 1
...
0
1
2
3
4
5
6
7
8
9

首先,定义了一个变量i,值为0。接着,执行到while一行,先判断i是否小于10,结果是肯定的。 开始执行下面的代码块,输出i并且给i1(因为下一个要输出的值是1了)。 也正是这一行,改变了i的值,进而影响下一次while逻辑表达式的求值。 代码块执行完毕了,又回到while一行进行判断。 这时,i的值已经是1了,还是小于10,又开始执行代码块。

循环什么时候退出呢?当i9时,还是满足条件,代码块还会执行。 但这是最后一次了,因为代码块执行后,i的值是10已经不满足条件了。 不信,你自己看看:

1
2
>>> i
10

range()函数

1输出到9例子中可以看到,数字序列在编程中还是很常用的。 Python有一个内置函数,可以用来生成数字序列(不知函数为何物请看这里):

1
2
3
4
5
6
7
8
>>> for i in range(5):
...     print(i)
...
0
1
2
3
4

range默认从0开始,直到给定数(不包含)。 还可以指定起点:

1
2
3
4
5
6
>>> for i in range(2, 5):
...     print(i)
...
2
3
4

也可以指定步长:

1
2
3
4
5
6
7
8
>>> for i in range(0, 10, 2):    # 偶数
...     print(i)
...
0
2
4
6
8

注意,要指定步长的话,一定要指定起点。 不然,同样是两个参数,range怎么直到到底是指定了起点,还是指定了步长?

pass

pass语句可以认为是一个空指令,什么不不做。 奇怪了,什么都不做,那就什么都不写,不行吗? 还真不行。有些时候还真需要一个空语句,语法结构才完整。

举个例子,你有一个单词组成的列表,想循环对每个单词进行处理。 但是,你还没想好怎么处理,这时候该怎么办呢?

1
2
3
for w in words:

a = 'python'

很明显,for-in语句下没有一个代码块与其对应,Python要报语法错误了。 这时,pass来了:

1
2
3
4
5
for w in words:
    pass

a = 'python'
print(a)

一个空语句,让for-in拥有属于自己的代码块。 虽然这个代码块只有一条空语句,什么都没做,但是至少结构完整了。 程序可以运行起来,调试其他部分,等你想好了处理逻辑怎么写,再换掉pass语句。 比如,以首字母大写输出:

1
2
3
4
5
for w in words:
    print(w.capitalize())

a = 'python'
print(a)

Comments