函数和函数式编程

要求掌握函数编程: 

  1. 函数的全局变量、局部变量
  2. 函数参数传递
  3. 递归函数
  4. 求反素数
  5. 程序流程图分析

实验内容:

(1)使用函数编程实现阶乘计算

(2)使用函数编程实现斐波那契数列计算

(3)命名函数的使用

(4)多类型参数函数

(5)求反素数

(6)井字棋游戏案例分析

函数的基本介绍:

在Python中,函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。¹

Python函数分为四类:内置函数,标准库函数,第三方库函数和用户自定义函数。内置函数如`str()`、`list()`、`len()`等可以直接使用;标准库函数需要通过`import`语句导入库后使用;第三方库函数需要下载安装后通过`import`语句导入并使用;用户自定义函数则是用户根据自身需求定义的。

你可以通过定义一个函数来创建它,然后在你的代码中调用它。例如:

def my_function(param1, param2):
    result = param1 + param2
    return result

my_result = my_function(1, 2)
print(my_result)


这个例子中,我们定义了一个名为`my_function`的函数,它接受两个参数`param1`和`param2`,并返回它们的和。然后我们调用这个函数,并将结果存储在变量`my_result`中,最后打印出来。你可以根据需要定义和使用不同类型的函数。

(1)使用函数编程实现阶乘计算:

(1)编写程序,定义一个求阶乘的函数fact(n),并编写测试代码,要求输入整数n(n≥0)。
要求使用递归方式实现。
def fact(n):
    if n==1:
        return n
    else:
        return n*fact(n-1)

n=int(input())
print(fact(n))

(2)使用函数编程实现斐波那契数列计算

思考:关于遇见怎么使用递归。

上一个返回:n*fact(n-1)

这一个返回:fib(n-1)+fib(n-1)

为什么上一个使用n*fact(),因为递归要设置最小值,而我们的最小值是可以定位到0的,所以不能使用fact(n)。

(2)编写程序,定义一个求Fibonacci(斐波那契)数列的函数fib(n),并编写测试代码,
输出前20项(每项宽度5个字符位置,右对齐),每行输出10个。
def Fib(n):
    if n<2:
        return n
    else:
       return Fib(n-1)+Fib(n-2)  ##要点就是从最小的一个值开始可以有值读取。


for i in range(20):
    if i%10==0:
        print()
    print('{:>5}'.format(Fib(i)),end=' ')
//注意大于号是右对齐,小于号是左对齐

提升:关于每换十行打印一次换行,一开始的想法是每遍历10次打印一次,但做不出来,这种想法考虑的是遍历相当于加法一样,更好的方式是通过取余运算。

(3)命名函数的使用

编写程序,利用可变参数定义一个求任意个数数值的最小值的函数min_n(a,b,*c),
并编写测试代码,如”print(min_n(8,2))”和”print(min_n(16,1,7,4,15))”的测试代码。
def min_n(a,b,*c):
    result=a if a<b else b
    for num in c:
        result=num if num<result else  result
    return result


print(min_n(8,2))
print(min_n(16,9,7,3,15))

(4)多类型参数函数

(4)编写程序,利用元组作为函数的返回值,求序列类型中的最大值、最小值和元素个数,
并编写测试代码,
假设测试数据分别为s1=[9,7,8,3,1,55,6],s2=[“apple”,”pear”,”melon”,”kiwi”],s3=”TheQuickBrownFox”。
def tup(s):
    MAX=max(s)
    MIN=min(s)
    num=len(s)

    return (MAX,MIN,num)

s1=[9,7,8,3,1,55,6]
s2=["apple","pear","melon","kiwi"]
s3="TheQuickBrownFox"
print(tup(s1))
print(tup(s2))
print(tup(s3))

(5)求反素数

编写程序,求反素数(逆向拼写的素数)。反素数是指一个将其逆向拼写后也是一个素数的非回文数。
例如:
13和31都是素数,且13和31都不是回文数,所以,13和31是反素数。
输入一个正整数 n , 请在同一行输出从小到大排列的的前n个反素数,每个数字后面加一个空格。
def is_prime(n):
    for i in range(2,n):
        if n%i==0:
            return False
    return True

def non_prime(n):
    string=str(n)
    string=string[::-1]
    if is_prime(int(string)):
        if int(string)==n:
            return False
        else:
            return True

n=int(input())
lit=[]
i=0
while len(lit)<n:
    if is_prime(i) and non_prime(i):
        lit.append(i)
        print(i,end=' ')
    i+=1

这里要注意要求是打印输出n个数。

那肯定是要用到循环的,而我们的定义函数只判断是否是素数和非回文数。

如果要打印输出十个数,

一开始我的想法是使用while循环(这个想法很好,因为我们不知道打印前n个数到底需要遍历多少个数字)。但也卡在这里,没想到怎么定义它才只打印输出前n个项。

后来,通过使用len函数,并使用appen的函数,使用长度作为限定解决了问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值