Python迭代器、生成器、匿名函数、高阶函数

Python迭代器、生成器、匿名函数、高阶函数

迭代器和生成器

迭代

在python中就是属于可以做for循环遍历的对象,被叫做可迭代对象

可迭代对象分为容器和迭代器两个,迭代器又有生成器分支

迭代器

  • 性质:
  1. print无法打印迭代器中的元素
  2. len无法查看其中元素
  3. 类似数据结构中的对列(先进先出),迭代器中的元素被取出,即消失
  4. 任何容器型数据类型都可以使用iter方法转为迭代器
str1 = 'fwgq'
str1_iter = iter(str1)
print(str1_iter,type(str1_iter))
  • 元素的获取
  1. for循环遍历
  2. next()
print(next(str1_iter))
print(next(str1_iter))
for i in str1_iter:
    print(i)
  • 迭代器的作用

当迭代器中的元素全部取出,迭代器消失,所占内存被释放

生成器

  • 性质:
  1. 生成器是为了生成迭代器{迭代器包括生成器}
  2. 生成器是一个函数
  3. 调用生成器函数时,函数不执行,只有在获取元素时生成器函数才执行,且获取一个元素执行一次
  4. 生成器函数返回内部结果使用yield代替return
  5. yield执行几次,生成器便产生几个元素
def myGener():
    yield 100
    yield 200
    if 100 > 200:
        yield 300
    return 1
    yield 400


f = myGener()
print(f)
print(next(f))
  • yield和return的区别
  1. return响应时,函数立刻结束;yield不会
  2. 两者都可以将函数内部结果返回到外部
  3. 两者后面都是跟着表达式

匿名函数

概念

Python中有一个lambda表达式,lambda有匿名的意思,并且lambda表达式就是简化的函数

匿名函数与普通函数的关系类似于单分支结构和三目运算符的关系

语法糖

匿名函数在语法上就是有单一的严格限制的固定语法(在语义上是普通的语法糖)
语法糖(糖衣语法,英国人提出的概念),就是对已经存在的语法简化
能够提高代码的可读性,但不影响功能

  • 语法:

    函数名 = lambda 形参:返回值
    函数名(实参)

def sum(num1,num2):
    return num1 + num2

print(sum(10,24))

sumLambda = lambda num1,num2:num1 + num2
print(sumLambda(12,52))

并不是所有函数都可以转为匿名函数

递归

一种循环的思想

函数之间是一个相互调用的过程,递归是对于函数来说的,但是递归是一种特殊的函数调用(自己调自己)

递推思维:斐波那契数列:根据已有的数据推算规律(正向的推算)

**递归思维:**根据规律逆向推算

递归思维需要注意循环结束的条件,否则会陷入死循环

# 斐波那契数列
def fib(N):
    if N == 1 or N == 2:
        return 1
    else:
        return fib(N - 1) + fib(N - 2)

fib(9)

递归思想的编码:

  1. 知道最终结果的计算规律
  2. 从需要算的结果向前退
  3. 清楚递归结束的条件
  4. 学会自己调用自己的方式
# 计算N的阶乘
def jiecheng(N):
    if N == 1:
        return 1
    else:
        return N * jiecheng(N - 1)


print(jiecheng(9))

能使用循环解决的就能使用递归
但是递归使用时需要谨慎,如果涉及计算量很大,有一个拓栈和压栈的过程,前者容易内存溢出
栈:先进后出

高阶函数

将一个函数当作另一个函数的参数,叫做高阶函数

print(max)

def func1():
    print('这是一个函数')

print(func1)
func1()
a = func1
a()

自定义函数相当于是定义了一个数据类型为function的变量

def func2(func):
    print('这是另一个')
    func()

func2(func1)

Python常用的的高阶函数

max/min/sorted/map/reduce

  • **max/min:**获取容器中最大(最小)的元素
nums = [21,413,52,63,37]
print(max(nums))
  • **max(容器,key=函数):**按照函数定义的方式获取容器中的最大值

函数的要求:1. 函数有且仅有一个形参。2. 必须有返回值。

# 按照数字中个位数的大小取值(找出个位数最大的)
def unitNum(num):
    return num % 10


print(max(nums, key=unitNum))
print(max(nums, key=lambda  num :num % 10))
print(min(nums, key=unitNum))
  • **sorted(容器,key=函数):**按照函数指定的形式对容器中元素排序
nums = [21,413,52,63,37]
print(sorted(nums, key=lambda num: num % 10))
  • **reduce(函数,容器,初始值):**根据传递的容器对容器中每个元素做累计

函数要求:a.函数有两个形参。第一个形参开始指向初始值,然后再指向每次累计的结果 ; 第二个形参指向容器中每个元素
b.必须有返回值

from functools import reduce

nums = [21,413,52,63,37]
print(reduce(lambda total, num: total * num, nums, 1))
  • reduce和for循环对比:

reduce性能明显不及for循环,但是如果从代码可读性(优雅的写法)reduce是更好的

  • **map(函数,容器1,容器2,…)😗*根据容器产生一个新的序列

函数要求:a.函数有N(容器数量)个形参
b.有返回值

map函数的结果是一个可迭代对象
可以将这个可迭代对象使用构造器语法转换为列表,元组,集合等容器

names = ['小时','小费','小王']
chi = [64,73,83]
eng = [62,83,93]
map_iter = map(lambda a,b,c:{'name':a,'chi':b,'eng':c},names,chi,eng)
print(map_iter)
for i in map_iter:
    print(i)
print(list(map_iter))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值