迭代器
1,什么是迭代器
迭代器指的是迭代取值的工具,迭代时一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代
什么是迭代?
迭代就是一个重复的过程,但是每次重复都基于上一次的结果进行的
#单纯的重复不叫迭代
count = 1
while count < 5:
print(count)
count += 1
2,为何要用迭代器
优点
1找到一种通用的迭代取值方案
2惰性计算,节省内存
缺点
1不能取指定的值,只能往后next
2迭代器对象是一次性的,迭代器对象取值干净了,不能继续取值
3,如何用迭代器
#可迭代对象
1,内置有__iter__ 方法的对象都是可迭代对象
#调用可迭代对象的__iter__()会得到一个返回值,该返回值是迭代器对象
#迭代对象的特点:
1,内置有__next__()方法 可取出迭代器的值
2,内置有__iter__()方法
#for循环工作原理
1 调用in后那个对象的__iter__方法,看到一个迭代器对象iter_name
2 x=next(iter_names),然后运行循环体代码
3 重复步骤2 直到取完值,抛出异常,for循环会带我们捕捉异常结束循环
for x in name:
print(x)
生成器
#yield 对比 return
相同点都可以返回任意类型。任意个数的值
不同点:return只能返回值一次值,函数立即结束
yield可以返回多次值,yield可以暂停函数的运行
# def func():
# print('one...')
# yield 111
# print('two...')
# yield 222
# print('three...')
# yield 333
# print('fourth')
函数内但凡出现yield关键字,再调用函数不会立即执行函数代码,而会返回一个
生成器对象,生成器对象本质就是一个自定义的迭代器对象
函数递推与回溯
函数递归是函数嵌套调用的一种特殊格式
即在调用一个函数时,在其内部又调用了自己
def foo():
print('111')
foo()
foo()
递归应该分为两个阶段
1、回溯:一层一层往下调用
2、递推:一层一层向上推出结果
# # 例1:
# l = [11, [22, [33, [44, [55, [66, [77, [88, [99]]]]]]]]]
#
#
# def func(l):
# for item in l:
# if type(item) is list:
# func(item)
# else:
# print(item)
#
# func(l)
# 例2:递归实现二分法
nums = [3, 7, 9, 13, 21, 33, 57, 63, 78, 99]
def search(nums,find_num):
print(nums)
if len(nums) == 0:
print('not exists')
return
mid = len(nums) // 2 将列表二分
if find_num > nums[mid]:
# 找右半部分
search(nums[mid+1:],find_num)添加新的列表,循环继续分割,快速找到要寻找的数
elif find_num < nums[mid]:
# 找左半部分
search(nums[:mid],find_num)
else:
print('find it')
# search(nums,63)
search(nums,64)
三元表达式
def max2(x,y):
if x > y:
return x
else:
return y
# 条件成立时的返回值 if 条件 else 条件不成立时的返回值
x = 10
y = 20
# res = x if x > y else y
res = "ok" if 'a' != "a" else "no"
print(res)
生成式
# 列表生成式 # 需生成的 for 条件 if 条件 # l = [] # for i in range(10): # if i > 3: # l.append(i) # l = ["ok" for i in range(10) if i > 3] # print(l) # names = ['egon', "lxx_sb", "hxx_sb", "wxx_sb", "lxx_sb"] # res = [name for name in names if name.endswith('sb')] # print(res) # names = ["lxx", "hxx", "wxx", "lxx"] # print([name+"_sb" for name in names]) # 字典生成式 # print({"k%s" %i:i for i in range(3)}) # 集合生成式 # print({i for i in range(3)}) # 生成器表达式 # res = (i for i in range(5)) # print(res) # print(next(res)) # print(next(res)) with open('a.txt', mode='rt', encoding='utf-8') as f: # res = f.read() # print(len(res)) # 23个字符 # res = 0 # for line in f: # res += len(line) # res = sum((len(line) for line in f)) res = sum(len(line) for line in f) print(res)