当前位置: 首页 > news >正文

要加强分院网站建设在哪个网站做科目一考试题

要加强分院网站建设,在哪个网站做科目一考试题,成都哪里有网站开发公司,如何做网站代理目录 一、生成器 1、生成器定义 2、生成器存在的意义 3、创建生成器方式一(生成器表达式) 4. 创建生成器方式二(生成器函数) 1. 生成器函数 2. 生成器函数的工作原理 5. 总结 1. 什么是生成器 2. 生成器特点 二、迭代器…

目录

一、生成器

1、生成器定义

2、生成器存在的意义

3、创建生成器方式一(生成器表达式)

4. 创建生成器方式二(生成器函数)

1. 生成器函数

2. 生成器函数的工作原理

5. 总结

1. 什么是生成器

2. 生成器特点

二、迭代器

1、概念

2、可迭代对象和迭代器区别

 3、for循环本质

4、创建一个迭代器

三、动态添加属性和方法

1、动态编程语言定义

2、运行过程中给对象添加属性和方法

3、给类动态添加静态方法以及类方法

四、限制动态添加

1、slots

1.  __slots__的作用

2. 对动态添加成员变量、成员方法有限制

3. 对动态添加类属性、类方法没有限制


一、生成器

1、生成器定义

        在Python中,一边循环一边计算的机制,称为生成器:generator

2、生成器存在的意义

        列表所有数据都在内存中,如果有海量数据的话将会非常消耗内存。

        例如:仅需要访问前面几个元素,那后边所有空间就浪费了

        如果列表元素按照某种算法推算出来,就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的 list ,从而节省大量的空间。

3、创建生成器方式一(生成器表达式)

        生成器表达式很简单,只要把一个列表推导式的 [] 改成 () ,就创建了一个生成器(generator):

L = [x * x for x in range(10)]  #推导式
print(L)
g = (x * x for x in range(10)) #加成括号就是生成器
print(g)
#<generator object <genexpr> at 0x1022ef630>
'''L是一个list,而g则是一个 generator'''

4. 创建生成器方式二(生成器函数)

1. 生成器函数

  • 如果一个函数中包含了 yield 关键字,那么这个函数就不再是一个普通的函数,调用函数就是创建了一个生成器(generator)对象
  • 生成器函数:利用关键字 yield 一次性返回一个结果,阻塞,重新开始

2. 生成器函数的工作原理

  • 生成器函数返回一个迭代器,for循环对这个迭代器不断调用 __next__() 函数,不断运行到下一个 yield 语句,一次一次取得每一个返回值,直到没有 yield 语句为止,最终引发 StopIteration 异常
  •  yield 相当于 return 返回一个值,并且记住这个返回的位置,下次迭代时,代码从 yield 下一条语句(不是下一行)开始执行
  •  send() next() 一样,都能让生成器往下走一步(下次遇到 yield 停),但 send() 能传一个值,这个值作为 yield 表达式整体的结果

测试生成器工作原理(yield)

'''
如果一个函数中包含 yield 关键字,那么这个函数就不再是一个普通函数,
调用函数就是创建了一个生成器(generator)对象生成器函数:其实就是利用关键字 yield 一次性返回一个结果,阻塞,重新开始原理
1. 函数有了yield之后,调用它,就会生成一个生成器
2. 下次从下一个语句执行,切记不是下一行(tmp = yield i)
3. return在生成器中代表生成器种植,直接报错:StopIeratation
4. next方法作用:唤醒并继续执行
'''
def test():print("start")i = 0while i<3:'''yield i #第一次执行,此处挂起;同时将i的值返回到i#第二次执行,从挂起的地方往下执行'''temp = yield i #下次迭代时,代码从`yield`的下一条语句(不是下一行)开始执行print(f"i:{i}")i += 1print("end")return "done"
if __name__ == '__main__':a = test()print(type(a))print(a.__next__())print(a.__next__())print(a.__next__())print(a.__next__())# 抛出异常:StopIteration
'''
<class 'generator'>
start
0
temp:None
1
temp:None
2
temp:None
end
Traceback (most recent call last):in <module>print(a.__next__())# 抛出异常:StopIteration
StopIteration: done
'''

测试生成器工作原理(send)

'''
send的作用是唤醒并继续执行,发送一个信息到生成器内部
'''
def foo():print("start")i = 0while i < 2:temp = yield iprint(f"temp:{temp}")i += 1print("end")g = foo()
print(next(g))  #等同g.__next__(),next是内置函数
print("*"*20)
print(g.send(100))
print(next(g))
# for a in g:#g所返回的值是yield处的i
#     print(a)
'''
start
0
********************
temp:100
1
temp:None
end
Traceback (most recent call last):print(next(g))
StopIteration
'''

