Python_ONLINE_习题集_02 函数封装
2.1 封装函数实现如下要求
例如:输入2,5
则求:2 + 22+222 + 2222+22222的和
参考答案: https://www.bilibili.com/read/cv4185619
def demo(f):
def func(x,y): #定义内层函数(即装饰的功能函数),两个功能:一个是打印出式子,另一个是计算结果
Str = "" #空字符串,用来生成一个字符串,实现第一个功能 "x + xx + ... + x...x ="
for i in range(1, y + 1): #这里renge(a,b,k=1)包左不包右,步长k默认为1
Str += str(x) * i #利用字符串的加法运算将字符串连接起来(利用字符串乘法重复运算)
if i == y: #使用条件语句连接完数字后再连接一个加号,但在最后一个后面连接等号
Str += "="
else:
Str += "+"
sum = 0 #通过累加计算以上数学运算式子的值
for j in range(1, y + 1): #这里的range()序列遍历主要为第j个x的长度
sum += int(str(x) * j)
return f(Str,sum) #这是个函数表达式,Str和sum已经通过外层返回的函数名计算出来了,传递给f()函数执行出最终结果
return func #返回内层函数名主要是通过内层函数计算出Str和sum的值传递到f()函数中执行
# @demo #如果执行此句,后面无需a=dimo(f)来间接调用,可直接f(8,10)执行出结果
def f(a,b):
print(a,b)
a = demo(f) #可以直接写dimo(f)(8,10)同样可以执行出结果
a(8,10)
a(5,6)
a(2,2)
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 判断某个数是否是素数,返回结果
def demo(f): #定义装饰器函数
def func(num): #定义一个内层功能函数
if num == 1: #特殊情况
num= "既不是素数也不是和数"
elif num == 2: #2不能放在下面的for循环中,因为range(2,2)是个空序列,会直接不执行循环体
num = "否"
elif num > 2:
for i in range(2,num): #遍历2~(num-1)每个数试探,如果期间存在一个数能整除num,则它不是素数
if num % i == 0:
num = "否"
break #判断完毕,终止并跳出循环语句
elif i == num-1: #如果循环语句都遍历到num-1了就可以肯定它就是素数
num = "是"
return f(num) #通过外层函数返回的函数名再加上括号就能算出num的值,传递给p来执行judge_prime_num()函数
return func
@demo
def judge_prime_num(p):
print("您输入的这个数是否为素数?——%s"%p)
judge_prime_num(25)
judge_prime_num(13)
judge_prime_num(101)
judge_prime_num(1)
您输入的这个数是否为素数?——否
您输入的这个数是否为素数?——是
您输入的这个数是否为素数?——是
您输入的这个数是否为素数?——既不是素数也不是和数
2.3 计算2-100之间素数的个数,返回结果
def demo(f): #定义一个外层函数
def func(): #在外层函数内定义一个函数(该函数主要实现所需要封装的功能),因为指定2~100内,所以不需要形参
sum = 0 #后面通过sum+=1来统计素数的个数
for i in range(2, 101): #从2~100中取数,后面挨个判断是否为素数
for j in range(2, i): #该循环体从2到i-1中挨个取数,若存在一个数能整除i,则i不是素数,若j取到了i-1,说明i只被1和它本身整除
if i % j == 0:
break
elif j == i-1:
sum += 1 #当j都取到i-1了还找不到整除i的数,则i是素数,此处对sum+1进行累计
return f(sum+1) #因为当i=2时,range(2,2)为空,循环无法进行,直接结束了,所以2被漏掉了,所以sum+1将2补回来
return func() #在调用f1时,通过返回
# @f1
def f(p):
print("2~100内有%d个素数"%p) #func()函数无形参为何此处有?因为他需要传递统计的结果
demo(f) #该语句的意思就是用f1()函数装饰f()函数的意思,因为@具备此功能就将此注释掉了 """
(1)通过语句f1(f)调用f1函数,注意f1(f)是一个函数运算表达式,他需要执行f1()函数,得到的值为f2()
(2)f2()是内层函数运算表达式,它也是有值的,它的值是f(sum+1),这个仍然是函数运算表达式,它的值是什么???
(3)在内层函数中我们通过语句运算已经得出了sum+1=25,也就是说f1(f)最终的返回值是f(25),它仍然还是个函数表达式,继续调用函数运算
(4)执行f函数得到最终结果>>2~100内有25个素数
"""
您输入的这个数是否为素数?——否
您输入的这个数是否为素数?——是
您输入的这个数是否为素数?——是
您输入的这个数是否为素数?——既不是素数也不是和数
2.5 交换某两个变量的值
def demo(f):
def func(x,y):
return f(y,x)
return func
@demo
def f (a,b):
print("a=%d,b=%d"%(a,b))
a=int(input("请输入第一个数a="))
b=int(input("请输入第二个数b="))
f(a,b)
请输入第一个数a=10
请输入第二个数b=90
a=90,b=10
2.6
2.7
2.8
Python_ONLINE_习题集_02 函数封装的更多相关文章
- c#读写共享内存操作函数封装
原文 c#读写共享内存操作函数封装 c#共享内存操作相对c++共享内存操作来说原理是一样,但是c#会显得有点复杂. 现把昨天封装的读写共享内存封装的函数记录下来,一方面希望给需要这块的有点帮助,另一方 ...
- [妙味JS基础]第九课:定时器管理、函数封装
知识点总结 函数封装 回调函数 实例:抖动函数 获取当前的位置 通过数组来实现,一正一负,直到恢复成0为止. 当前位置与数组中各值相加
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- XMLHttpRequest函数封装
XMLHttpRequest函数封装: function ajax(Url,sccuessFn,failureFn) { //1.创建XMLHttpRequest对象 var xhr = null; ...
- Appium python自动化测试系列之滑动函数封装实战(八)
8.1 什么是函数的封装 教科书上函数的封装太官方,我们这里暂且将函数的封装就是为了偷懒把一些有共性的功能或者一些经常用的功能以及模块放在一起,方便我们以后再其他地方调用.这个只是个人的理解所以大家懂 ...
- c++ 回调函数封装
std::function<void(int a,int b)> ha; //函数封装 当成参数用callback std::bind(&fun1,this,std::plac ...
- 定时器中的this和函数封装的简单理解;
一.定时器中的this: 不管定时器中的函数怎么写,它里面的this都是window: 在函数前面讲this赋值给一个变量,函数内使用这个变量就可以改变this的指向 二.函数封装 函数封装是一种函数 ...
- JS中深浅拷贝 函数封装代码
一.了解 基本数据类型保存在栈内存中,按值访问,引用数据类型保存在堆内存中,按址访问. 二.浅拷贝 浅拷贝只是复制了指向某个对象的指针,而不是复制对象本身,新旧对象其实是同一内存地址的数据,修改其中一 ...
- Ajax入门(二)Ajax函数封装
如果看了的我上一篇博客<Ajax入门(一)从0开始到一次成功的GET请求>的话,肯定知道我们已经完成了一个简单的get请求函数了.如下: 1234567891011121314151617 ...
随机推荐
- git每次更新都需要输入账号密码,如何解决?
//如果https请求pull每次都需要输入账号密码,则 git config --global credential.helper store 那么,在下一次更新,需要输入账号密码,然后git就 ...
- python基础练习题08
写一个登录程序,让用户输入账号和密码,输入用户和密码输入正确的话,提示你 xxx,欢迎登录,今天的日期是xxx,程序结束.错误的话,提示账号/密码输入错误, 最多输入3次,如果输入3次都没有登录成功, ...
- ESP8266--WIFI热点扫描
现在,通常,为了让手机连上一个WiFi热点,基本上都是打开手机设置里面的WiFi设置功能,然后会看到里面有个WiFi热点列表,然后选择你要的连接上. 基本上你只要打开手机连接WiFi功能,都会发现附近 ...
- ESP8266网络介绍
仔细分析上图,根据功能区分,可以分为: Arduino功能,把ESP8266 当做 Arduino来使用 SD —— SD卡库 Servo —— 伺服电机库 Wire —— I2C库 SPI —— s ...
- JMeter 功能挖掘之 WEB 文件导出
前言 自从写从0构建自动化测试平台(一)之技术选型开始,在工作中Get新技能就非常想郑重的记录下来,方便自己查阅:相信很多人都有这种感触:平时问题解决后,没有及时记录,下次遇到类似问题,需要花同等的成 ...
- SpringBoot的项目构建
手动构建SpringBoot项目 一.手动构建一个Maven,选择...webapp或者选择快速骨架生成,然后命名并生成项目: 二. 在pom.xml中,进行三处配置: 设置父模块,子模块就可以继承 ...
- 【BZOJ2118】墨墨的等式(同余最短路)
题意: 思路:From https://www.cnblogs.com/GavinZheng/p/11709153.html#4421510 写的1e9,int范围的 #include<bits ...
- css使用2
一.盒子模型 盒子模型 margin:用来调节盒子与盒子之间的距离(标签与标签之间距离) border:盒子的包装厚度(边框) padding:内部物体与盒子之间距离(文本与边框之间的距离) cont ...
- 微信小程序POST请求参数传递不到后台, 前台获取不到后端返回的数据, 以及 post 请求返回 404 但后台能收到数据
1 微信小程序POST请求参数传递不到后台 需要在微信请求 wx.request 改变默认 header 配置为如下 wx.request({ url: 'test.php', //仅为示例,并非真实 ...
- 后盾网lavarel视频项目---1、数据迁移
后盾网lavarel视频项目---1.数据迁移 一.总结 一句话总结: 1.lavarel的数据迁移比较简单,就是用php来创建数据表 2.创建迁移文件:php artisan make:migrat ...