Python趣事-7

本文介绍了Python中的变量作用域,包括函数内的`nonlocal`和`global`关键字,以及类中的变量作用域。接着讲解了可迭代对象、生成器和迭代器的概念,并提到了如何自定义迭代对象,需要实现`__iter__`和`__next__`方法。通过学习,读者可以更好地理解和使用Python的这些特性。
摘要由CSDN通过智能技术生成

简介

1.函数变量的作用域

2.类中的变量作用域

3.iterable/generator/iterator

4.自定义迭代对象

函数变量作用域

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

你猜这个结果会是怎么样的呢?

这里写图片描述

  • nonlocal,字面意思就是非局部的,也就是在函数外也可以使用
  • global,就是全局,后面的变量就是全局的
  • 这时候需要注意的是:在执行global后为什么这个变量没有变呢?这是因为在这个函数局部也有一个一样的变量,当然就是优先引用这个局部的变量了,你可以在main函数里打印一下spam,这时候就是输出‘global spam‘

类中的变量作用域

class MyClass():
    ''' this is myClass'''

    i = 'default'
    data = []

    def __init__(self,j):
        self.j = j

    def hello(self):
        return 'hello,world '

    def append(self,value):
        self.data.append(value)

if __name__ == '__main__':
    clazz1 = MyClass(10)
    clazz2 = MyClass(100)

    print(clazz1.j)
    print(clazz2.j)

    print('-------')

    clazz1.i = 'clazz-1'

    print(clazz1.i)
    print(clazz2.i)

    print('-------')

    clazz1.append('AAAA')
    clazz2.append('BBBB')

    print(clazz1.data)
    print(clazz2.data)

这里写图片描述

iterable/generator/iterator

1.iterable:可迭代对象(可使用for循环来遍历,一下子返回列表所有数据)
2.generator:生成器(也可以使用for循环来遍历,但是不是一下子返回所有数据)
3.iterator:迭代器(可以使用next方法来不断查询下一个元素,如生成器,可迭代对象不可以哈)

def gen(max=10):
    a = 0
    while a < 10:
        yield a
        a += 1

if __name__ == '__main__':

    a = [i + 1 for i in range(10)]
    print(a)
    print('-------')

    b = (i + 1 for i in range(10))
    print(b)
    print('-------')

    c = gen()
    print(c)

    print(next(gen()))

    print('-------')

    for i in b:
        print(i)
  • 注意两种创建生成器的方法,一种是b = (i + 1 for i in range(10)),另一种是函数中返回使用yield
  • 如果要将可迭代对象转换为迭代器,可以使用 iter() 方法

自定义迭代对象

class sim_for:
    def __init__(self):
        self.data = 1, 2, 3
        self.index = 0

    def __next__(self):
        self.index += 1
        if (self.index > len(self.data)):
            raise StopIteration
        return self.data[self.index - 1]

    def __iter__(self):
        return self


if __name__ == '__main__':
    for sim in sim_for():
        print(sim)

这里写图片描述

  • 主要包含的就是两个方法,一个是__iter__,另一个是__next__
  • __iter__:返回一个可迭代对象,故是自身
  • __next__:遍历是不断的返回对象,直到抛出StopIteration异常

扫描右侧二维码,关注个人公众号:SimFG,让我们一起探索世界吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值