5. 总结

1. 什么是生成器

        生成器仅仅保存了一套生成数值的算法,并且没有让这个算法现在就开始执行,而是我什么时候调用它,它什么时候开始计算一个新的值,并给你返回

2. 生成器特点

  •  生成器函数生成一系列结果。通过 yield 关键字返回一个值后,还能从其退出的地方继续运行,因此可以随时产生一系列的值。
  • 生成器和迭代是密切相关的,迭代器都有一个 __next__() 成员方法,这个方法要么返回迭代的下一项要么引起异常结束迭代
  • 生成器是一个特殊的程序,可以被用作控制循环的迭代行为,

二、迭代器

1、概念

  1. 迭代是Python最强大的功能之一,是访问集合元素的一种方式
  2. 迭代器是一个可以记住遍历的位置的对象
  3. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束
  4. 迭代器只能往前不会后退
  5. 迭代器有两个基本的方法: iter() netx() 

2、可迭代对象和迭代器区别

  1. 一个实现了 iter 方法的对象,称为 "可迭代对象 Ieratable"
  2. 一个实现了 next 方法并且是可迭代的对象,称为"迭代器" Iterator                                            即:实现了 iter 方法和 next 方法的对象就是迭代器

 生成器都是 Iterator对象,但 list dict str 虽然都是 Iterable(可迭代对象),              却不是Iterator(迭代器)

'''
生成器一定是迭代器
可迭代对象不一定是迭代器,使用iter([])封装后可转为迭代器
'''
from collections.abc import Iterator
from collections.abc import Iterable
a = isinstance([], Iterator) #list、dict、str虽然是Iterable(可迭代对象),却不是Iterator(迭代器)
print(a)
a = isinstance([], Iterable) #可迭代对象
print(a)
"""
执行结果:
False
True"""
'''list、dict、str 等 Iterable 变成 Iterator,可以使用 iter() 函数:'''
b = isinstance(iter([]), Iterator)
print(b)
b = isinstance(iter('花非人陌'), Iterator)
print(b)"""
执行结果:
True
True
"""

        Python的 Iterator 对象表示的是一个数据流。可以把这个数据看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过 next() 函数实现按需计算下一个数据,所以 Iterator 的计算是惰性的,只有在需要返回下一个数据时它才会计算。

        所以,生成器一定是迭代器

 3、for循环本质

#Python3 的 for 循环本质就是通过不断调用 next() 函数实现的。for x in [1,2,3,4,5]:pass'''本质是:'''
#首先获得Iterator对象:
it = iter([1,2,3,4,5])
#循环
while True:try:# 获得下一个值:x = next(it)except StopIteration:# 遇到StopIteration 就退出循环break

4、创建一个迭代器

一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() __next__()

  1.  __iter__() 方法返回一个特殊的迭代器对象,这个迭代器对象实现了 __next__() 方法并通过StopIteration 异常标识迭代的完成
  2.  __next__() 方法会返回下一个迭代器对象
#创建一个依次返回10,20,30,...这样数字的迭代器
class MyNumbers:def __iter__(self):self.num = 10return selfdef __next__(self):if self.num < 40:x = self.numself.num += 10return xelse:raise StopIterationmyclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
"""
执行结果:
10
20
30
Traceback (most recent call last):raise StopIteration
StopIteration
"""
"""
程序解析:
在这段代码中,MyNumbers 类定义了一个迭代器。该迭代器的作用是生成一系列数字,从 10 开始,每次增加 10,直到 40,然后停止。在程序中,通过 iter(myclass) 方法获取 MyNumbers 类的迭代器对象 myiter,然后调用 next(myiter) 方法获取下一个数字。在第一次调用 next(myiter) 方法时,迭代器会执行 __next__() 方法,返回 self.num 的值 10,然后将 self.num 的值增加 10,变为 20。在第二次、第三次调用 next(myiter) 方法时,迭代器会再次执行 __next__() 方法,返回 20 和 30,然后将 self.num 的值分别增加 10,变为 30 和 40。在第四次调用 next(myiter) 方法时,迭代器再次执行 __next__() 方法,发现 self.num 的值已经大于等于 40,于是抛出 StopIteration 异常,表示迭代已经结束。
"""

三、动态添加属性和方法

