1.编写两个函数分别按单利和复利计算利息,根据本金、年利率、存款年限得到本息和和利息。调用这两个函数计算1000元在银行存3年,在年利率是6%的情况下,单利和复利分别获得的本息和和利息。单利计算指只有本金计算利息。复利计算是指不仅本金计算利息,利息也计算利息,也就是通常所说的“利滚利”。如这题按单利计算本息和1000+1000×6%×3=1180元,其中利息为180元;按复利计算本息和1000×(1+6%)3=1191.016元,其中利息为191.016元。
money = float(input("请输入存款本金为:"))
year = int(input("请输入存款年份为:"))
rate = float(input("请输入年利率为:"))
def simple():
interest = money * rate * year
total = money + interest
print("单利计算利息为:", interest, "单利计算本息和为:", total)
def compound():
total = money * (1 + rate) ** year
interest = total - money
print("复利计算利息为:", "%.3f"%interest, "复利计算本息和为:", total)
simple()
compound()
2.编写函数,判断一个数是否为素数。调用该函数判断从键盘中输入的数是否为素数。素数也称质数,是指只能被1和它本身整除的数。
def function(x):
for i in range(2, x):
if x % i == 0:
print(x, "不是素数")
break
else:
print(x, "是素数")
n = int(input("请输入一个整数:"))
function(n)
3.编写函数,求出一个数除了1和自身以外的因子。从键盘输入一个数,调用该函数输出除了1和它自身以外的所有因子。
def function(x):
if x > 1:
for i in range(2, x):
if x % i == 0:
print(i,end=" ")
n = int(input("请输入一个整数:"))
print("该数除了1和自身以外的因子为:")
function(n)
4.编写函数,判断一个数是否为水仙花数。调用该函数打印出1000以内的所有水仙花数。水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身。例如:13+53+33=153,则153是水仙花数。水仙花数只是自幂数的一种,严格来说三位数的3次幂数才成为水仙花数。
def function(x):
a = x // 100
b = (x - 100 * a) // 10
c = x - 100 * a - 10 * b
if a ** 3 + b ** 3 + c ** 3 == x:
print(x, end=" ")
print("1000以内的水仙花数为:")
for i in range(100, 1000):
function(i)
5.编写函数求斐波拉契数列的前20项。斐波拉契数列的第1项和第2项分别是0和1,从第3项开始,每一项都是前两项之和。如:0,1,1,2,3,5,8,13,21…。试用递归函数实现。
def function(x):
if x == 1:
s = 0
elif x == 2:
s = 1
else:
s = function(x - 1) + function(x - 2)
return s
for i in range(1, 21):
print("斐波拉契数列的第", str(i), "项为:", function(i))
【实验总结】
1.函数的定义
函数是为实现一个特定功能而组合在一起的语句集,可以用来定义可重用代码、组织和简化代码。
函数定义格式如下:
def 函数名(形式参数):
函数体
函数通过def关键字定义,包括函数名称、形式参数、函数体。
函数名是标识符,命名必须符合Python标识符的规定;形式参数,简称为形参,写在一对圆括号里面,形参是可选的,即函数可以包含参数,也可以不包含参数,多个形参之间用逗号隔开;该行以冒号结束。
函数体是语句序列,左端必须缩进一些空格。
2.函数的调用
函数的定义是通过参数和函数体决定函数能做什么,并没有被执行。
而函数一旦被定义,就可以在程序的任何地方被调用。
当调用一个函数时,程序控制权就会转移到被调用的函数上,真正执行该函数;
执行完函数后,被调用的函数就会将程序控制权交还给调用者。
3.形参与实参
在函数定义中,函数名后面括号中列出的参数称为形式参数,简称形参。
如果形参的个数超过1个,各参数之间用逗号隔开。
在定义函数时,函数的形参不代表任何具体的值,只有在函数调用时,才会有具体的值赋给形参。
调用函数时传入的参数称为实际参数,简称实参。
4.函数的返回
函数的执行结果通过返回语句return返回给调用者。
函数体中不一定有表示返回的return语句。
函数调用时的参数传递实现了从函数外部向函数内部输入数据,而函数的返回则解决了函数向外部输出信息的问题。如果一个函数的定义中没有return语句,系统将自动在函数体的末尾插入return None语句。
5.位置参数
当调用函数时,需要将实参传递给形参。
参数传递时有两种方式:位置参数和关键参数。位置参数是指按照参数的位置来传递,关键参数是指按照参数赋值的形式来传递。
当使用位置参数时,实参和形参在顺序、个数和类型上必须一一匹配。前面示例中,调用带参数的函数时均使用位置参数的方式。
6. 默认参数与关键参数
函数的形参可以设置默认值。这种形参通常称为默认参数。Python允许定义带默认参数的函数,如果在调用函数时不为这些参数提供值,这些参数就使用默认值;如果在调用时有实参,则将实参的值传递给形参,形参定义的默认值将被忽略。具有默认参数值的函数定义格式如下:
def 函数名(非默认参数, 形参名=默认值, ……):
函数体
函数定义时,形式参数中非默认参数与默认参数可以并存,但非默认参数之前不能有默认参数。
7.可变长度参数
在前面的函数介绍中,我们知道一个形参只能接收一个实参的值。
其实在Python中,函数可以接收不定个数的参数,即用户可以给函数提供可变长度的参数。这可以通过在形式参数前面使用标识符*
来实现。
Python的函数形参中还提供了一种参数名前面加标识符**
的方式,用来引用一个字典。
函数调用者须以关键参数的形式为其赋值,形式参数得到一个以关键参数中变量名为key,右边表达式值为value的字典。
以**
为前缀的可变长度参数、以*
为前缀的可变长度参数、普通参数在函数定义中可以混合使用。这时,普通参数放在最前面,其次是以*
为前缀的可变长度参数,最后是以**
为前缀的可变长度参数。
8. 序列和字典作为参数
如果使用字典作为实参,则函数定义中的形参也是字典;
如果使用序列作为实参,则要满足下列两个条件之一:
函数中形参也是序列;
如果函数中形参是n个单变量,则在实参的序列变量名前加*
,要求实参序列中的元素个数与单变量形参个数相同;如果实参中普通变量与序列变量混用,则以*
为前缀的序列变量放置在实参的最后。
9. 变量作用域
变量的作用域是指一个变量能够作用的范围,也就是在多大范围内能够被解释器识别。
根据变量的作用域,变量可分为全局变量和局部变量。
声明在函数外部的变量,被称为全局变量,作用范围是所在程序文件内从定义开始至程序结束,包括变量定义后所调用的函数内部。
一般声明在函数内部的变量是局部变量,该变量只能在该函数内部使用,超出范围就不能使用。
也可以通过global关键词将函数内部的变量申明为全局变量,该变量可以在主程序中调用该函数后的剩余语句中使用。
10. 生成器函数
生成器其实是一种特殊的迭代器。这种迭代器更加优雅,不需要写__iter__()和__next__()方法,只需要在函数中使用一个yiled关键字以惰性方式逐一返回元素。
生成器一定是迭代器(反之不成立)。
Python 中使用了yield的函数返回生成器对象,此函数称为生成器函数,只能用于迭代操作。在调用该函数的过程中,每次遇到yield语句时,函数会暂停执行,并保存当前所有的运行状态信息,返回yield后面的值,并在下一次执行next()方法时从当前位置继续运行。生成器函数返回的是一个生成器对象。
11. lambda函数
lambda函数是一个匿名函数,有时也被称为lambda表达式,比def格式的函数定义简单很多。Lambda函数可以接收任意多个参数,但只返回一个表达式的值。lambda中不能包含多个表达式。
lambda函数的定义格式为:lambda 形式参数 : 表达式。其中形式参数可以有多个,它们之间用逗号隔开。表达式只有一个。返回表达式的计算结果。
以下例子中表达式左边的变量相当于给lambda函数定义了一个函数名。可以将此变量名作为函数名来调用该lambda函数。
12. 递归
函数内部可以调用其他函数。如果一个函数在内部直接或间接地调用自己本身,这是一种递归的方法。递归是一种非常实用的程序设计技术。许多问题具有递归的特性,在某些情况下,用其他方法很难解决的问题,利用递归可以轻松解决。
一个递归调用当达到终止条件时,就将结果返回给调用者。然后调用者进行计算并将结果返回给它自己的调用者。这个过程持续进行,直到结果被传回原始的调用者为止。
因此在编写递归函数的时候必须满足以下两点:
有明确的递归终止条件及终止时的值;
能用递归形式表示,并且向终止条件的方向发展。