python 迭代器 生成器 装饰器

迭代器 (是python最强大功能之一,是访问集合元素的方式)

两个概念,可迭代的对象,迭代器对象。可迭代的(Iterable):就是可以for循环取数据的,比如字典、列表、元组、字符串等,但不能使用next()方法。迭代器(Iterator),也是可以依次迭代取出数据的对象,可以使用next()方法依次取数据。

#两个基本方法 __iter__  __next__
# class Number:
#     def __init__(self, end):   #__init__为初始化方法,实例化时自动调用
#         self.start = 0
#         self.end = end
#
#     def __iter__(self):   #__iter__使变为可迭代对象
#         return self
#
#     def __next__(self): 
#         self.start+=1 #注意数据要更新
#         if self.start >= self.end:
#             raise StopIteration  #主动抛出异常,防止迭代异常
#         return self.start
#
# nu = Number(10)
# for i in nu:
#     print(i)
# 生成器  是一次生成一个值的特殊类型函数简单的说就是在函数的执行过程中,yield语句会把你需要的值返回给调用生成器的地方,然后退出函数,
下一次调用生成器函数的时候又从上次中断的地方开始执行,而生成器内的所有变量参数都会被保存下来供下一次使用。
# 定义
 class MyNumber():
     def __iter__(self):
         self.a = 1
         return self
​
     def __next__(self):
         if self.a < 20:
             x = self.a
             self.a += 1
             return x
         else:
             raise StopIteration
​
​
 myclass = MyNumber()
 for x in myclass:
     print(x)
​
#生成器中的yield
 def func():
     print(1)
     yield 2   #yield与return的区别在于,前者暂停但可用next实现继续输出,return则直接断
     print(3)
     yield 4
 a=func()
#print(next(a))    
#print(next(a))
 print(list(a)) #用list输出时,用print输出的不会放在列表里,但所有数可一次性取出
#装饰器分为自定义和内置
#自定义装饰器
def upgrade(f):
    def drilling():
        print("钻火圈")
        f()
    return drilling
@upgrade
def cat():
    print("抓老鼠")
cat()
​
​
#内置
class Person():
    def __init__(self, name):     #此代码块作为原型,与下面代码块比较得出内置装饰器的作用
        self.name = name
​
    def play(self):
        print(self.name + "play")
​
​
zt = Person('大龙')
zt.play()   #输出结果为 大龙play
​
​
#2
class Person():
    def __init__(self, name):
        self.name = name
​
    @property        # 可以让方法像属性一样调用
    def play(self):
        print(self.name + "play")
​
​
zt = Person('大龙')
zt.play  #输出结果 大龙play
​
​
#3
class Person():
    def __init__(self, name):
        self.name = name
​
    @classmethod    # 类方法  把你自动传入的实例化对象变成是自动传入类
    def eat(cls):
        print(f'{cls}吃饭')
​
​
zt = Person('大龙')
zt.eat()   # 输出   <class '__main__.Person'>吃饭
​
#4
class Person():
    def __init__(self, name):
        self.name = name
​
    @staticmethod  # 静态方法 不需要去传入任何的参数
    def sleep():
        print("睡觉")  
​
​
zt = Person('大龙')
zt.sleep()  #输出 睡觉
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值