1、动态编程语言定义

        指在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,

已有的函数可以被删除或是其他结构上的变化

2、运行过程中给对象添加属性和方法

#coding=utf-8
import types
class Person():def __init__(self, name, age):self.name = nameself.age = agep1 = Person("zhangsan", 20)
p2 = Person("lisi", 18)
#动态给对象添加属性和方法
p1.score = 100
print(p1.score) #加给p1的只能p1用,对象的也是一样#动态给对象添加方法
def run(self):print(f"{self.name}, running...")
p1.run = types.MethodType(run, p1)
#而types.MethodType(run,p1)则是告诉解释器,self指的就是p1
p1.run()
"""
执行结果:
100
zhangsan, running...
"""

3、给类动态添加静态方法以及类方法

#encoding=utf-8
class Person():__slots__ = {"name", "age"}def __init__(self, name, age):self.name = nameself.age = age@staticmethod
def staticfunc():print("--- static method ---")Person.staticfunc = staticfunc
Person.staticfunc()
Person.score = 1000 #动态给对象静态方法
print(Person.score)@classmethod
def clsfunc(cls):print('--- cls method ---')
Person.clsfunc = clsfunc    #动态增加类方法
Person.clsfunc()

四、限制动态添加

1、slots

1.  __slots__的作用

  1. __slots__ 对动态添加成员变量、成员方法有限制。对动态添加类属性、类方法没有限制
  2. __slots__ 只对本类有限制,不限制子类

2. 对动态添加成员变量、成员方法有限制

'''
MyClass 类使用 __slots__ 属性限制了实例对象的属性,只允许动态添加 x 属性。
因此,obj.x = 1 可以成功,但是 obj.y = 2 会抛出 AttributeError 异常
'''
class MyClass:__slots__ = ['x']obj = MyClass()
obj.x = 1  # 可以动态添加 x 属性
obj.y = 2  # 报错,__slots__ 限制了不能动态添加 y 属性
"""
执行结果:
AttributeError: 'MyClass' object has no attribute 'y'
"""

3. 对动态添加类属性、类方法没有限制

class MyClass:__slots__ = ['x']classattr = 1@classmethoddef myclassmethod(cls):print("class method")MyClass.newclassattr = 2  # 可以动态添加类属性
print(MyClass.newclassattr)
MyClass.mynewclassmethod = lambda cls: print("new class method")  # 可以动态添加类方法
MyClass.mynewclassmethod(MyClass)   #传递类本身作为参数
obj = MyClass()
obj.x  = 3    # 可以动态添加实例属性
print(obj.x)  # 可以动态添加 x 属性
"""
执行结果:
2
new class method
3
"""
http://www.yayakq.cn/news/894004/

相关文章:

  • 网站你懂我意思正能量晚上在线观看不用下载免费魅族iis 网站属性
  • 简历旅游网站开发经验长沙模板建网站需要多久
  • 2018年公司做网站注意事项自适应网站建设推荐
  • 不懂代码如何开始网站程序建设福州网络营销网站
  • 怎么制作wap网站wordpress禁止外链
  • 建网站怎么挣钱个人网站命名 备案
  • 消防网站建设目标广州专业网站制作公司
  • 尚云网站建设域名关键词排名查询
  • 校园网站建设方案模板下载wordpress 字体插件
  • dw自己做的网站手机进不去网页设计期末作品源代码
  • qfd 网站开发古云网站建设
  • 网站建设的作用有哪些乐清网络问政
  • 做网站难还是app难好用的小程序推荐
  • 烟台做网站多少钱生小孩去什么网站做登记
  • 网站建设费用说明如何制作app平台
  • win7本地架设网站seo网站平台
  • 帮企业做网站的支持html5的网站
  • 重庆网站建设川娃子WordPress社区论坛
  • 网站托管共享服务器费用一年多少钱查询网站用什么做的
  • 景观小品设计网站推荐wordpress 缩率图
  • 北京网站搭建公司排行wordpress中文名注册
  • 专门做网页的网站linux做网站要多大内存
  • 做平面设计的网站有哪些网站建设网络推广文章
  • 大冶市城乡建设局网站网站如何
  • 企业为什么做网站wordpress音乐还网页不断
  • 手机网站的开发wordpress返回最新文章
  • 建设银行纪念币预约网站甘肃门户网
  • 网站开发在线浏览pdf湖南网站建设磐石网络口碑好
  • 齐鲁建设网站温州做网站厉害的公司有哪些
  • 公众号平台注册seo网站诊断分析报告