Python_ONLINE_习题集_02 函数封装

2.1 封装函数实现如下要求

例如:输入2,5

则求:2 + 22+222 + 2222+22222的和

参考答案: https://www.bilibili.com/read/cv4185619

 1 def demo(f):
 2     def func(x,y):         #定义内层函数(即装饰的功能函数),两个功能:一个是打印出式子,另一个是计算结果
 3         Str = ""           #空字符串,用来生成一个字符串,实现第一个功能 "x + xx + ... + x...x ="
 4         for i in range(1, y + 1):  #这里renge(a,b,k=1)包左不包右,步长k默认为1
 5             Str += str(x) * i      #利用字符串的加法运算将字符串连接起来(利用字符串乘法重复运算)
 6             if i == y:             #使用条件语句连接完数字后再连接一个加号,但在最后一个后面连接等号
 7                 Str += "="
 8             else:
 9                 Str += "+"
10         sum = 0                    #通过累加计算以上数学运算式子的值
11         for j in range(1, y + 1):  #这里的range()序列遍历主要为第j个x的长度
12             sum += int(str(x) * j)
13         return f(Str,sum)   #这是个函数表达式,Str和sum已经通过外层返回的函数名计算出来了,传递给f()函数执行出最终结果
14     return func             #返回内层函数名主要是通过内层函数计算出Str和sum的值传递到f()函数中执行
15 # @demo                     #如果执行此句,后面无需a=dimo(f)来间接调用,可直接f(8,10)执行出结果
16 def f(a,b):
17     print(a,b)
18 a = demo(f)                #可以直接写dimo(f)(8,10)同样可以执行出结果
19 a(8,10)
20 a(5,6)
21 a(2,2)
22 demo(f)(3,6)

8+88+888+8888+88888+888888+8888888+88888888+888888888+8888888888= 9876543200
5+55+555+5555+55555+555555= 617280
2+22= 24
3+33+333+3333+33333+333333= 370368

2.2 判断某个数是否是素数,返回结果

 1 def demo(f):                       #定义装饰器函数
 2     def func(num):                 #定义一个内层功能函数
 3         if num == 1:               #特殊情况
 4             num= "既不是素数也不是和数"
 5         elif num == 2:             #2不能放在下面的for循环中,因为range(2,2)是个空序列,会直接不执行循环体
 6             num = ""
 7         elif num > 2:
 8             for i in range(2,num): #遍历2~(num-1)每个数试探,如果期间存在一个数能整除num,则它不是素数
 9                 if num % i == 0:
10                     num = ""
11                     break          #判断完毕,终止并跳出循环语句
12                 elif i == num-1:   #如果循环语句都遍历到num-1了就可以肯定它就是素数
13                     num = ""
14         return f(num)              #通过外层函数返回的函数名再加上括号就能算出num的值,传递给p来执行judge_prime_num()函数
15     return func
16 @demo
17 def judge_prime_num(p):
18     print("您输入的这个数是否为素数?——%s"%p)
19 judge_prime_num(25)
20 judge_prime_num(13)
21 judge_prime_num(101)
22 judge_prime_num(1)

您输入的这个数是否为素数?——否
您输入的这个数是否为素数?——是
您输入的这个数是否为素数?——是
您输入的这个数是否为素数?——既不是素数也不是和数

2.3 计算2-100之间素数的个数,返回结果

 1 def demo(f):                         #定义一个外层函数
 2     def func():                      #在外层函数内定义一个函数(该函数主要实现所需要封装的功能),因为指定2~100内,所以不需要形参
 3         sum = 0                    #后面通过sum+=1来统计素数的个数
 4         for i in range(2, 101):    #从2~100中取数,后面挨个判断是否为素数
 5             for j in range(2, i):  #该循环体从2到i-1中挨个取数,若存在一个数能整除i,则i不是素数,若j取到了i-1,说明i只被1和它本身整除
 6                 if i % j == 0:
 7                     break
 8                 elif j == i-1:
 9                     sum += 1       #当j都取到i-1了还找不到整除i的数,则i是素数,此处对sum+1进行累计
10         return f(sum+1)            #因为当i=2时,range(2,2)为空,循环无法进行,直接结束了,所以2被漏掉了,所以sum+1将2补回来
11     return func()                    #在调用f1时,通过返回
12 # @f1
13 def f(p):
14     print("2~100内有%d个素数"%p)  #func()函数无形参为何此处有?因为他需要传递统计的结果
15 demo(f)                             #该语句的意思就是用f1()函数装饰f()函数的意思,因为@具备此功能就将此注释掉了
16 
17 """
18 (1)通过语句f1(f)调用f1函数,注意f1(f)是一个函数运算表达式,他需要执行f1()函数,得到的值为f2()
19 (2)f2()是内层函数运算表达式,它也是有值的,它的值是f(sum+1),这个仍然是函数运算表达式,它的值是什么???
20 (3)在内层函数中我们通过语句运算已经得出了sum+1=25,也就是说f1(f)最终的返回值是f(25),它仍然还是个函数表达式,继续调用函数运算
21 (4)执行f函数得到最终结果>>2~100内有25个素数
22 """

您输入的这个数是否为素数?——否
您输入的这个数是否为素数?——是
您输入的这个数是否为素数?——是
您输入的这个数是否为素数?——既不是素数也不是和数

2.5 交换某两个变量的值

 1 def demo(f):
 2     def func(x,y):
 3         return f(y,x)
 4     return func
 5 @demo
 6 def f (a,b):
 7     print("a=%d,b=%d"%(a,b))
 8 a=int(input("请输入第一个数a="))
 9 b=int(input("请输入第二个数b="))
10 f(a,b)

请输入第一个数a=10
请输入第二个数b=90
a=90,b=10

2.6

2.7

2.8

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/liulian999/p/12081898.html
今日推荐