递归(函数自己调用自己)
递归最经典的例子就是斐波那契数列:
首先对斐波那契数列进行简要说明
斐波那契数列就是一列数字,他们之间存在如下规律,
除了前两项,后面所有的项都是前面两项之和
由于其自第三项开始,每一项都有着相同的特点,因此,我们只需要一个函数就可以概括此数列的所有特点,并求出其所有项
不断通过自己调用自己去寻找下一位的值
def fib(num): if num == 1 or num == 2: num = 1 else: num = fib(num-1) + fib(num-2) return num for i in range(1,16): content = fib(i) print("斐波那契数列的第{}位的值为:{}".format(i,content))
迭代器
此处先对迭代数据类型进行复习,我们前面说所的可迭代的基本的数据类型有:
可迭代类型
字符串,列表,元组,字典
官方文档中对可迭代类型的解释为:对象中含有”__iter__"方法,则其为可迭代对象(此处的对象,即基本数据类型,python中一切皆对象,处处为继承,后续面向对象中会提及)
因此,确认一个对象是否可以进行迭代,最基本的判断依据为”__iter__“方法的有无
对象方法的查看方式
使用dir()函数
迭代器的生成
使用iter()方法,可以将一个可迭代类型的数据转化为一个迭代器,然后使用next()方法,对迭代器中的内容进行输出,一个next仅会输出一个值,可以使用循环的方法使其输出多个内容
典型内置迭代器
python中最典型的迭代器就是文件句柄
具有iter和next两种方法,因此可说明文件句柄为迭代器
生成器
生成器可以节省系统的内存空间,例如,当我们对一个列表进行循环取数是,系统会创建一个与列表数据内存对等的空间,而生成器对空间比较节省,一次只生成一个较小的空间,然后对元素进行操作
def nim(num):
for i in range(num):
yield i
s = nim(100)
print(type(s)) #<class 'generator'>
创建一个生成器
使用yield将函数改造为生成器,使用next()方法在生成器中进行取值,生成器在进行取值时,会记录当前位置,并以此向下执行
# 函数
def nim(num):
for i in range(num):
return i
s = nim(5)
for i in range(5):
print(s)
#生成器
def nom(num):
for i in range(num):
yield i
ss = nom(5)
for i in range(5):
print(next(ss))
创建生成器的另一种方法
使用列表推导式的格式,将[]换成()就可以自己定义一个生成器,并使用next()方法取值
列表推导式
创建列表的一种快捷方式
生成100以内的偶数列表
num_list = [ i for i in range(101) if i % 2 == 0]
print(num_list) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100]
装饰器
可以在不改变函数调用方式的基础上,为函数增加部分功能
装饰器的本质
一个函数调用另一个函数
装饰器的使用
计算函数执行的时间
import time
def effic(f):
def inner():
start_time = time.time()
f()
end_time = time.time()
sub_time = end_time - start_time
print("函数执行时间为:{}".format(sub_time))
return inner
@effic
def func():
print("开始执行")
time.sleep(1)
print("执行结束")
func()
装饰器的基本格式
"基本装饰器"
def gendor(f):
def inner():
r = f(*args,**kwargs) #r 代表所装饰的函数的返回值 f后面可以添加参数
return r
return inner()
匿名函数(lamda)
定义结构较为简单的函数的方法
fun = lambda x,y : x + y
add = fun(1,9)
print(add) #10