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