迭代器

关键字 global nonlocal

global 声明全局变量 如果全局中 存在声明的变量 那么就使用;如果不存在,就创立一个

## 已存在的全局变量
l = [1,2,3]
l1 = l
def func():
    global l
    l.append(10)
func()
print(l1)  ## [1,2,3,10]
print(l)   ## [1,2,3,10]

# 不存在的全局变量
def func2():
	global l2 
	l2 = [1,2,3]
	return l2
func2()
print(l2)

在局部 , 有使用全局变量的权限,但是没有更改指向的权力

l1 = []
def func(args):
    l1.append(args)
    return l1
print(func(1))
print(func(2))
print(func(3)) # 【1,2,3】

预编译

## name在全局存在,也在内部存在,但是在使用后定义
name = '报错了'
import time
def func():
    print(name)
    name = 10
func() #会报错,因为name在内部定义前使用了,外部也存在,出现了歧义

nonlocal 使用上一层 同时在locals里存在

可变默认参数

当默认参数为可变数据类型时,程序会开辟一个新空间,不会因函数执行结束而释放

def func(a,l = []):
    l.append(a)
    return l
l1 = func(1)
l2 = func(2)
l3 = func(3)
l4 = func(4,[])
print(l1,l2,l3,l4) # [1] [1,2] [1,2,3],[4]
## 个人理解 因为l没有传入,所以l= [] 除去第一次读取的时候执行过,之后也没有执行过l = [],所以l还是之前的列表指向
## 最后的l4 传入了新的[] 所以结果改变

函数名的应用

函数名也是变量名 所以可以相互引用,

所以可以当 实参参数 返回值

def func1(func):
	return func()
def func2():
   	print ('1')
func1(func2)  # 1

f 格式化

s = f'几乎什么都可以放{everything}' ## 除了解析出来报错的东西 符号 

可迭代对象

只要对象中存在__ iter __ 方法 就是可迭代对象

可迭代对象不能直接遍历 需要转换成迭代器

dir() 内置函数 查看对象中所有方法和属性 返回的是列表
##测试是否是
if '__iter__' in dir(对象):
	pass

迭代器

可以重复迭代的工具

对象内部含有__ iter__ () 方法 和 __ next__()就是可迭代对象

迭代器的优点:

  1. 惰性机制
  2. 非常节省内存

迭代器缺点

  1. 不直观
  2. 没有可用方法
  3. 效率低

使用迭代器 用while模拟for

l = [1,2,3]
l1 = iter(l)
while 1:
    try:
        print(next(l1))
    except:
        break

可迭代对象与迭代器的对比

可迭代对象:操作灵活,直观,效率相对高,占内存

迭代器:节省内存,不直观

原文地址:https://www.cnblogs.com/albert0823/p/11051428.html