python学习笔记(八)函数相关

函数相关

递归函数

定义:在函数内部调用自己的函数称为递归函数。
组成:
函数内部调用自己
终止条件(停止调用自己)
核心算法
特点:
代码简洁
可读性差
瞬间占用内存较大,终止条件出错立即崩溃
原则:
能不使用就不使用,只有再不得不使用时才使用(深度优先目录遍历)

实例:

求n的阶乘
求斐波那契数列的第n项
前两项都是1,后面的项的值等前面两项的和
如:1, 1, 2, 3, 5, 8, 13, …
代码实现:

def func(x):
	# 求绝对值和转成整数
	a = int(abs(x))
	if (a==1 or a==0):
		return 1
	else:
		return func(a-1) + func(a-2)
print(func(6))

生成器

使用场景

在使用列表时,数据量特别大时,内存的占用会突然增加,但是使用时又不需要一下子使用全部,通常都是一个一个使用,为了解决这个问题,python中引入了生成器的概念。

使用方式

生成器方式1:将列表生成式的[]换成()即可
# 列表生成式
lt = [i for i in range(10)]
print(lt)
# 结果:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# 生成器
g = (i for i in range(10))
# print(g)

# 可以一个一个提取
# 第一次使用 输出结果为 0
print(next(g))
# 第一次使用 输出结果为 1
print(next(g))
#没有数据继续提取则会报错StopIteration
# print(next(g))

# 可以遍历 但是之前取出来的就无法再使用了
# for i in g:
#     print(i)

# 可以转换为列表
print(list(g)) 

无论哪种方式操作都是单次的

生成器方式2:在函数中使用yield关键字
# 定义一个函数
def test(n):
    lt = []
    for i in range(1, n+1):
        lt.append(i)
    return lt
# 正常使用
# 但是当数据量非常大时,会造成内存占用突然增大
print(test(3))

# 使用yield的形式
def test(n):
    for i in range(1, n+1):
        # 每次获取一个元素,yield后面的值会返回
        # 执行到yield程序又会停止
        yield i   
        
# t是一个生成器
t = test(3)
print(t)

# 可以使用next的方式调用
print(next(t))

# 可以进行遍历
for i in t:
	print(i)

print(list(t))

迭代器

定义:只要可以使用next进行元素获取的对象都是迭代器,都可以使用for-in进行遍历

说明:

生成器就是一种特殊的迭代器
判断是否是迭代器

from collections import Iterator

lt = [1, 2, 3, 4, 5]
# 判断是否是迭代器 
print(isinstance(lt, Iterator))
# 结果为  False


g = (i for i in range(5))
print(isinstance(g, Iterator))

可迭代对象

字符串、列表、元组、字典等都不是迭代器,他们都是可迭代对象。

定义:凡是能够使用for-in进行遍历的对象

说明:

前面学习过的字符串、列表、元组、字典等都是可迭代对象
判断是否是可迭代对象

from collections import Iterable

lt = [1, 2, 3, 4, 5]
print(isinstance(lt, Iterable))

g = (i for i in range(5))
print(isinstance(g, Iterable))
将可迭代对象转换为迭代器

from collections import Iterator

lt = [1, 2, 3, 4, 5]

# 将可迭代对象转换为迭代器
lt2 = iter(lt)
print(isinstance(lt2, Iterator))

高级函数

map函数

功能及参数
参数:
func:一个函数
iter1:一个可迭代对象
功能:使用func函数依次作用域iter1中的每个元素,返回一个迭代器
示例:

from collections import Iterator
lt = [1, 2, 3, 4, 5]

m = map(lambda x: x*x, lt)

print(m)
# 结果是map对象,是一个迭代器
print(isinstance(m, Iterator))

for i in m:
    print(i)
filter函数

功能及参数
参数:
function:一个函数
iterable:一个可迭代对象
功能:
使用function函数依次作用于iterable中的每个元素,返回的迭代器中会保留处理结果为真的数据
示例:类似一个过滤器 将符合条件的选出

from collections import Iterator

lt = [1, 2, 3, 4, 5]
f = filter(lambda x: x % 2 == 0, lt)

print(f)
# 返回一个迭代器,保留处理结果为True的元素
print(isinstance(f, Iterator))

for i in f:
    print(i)

reduce函数

功能及参数
参数:
function:一个函数
sequeue:一个序列
功能
首先从序列中提取两个元素,使用function函数处理,处理完的结果与下一个元素再次使用function函数处理,依次递归进行下去,直到序列结束,最后返回处理完的结果。
示例:进行循环利用

from functools import reduce

lt = [1, 2, 3, 4, 5]

# result = reduce(lambda x, y: x+y, lt)
result = reduce(lambda x, y: 10*x+y, lt)

print(result)

今天的学习就到这里啦,加油!!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值