1.什么是迭代器
‘‘‘迭代器就是用来迭代取值的工具‘‘‘
什么是迭代呢?
迭代就是一个重复的过程,但每次重复都是基于上一次的结果进行的
# 单纯的重复不叫迭代
while True:
1+1
# 重复,但基于上一次的重复的结果进行的
count = 1
while count < 5:
print(count)
count += 1
# 可迭代对象
# 1.内置有__iter__方法的对象都是可迭代对象
# 例如
‘abc‘.__iter__()
[1,2,3].__iter__()
{‘x‘:1, ‘y‘:2}.__iter__()
{1,2,3,4}.__iter__()
# 以上都是可迭代对象
# 当我们调用可迭代对象的__iter__()会得到一个返回值,该返回值是迭代器对象
# 迭代对象对象的特点:
# 1.内置有__next__()方法
# 2.内置有__iter__()方法
# 1.迭代器一定是可迭代对象
# 2.可迭代对象可以通过iter()方法转换为迭代器对象
name = [‘wuxie‘,‘cym‘,‘tiantian‘] # 可迭代对象
names = iter(name) # 转换为迭代器对象
while True:
try:
print(next(names))
except StopIteration:
break
# for 工作原理
# 1.调用in后对象的__iter__方法,得到一个迭代器对象names
# 2.x = next(names),然后运行循环体代码
# 3.重复步骤2,直到取完值,抛出异常,for循环结束
2.为何要用迭代器
‘‘‘
优点:
1.找到一种通用的迭代取值方案->for循环
2.惰性计算,节省内存
缺点:
1.不能指定取值,只能往后next
2.迭代器对象是一次性的,一个迭代器对象取值取干净了,不能继续取了
‘‘‘
3.如何使用迭起器
那么这个迭代器到底有什么作用呢?其实迭代器就相当于一个懒工厂,当我们需要当时候就可以调用next()方法返回值,没有需要当时候就等候,例如
list = [11,22,33,44,55]
linter = iter(list)
print(next(linter))
>>11
print(next(linter))
>>22
可以看出:上面就通过next方法将迭代器中的值给取出来了
注意:迭代器中有多少值就只能取几次,超过就会抛出异常:StopIteration
‘‘‘1.什么是生成器
生成器:生成器是一个特殊的迭代器,定义生成器可以用通过
2.如何构建生成器
定义生成器可以通过两种方式:生成器表达式以及函数的形式
‘‘‘
# 生成器表达式
res = (i for i in range(5))
# 函数表达式
# 如果要用函数体的形式实现生成器的话就需要用到yield
def func():
print(‘one...‘)
yield 111
print(‘two...‘)
yield 222
print(‘three..‘)
yield 333
# yield 对比 return
# 相同点:都可以返回任意类型、任意个数的值
# 不同点:return只能返回值一次值,函数就立即结束
# yield可以返回多次值,yield可以暂停函数的运行
# 在python中 函数内但凡出现yield关键字,再调用函数不会立即执行函数体代码,而会返回一个
# # 生成器对象,生成器对象本质就是一个自定义的迭代器对象
# 自定义range生产器
def my_range(stat,stop,n):
res = stat
x = stat
while x < stop:
x += n
yield res
res += n
for i in my_range(7, 20, 2):
print(i)
"""
1、什么是函数递归
函数递归是函数嵌套调用的一种特殊格式
即在调用一个函数时,在其内部又调用了自己
当然我们不能无限调用自己
在python中,名称空间
在函数没有调用完成之前,函数所占用的名称空间并不会被回收
所有递归是有深度
import sys
print(sys.getrecursionlimit())
查看递归深度
sys.setrecursionlimit(2000)
设置递归深度
递归应该分为两个阶段
1、回溯:一层一层往下调用
2、递推:一层一层向上推出结果
# 2、为何要用函数递归
函数递归提供了一种基于函数实现的新的循环机制
# 3、如何用函数递归
"""
# 例题1:采用递归实现二分法
# 需求在输入数字时,在列表中快速找到
nums = [3,8,13,67,89] # 已经排序了
def seach(nums,find_num):
print(nums)
if len(nums) == 0:
print(‘not exists‘)
return
mid = len(nums)//2
if find_num > nums[mid]:
seach(nums[mid+1:], find_num)
elif find_num < nums[mid]:
seach(num[:mid], find_num)
else:
print(‘find it‘)
seach(num, 64)
>>>
[3, 7, 9, 13, 21, 33, 57, 63, 78, 99]
[57, 63, 78, 99]
[57, 63]
[]
not exists
‘‘‘1.什么时三元表达式
在Python语言中,也有三元运算符。不过Python的三元运算符和java以及C#有所区别,语法格式为:
表达式1 if 条件表达式 else 表达式2
当表达式返回True时,返回结果表达式1,否则返回结果表达式2。示例:
1
c = a if a < b else b
------来自百度百科,python三元运算符
特点:
1.它允许我们用单行表达式替换简单的if语句。
2.通过减少代码行数来提高代码的可读性。
‘‘‘
def max2(x,y):
if x > y:
return x
else:
return y
# 三元表达式
res = x if x > y else y
print(res)
# 传统生成列表
l = []
for i in range(10):
l.append(i)
print(l)
>>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 采用列表生成式
l = [i for i in range(10)]
print(l)
>>
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 字典生成式
d = {‘k%s‘ % i:i for i in range(3)}
print(d)
>>
{‘k0‘: 0, ‘k1‘: 1, ‘k2‘: 2}
# 集合生成式
s = {i for i in range(3)}
print(s)
>>
{0, 1, 2}
##没有元组生成式,我们可以将列表通过tupe()方法得到
res = (i for i in range(5)) # 这是生成器
# 如何巧妙使用生成器,在面对读写大文件时
with open(‘a.txt‘,‘rt‘,endcoding=‘utf8‘) as f: # a是超大文件,如果一次性读出,肯定超出内存
res = sum(len(len) for line in f )
print(res)
原文:https://www.cnblogs.com/wzf-1314-cym-6/p/14964106.html