简介
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,让我们一起探索世界吧