程序员小A下班回家,老婆打来电话

“家里来客人了,去菜市场买个西瓜。如果有西红柿的话,买两个。”

结果菜市场有西红柿,但小A却买了2个西瓜,没有买西红柿。而小A老婆的意思显然是如果没有西红柿就买1个西瓜,如果有西红柿,就买1个西瓜和2个西红柿。

流程图。因为图形往往比文字更清晰,更容易理解。


买西瓜打折python 用python卖西瓜问题while_python


在上面的流程图里。有4种不同的图形。

黑色实心圆:表示流程的开始。

黑色非实心圆:表示流程的结束

橙色长方形:表示一个具体的行动,做一件具体的事情。

绿色菱形:表示一个判断。

从流程图可以清晰地发现,小A老婆的意思是先买西瓜,然后看是否有西红柿,有的话,买2个西红柿;而小A则把是否有西红柿这个判断条件作为买1个还是2个西瓜的条件。

条件语句


条件语句

如下图,python里的条件语句和实现中条件判断的逻辑是完全一致的。


买西瓜打折python 用python卖西瓜问题while_条件语句_02


具体的python语法是:


if 判断条件:
    执行语句1……
else:
    执行语句2……


以小A买西瓜为例,我们假设函数 haveTomatoes()可以返回是否有西红柿,那么具体的程序就是


if haveTomatoes():
    print('buy 2 watermelons')
else:
    print('buy 1 watermelon')


条件语句的语法很简单,不过还是有几点需要注意:

比较运算就可以作为判断条件语句。

比如,比较a,b两个数字的大小,如果a大于b,则打印“a比b大”,否则打印“a比b小”。


a = 1/3
b = 0.3
if a>b :
    print('a is bigger than b.')
else:
    print('a is smaller than b.')


缩进。(在我们的开发环境里,打了冒号之后回车换行,会自动缩进。)

3.如果有多个条件分支时,可以用如下的语法。


if 判断条件1:
    执行语句1……
elif 判断条件2:
    执行语句2……
elif 判断条件3:
    执行语句3……
else:
    执行语句4……



循环语句

现实生活中,除了判断逻辑外,还有一种常见的逻辑,就是当条件满足的时候,反复做相同的事情。

程序员小A的儿子很调皮,今天又闯祸了。气急之下,小A要揍儿子,而小A老婆则在一旁煽风点火,还帮着计数,说要揍满100下。


买西瓜打折python 用python卖西瓜问题while_python_03


流程图直观地说明。


买西瓜打折python 用python卖西瓜问题while_条件语句_04


现实中,每次揍孩子之前,都需要先判断一下,是否已经揍满了100下,如果没有,才继续揍,否则就结束。

死循环

循环语句来表示现实生活中的循环逻辑。

while循环,for循环

以小A打孩子为例,while循环的写法如下。


count = 0 
while count <= 100:
    print('hit the baby!')
    count += 1


注意 count += 1 等效于 count = count + 1。

这个语句一定要加上,要不就是死循环,小A的儿子怕是会被打死。

那么for循环怎么写呢?


for count in range(1,101):
    print('hit the baby!')


和while循环相比,for循环只需要2句,更为简洁。

内置函数 range()

while循环就像是小A边揍孩子边计数,而for循环,小A只管揍,计数的工作交给了妈妈range()。

在上面的程序里,range(1,101) 相当于半闭半开区间 [1,101),就是从1到100。所以不需要额外再写 count += 1。

range()还有其它几种写法。

range(100) 等效于 range(0,100),相当于 [0,100)

range(1,101,2),后面的2表示步长。相当于 1,3,5,7 …… 99。

甚至还可以反过来计数

range(100,1,-2),相当于 100,98,96 …… 2。


高斯的故事

“数学王子”高斯有一个大家耳熟能详的小故事。计算从1加到100。


买西瓜打折python 用python卖西瓜问题while_python_05


如果不使用高斯的方法,而是使用python的循环语句从1加到100要怎么做呢?


result = 0 
for i in range(1,101):
    result = result + i


要理解一下result在程序里起的作用。


计算自幂数

自幂数是指一个 n 位数,它的每个位上的数字的n 次幂之和等于它本身。比如 153 = 1**3 + 5**3 + 3**3,是一个3位数的自幂数,也称水仙花数。

求所有的水仙花数。

注:广义的水仙花数只要每个位上的数字的3次幂之和等于它本身。但这里我们只求3位数的水仙花数。

注:4位自幂数叫四叶玫瑰数,5位自幂数叫五角星数,6位自幂数叫六合数,7位自幂数叫北斗七星数,8位自幂数叫八仙数,9位自幂数叫九九重阳数,10位自幂数叫十全十美数。