迭代器
"""
1 什么是迭代器
迭代器就是用来迭代取值的工具
什么是迭代?
迭代就是一个重复的过程,但是每次重复都是基于上一次的结果进行的
# 单纯的重复不叫迭代
while True:
1+1
# 下面才是迭代的过程
count = 1
while count < 5:
print(count)
count += 1
2、为何要用迭代器
优点
(1) 找到一种通用的迭代取值方案->for循环
(2)惰性计算,节省内存
缺点:
1、不能取指定的值,只能往后next
2、迭代器对象是一次性的:一个迭代器对象值取干净了,不能继续取了
3、如何用迭代器
"""
可迭代对象
1、内置有__iter__方法的对象都是可迭代对象
"abc".__iter__()
[1, 2, 3].__iter__()
(1, 2, 3).__iter__()
{"x": 1, "y": 2}.__iter__()
{1, 2, 3, 4}.__iter__()
# open('a.txt', mode='r').__iter__()
# open('a.txt', mode='r').__next__()
# 调用可迭代对象的__iter__()会得到一个返回值,该返回值是迭代器对象
# 迭代对象对象的特点:
# 1、内置有__next__()方法
# 2、内置有__iter__()方法
# names = ['egon', 'tom', 'jack', 'lili', 'ttt']
# names = {"x":1,"y":2,'z':3}
# iter_names = iter(names)
# while True:
# try:
# print(next(iter_names))
# except StopIteration:
# break
# for工作原理
# 1、调用in后那个对象的__iter__方法,得到一个迭代器对象iter_names
# 2、x=next(iter_names),然后运行循环体代码
# 3、重复步骤2,直到取完值,抛出异常,for循环会帮我们捕捉异常结束循环
# for x in names:
# print(x)
可以简写
l = [1,2,3]
res = iter(l)
print(next(res))
生成器
函数内但凡出现yield关键字,再调用函数不会立即执行函数体代码,而会返回一个
生成器对象,生成器对象本质就是一个自定义的迭代器对象
yield 对比 return
# 相同点:都可以返回任意类型、任意个数的值
# 不同点:return只能返回值一次值,函数就立即结束
# yield可以返回多次值,yield可以暂停函数的运行
def func():
print('111')
yield 222
print('333')
yield 444
print('555')
yield 666
g = func()
print(next(g))
print(next(g))
print(next(g))
无限叠加数字
def func():
res = 0
while True:
yield res
res += 1
g = func()
for i in g:
print(i)
函数递归
"""
1、什么是函数递归
函数递归是函数嵌套调用的一种特殊格式
即在调用一个函数时,在其内部又调用了自己
# def foo():
# print('from foo')
# foo()
#
#
# foo()
import sys
print(sys.getrecursionlimit())
sys.setrecursionlimit(2000)
递归应该分为两个阶段
1、回溯:一层一层往下调用
2、递推:一层一层向上推出结果
# 2、为何要用函数递归
函数递归提供了一种基于函数实现的新的循环机制
# 3、如何用函数递归
"""
# def age(n):
# if n == 1:
# return 18
# else:
# return age(n-1)+10
#
# res = age(5)
# print(res)
# 例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)
生成式
列表生成式
l = [i 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)