迭代
迭代协议
迭代对象支持迭代协议,即迭代对象有.next()方法可以读取下一个数据,如文件,列表元组等不支持
在循环中会自动将不支持迭代对象的类型转换为迭代对象
使用iter(…)方法可以将不是迭代对象的如列表转换为迭代对象
迭代工具
迭代器对象:已经实现,可以直接用,有.next()方法,如文件:
f=open('a.txt','r',encoding='utf8')
for i in f:
print(i,end='')
输出
你好
abcd
12345
qwer
f可以直接迭代,有.next()方法,这个方法等于全局方法next(),而且迭代完成之后就不能再用了,需要再赋值给变量一次
In[3]: f=open('a.txt','r',encoding='utf8')
In[4]: f.__next__()
Out[4]: '你好\n'
In[5]: f.__next__()
Out[5]: 'abcd\n'
In[6]: f.__next__()
Out[6]: '12345\n'
In[7]: f=open('a.txt','r',encoding='utf8')
In[8]: next(f)
Out[8]: '你好\n'
In[9]: next(f)
Out[9]: 'abcd\n'
In[10]: next(f)
Out[10]: '12345\n'
可迭代对象
没有.next()方法,但在for循环时会自动转换成迭代器对象并迭代,也可以自己手动转化
In[12]: a.__next__()
Traceback (most recent call last):
File "G:\Anaconda3\envs\tensorflow\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-12-d34d2a8c0899>", line 1, in <module>
a.__next__()
AttributeError: 'list' object has no attribute '__next__'
In[13]: a2=iter(a)
In[14]: a2.__next__()
Out[14]: 1
In[15]: a2.__next__()
Out[15]: 2
In[16]: a2.__next__()
Out[16]: 3
In[17]: a2.__next__()
Out[17]: 4
在for循环列表时,相当于自动用iter()方法再用__next__()循环的
常见内置可迭代对象
1.range()返回的就是可迭代对象
2.zip():将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
In[34]: a=zip(['a','b','c'],[1,2,3])
In[35]: for i in a:
...: print(i)
...:
('a', 1)
('b', 2)
('c', 3)
3.map():根据提供的函数对指定序列做映射
>>>def square(x) : # 计算平方数
... return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 计算列表各个元素的平方
[1, 4, 9, 16, 25]
函数
函数的用法和别的编程语言类似
变量作用域
1.内置
2.全局
3.嵌套
4.局部
使用global可以在函数内使用全局变量
x=5
def f():
global x
x=6
print(x)
print(x)
f()
print(x)
输出
5
6
6
使用nonlocal可以在函数嵌套中使用上一层函数的变量
def f1():
x=10
def f2():
nonlocal x
x = 9
print(x)
f2()
print(x)
f1()
输出
9
9