前景
接到一个新的编程任务,
要求用Python编写一个计算自然数n阶乘的程序,用于学生利用计算机来计算n的阶乘。
阶乘:也是数学里的一种术语;
阶乘指从1乘以2乘以3乘以4一直乘到所要求的数;
在表达阶乘时,就使用“!”来表示。如h阶乘,就表示为h!
程序启动后,程序在Shell窗口输出提示信息“请输入一个自然数,输入quit可退出程序:”,学生输入一个自然数,程序计算自然数的阶乘,并将计算结果输出到Shell窗口。程序再次输出“请输入一个自然数:”,等待学生的下次输入。
程序需要判断学生输入的是否是自然数,如果不是自然数,再判断是否是quit,若是quit退出程序,否则程序输出错误提示“输入错误,请输入一个自然数或者输入quit退出程序”。
程序的输入是自然数n,是整数类型,输入的来源是学生在程序运行过程中通过程序输入。程序获取用户的输入可以使用input函数,input函数返回的是字符串,如果需要输入整数,可以使用int函数将字符串转换为整数。
程序的输出是自然数n阶乘的结果,在程序中通过print函数来输出自然数n阶乘的结果
在流程图中,计算自然数的阶乘步骤属于子过程,后面会给出这个子过程的流程图。
在流程图中,当用户输入quit时程序退出。在其它情况下,程序要保持运行状态,等待用户的输入。前面已经学习了如何让程序一直保持运行状态,可以使用while循环来保持程序的运行状态。
准备使用while循环来保持程序的运行状态,循环条件为True,循环体为计算自然数阶乘的代码,在循环体中需要判断学生输入的是否是quit,如果是quit,调用break语句退出循环,程序结束。
还要解决一个问题,就是如何判断学生输入的内容是否是自然数。自然数都是由数字组成的,程序只需要判断学生输入的内容是否全部是数字就可以,如果全部是数字,再使用int函数将输入的内容转换为整数即可。
Python的input函数返回的输入内容是字符串,字符串的isdigit方法用于判断字符串内容是否全部是数字,如果字符串内容全部是数字返回True,否则返回False。
最后一个要解决的问题就是如何计算自然数n的阶乘。要用程序计算自然数n的阶乘,首先要了解自然数n阶乘的计算过程,然后再把计算过程用程序来实现。
准备编写一个factorial函数来实现自然数n的阶乘运算,函数有一个参数n,调用factorial函数时,需要传入参数n。
首先创建一个存储阶乘运算结果的变量result,变量初始值为1,然后使用循环范围为1至n的for循环来计算自然数n的阶乘,在每轮循环中,result都会与循环变量相乘并将乘积结果再赋值给result,当for循环结束时,result的值就是自然数n阶乘的运算结果。
factorial函数代码如下:
还有一个比较疑惑的问题,就是定义函数的代码从哪条语句开始执行?例如下面的代码:
在上面的代码中,第1条到第5条语句是函数factorial的函数体代码,第6条语句是factorial函数体之后的代码。
程序运行后,是先执行factorial函数?还是执行factorial函数体之后的第6条语句呢?
当代码包含定义的函数时,Python解释器不会自动执行函数代码,只有代码中的语句调用函数时,Python才会执行函数代码。因此上面的程序运行后,会先执行第6条语句,第6条语句调用了factorial函数,Python解释器再执行factorial函数代码。
解决了上面的问题后,开始编写代码。
''' 模块文件:case01.py 功能描述:计算自然数n的阶乘 代码编写时间:2020/04/06 作者:编程训练营 ''' # 定义阶乘函数factorial def factorial(n): result = 1 for i in range(1,n+1): result *=i return result # 程序入口 if __name__ == '__main__': while(True): # 输入提示信息 num = input("请输入一个自然数,输入quit可退出程序:") # 判断num是否全部是数字 if num.isdigit(): # 调用factorial函数计算num的阶乘 print("%s的阶乘为:%d" % (num,factorial(int(num)))) # 判断num是否等于quit,如果是quit跳出循环 elif num == "quit": break; # 输出错误信息提示 else: print("输入错误,请输入一个自然数或者输入quit退出程序")
代码解读
在三个单引号“'''”之间的内容是注释,如果是多行注释可以使用三个单引号“'''”封闭起来。Python的一个代码文件也称为一个模块,一般来说Python程序由一个模块或多个模块组成,在模块开始部分需要对该模块进行注释,注释的内容主要是模块的文件名称、功能说明、创建时间、作者等。
factorial是定义的阶乘函数,用于计算自然数n的阶乘,该函数有一个参数n,调用该函数时需要传入参数n。
语句“if __name__ == '__main__'”,用于表示该模块为直接执行模块,也可以说是主模块。前面说过,一个Python程序由一个模块或多个模块组成,在这些模块中,只有一个是主模块,该主模块将被python解释器直接执行模块中的代码,其它模块只有被主模块的代码调用后才会执行。
__name__是Python系统变量,__name__被赋值为“_main_”,表示该模块是主模块,其它模块可赋值为模块名称。
为了保持程序的运行状态,代码使用了while循环结构,循环条件为True,在循环体中有跳出循环体的语句,如果学生输入的是“quit”,调用break语句退出循环。
在循环体中,创建num变量存储学生输入的内容,input返回的是字符串,因此num是字符串类型的变量,可以调用字符串的isdigit方法,来判断num存储的内容是否全部是数字,如果是数字,调用factorial函数计算num的阶乘,并输出计算结果,否则输出错误信息提示。