今天讲的内容呢?就是真的了解了,了解即可
放松一下,
先来讲讲递归
那么什么是递归呢?
比如我举一个生活中的例子
你去电影院看电影,坐在某一行,对吧,但是你不知道自己是第几行
于是呢,就找前面的兄弟,前面那哥们呢也不知道是第几行,就再问前面的那哥们,前面的也不知道啊,对吧,就再问前面那哥们,一直问啊,问到了第一行,然后第一行的人就给他讲我第一行的
然后第二行的就知道,哦原来我第二行的,然后给第三行的人说,我第二行的,然后第三行的通过2+1 他就知道,原来他是第三行的,依次类推,最前面问的那哥们就知道他在第几行了
代码如下
例子1
# 计算7的阶乘
def func(n):
if n == 1:
return 1
return f"{n} * {func(n-1)}"
print(func(7))
例子2
def get_my_pos_in_line(persion):
"""
:param persion: 我前面的人数
:return: 我在第几行
"""
if persion == 0: #如果前面没人了就返回1
return 1
return 1 + get_my_pos_in_line(persion-1)
递归的核心就是函数自己调用自己
递归呢可以是一种思路,把软件的大问题,分解成中问题,然后呢,在分解成小问题.虽然递归的使用可能会消耗过多的性能,但是这种思路是值得我们使用的.
下面呢讲讲迭代器
在讲迭代器之前呢,先讲讲什么是迭代
迭代就是对一堆数据进行一些有意义,有规律的操作,(增加修改)
那么使用迭代呢,我们要准备两个东西,
一个呢就是被迭代的数据-可迭代对象,你比如说集合,元组,列表,字符串等等
还有一个东西呢,叫做迭代器对象,这个对象呢?你也可以理解成一个变量,里面存储了方法,可以对可迭代对象进行操作
通俗点解释,我们可以把迭代比作电视剧的剧集,而迭代器则是用来播放这些剧集的播放器。当我们使用迭代器时,我们可以像通过播放器一集一集地观看电视剧一样,逐个查看和处理集合中的元素。
迭代器使用如下
str_0 = "hello" #这个就是可迭代对象
iterator = str_0.__iter__() #这个就是把str_0生成的迭代器赋值给了iterator
item = iterator.__next__() #然后通过__next__()函数依次取出迭代器里面的值
print(item)
item = iterator.__next__()
print(item)
item = iterator.__next__()
print(item)
item = iterator.__next__()
print(item)
item = iterator.__next__()
print(item)
还有另一种写法,结果都是相同的
str_0 = "hello" #这个就是可迭代对象
iterator = iter(str_0) #这个就是把str_0生成的迭代器赋值给了iterator
item = next(iterator) #然后通过__next__()函数依次取出迭代器里面的值
print(item)
item = next(iterator)
print(item)
item = next(iterator)
print(item)
item = next(iterator)
print(item)
item = next(iterator)
print(item)
前面我们不是讲了for循环吗?对吧,其实for循环的实现原理也是迭代器
下面是 for
循环底层实现的一个简化描述:
首先,for
循环调用内置函数 iter()
传入可迭代对象,来获取一个迭代器。
接下来,在每次循环迭代过程中,for
循环使用内置函数 next()
从迭代器中获取下一个元素。
循环将获取到的元素赋值给循环变量,并执行循环体中的代码。
当迭代器中没有更多元素时,next()
函数将引发StopIteration异常,for
循环将捕获该异常并结束循环。
这种实现方式使得 for
循环在处理可迭代对象时更加方便简洁,不需要手动创建迭代器和处理StopIteration异常。
前面迭代器讲完了,我们再讲讲生成器
生成器和迭代器是类似的
本质上来说是一个自定义的迭代器. 作用就是自己制定一个规则,然后按照规则生成想要的数据
def fibonacci_generator(n):
a, b = 0, 1
count = 0
while count < n:
yield a
a, b = b, a + b
count += 1
fib_gen = fibonacci_generator(5)
for num in fib_gen:
print(num)
def even_generator(start, end):
while start <= end:
if start % 2 == 0:
yield start
start += 1
even_gen = even_generator(1, 10)
for num in even_gen:
print(num)
也可以理解成在生成器函数里面有循环,然后每次循环遇到yield都会把值加入进入生成器对象,但是呢函数不会停止,不会像return一样,遇到就直接返回一个数,并直接停止函数,而循环的停止是跟其自身的判定条件有关的.