迭代
Q:哪些对象可以进行for循环/遍历?
A:可迭代的对象/实现迭代器协议的对象
迭代协议
- 内部有next方法能获取到元素__ next__()
示例:
f = open('data.txt',encoding ='utf8')
print(f.__next__())
print(f.__next__())
print(f.__next__())
print(f.__next__())
输出:
- 全局next函数
f = open('data.txt',encoding ='utf8')
print(next(f))
print(next(f))
print(next(f))
print(next(f))
迭代工具
for
推导
map
迭代器对象
已经实现,如文件
可迭代对象
需额外加一个方法,如列表
iter()->iter() 生成迭代器
>>>f = open('data.txt',encoding='utf8')
>>>for line in f:
... print(line)
>>>iter(f) is f
True
测试返回True,证明能直接使用
内置可迭代对象
- range
result = [x**2 for x in range(1,6)]
print(result)
输出
[1, 4, 9, 16, 25]
- zip
result = zip(['x','y','z',[1,2,3]])
print(result)
for x in result:
print(x)
- map
def double_number(x):
return x*2
l = [1,2,3,4,5]
result = list(map(double_number,l))
print(result)
举例
1. 返回一个列表的平方值
# 返回列表平方值
# 法一:for循环
l = [1,2,3]
res = []
for x in l:
res.append(x**2)
print(res)
# 法二:手动实现,做迭代器
i = iter(l)
while True:
try:
x = res.append(next(i)**2)
except StopIteration:##捕获异常
break
print(res)
#法三:推导
result = [x**2 for x in l]
print(result)
法三效率最高
输出:
[1, 4, 9]
[1, 4, 9, 1, 4, 9]
[1, 4, 9]
2. dict输出
dict输出values、keys的时候看似输出list,实际上并不是
目的:大集合会节省内存
emp = {'name':'Tom','age':22,'salary':800}
for k in emp:
print(k)
print(emp.items())
print(emp.keys())
print(emp.values())
keys = emp.keys()
i = iter(keys)
print(i.__next__())
3. 字符串过滤
urls = ['youpin.com','xuetongxue','study']
print(urls)
res1 = [url.upper() for url in urls]
print(res1)
res2 = [url for url in urls if url.endswith('.com')]
函数
目的
最大化代码重用、最小化代码冗余、过程分解
定义
def 方法名(参数1,参数2…):
调用
函数名(实际参数)
传值
传值到函数
def learning(name,course,start,end):
print('{}开始学习:《{}》'.format(name,course))
print('从{}到{}'.format(start,end))
print('{}继续学习'.format(name))
learning('xue','python基础','1','4')
函数返回值
def add_number(x,y):
result = x+y
return result
print(add_number(3,10))
变量作用域
built-in,global,enclousure(封装)——nonical,local
def func():
x = 100
def nested():
nonlocal x
x = 99
print(x)
nested()
print(x)
func()
输出
99
99
def func():
x = 100
def nested():
x = 99
print(x)
nested()
print(x)
func()
输出
99
100
参数
传递
不可变类型(int、float):传递副本给函数,函数内操作不影响原始值
可变类型(列表、字典表):传递地址引用,函数内操作可能会影响原始值
举例
- 两个字符串相同字母
def intersect(sq1,sq2):
res = []
for x in sq1:
if x in sq2:
res.append(x)
return res
s1 = 'xuexi'
s2 = 'nuli'
l = intersect(s1,s2)
print(l)