您的位置:首页 > 编程语言 > Python开发

python基础之递归,闭包,迭代器(7)

2019-07-03 20:41 323 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/Gold_Master/article/details/94589848

递归函数

在当前函数当中调用当前函数本身的函数就是递归函数。
递归的运行特性:先进后出

def digui(num):
print(num) # 3 , 2,1,0,====,0,1,2,3
if num > 0:
digui(num-1)  # 调用函数本身
else:
print("==========")
print(num) # 3 2
digui(3)

#结果 3 2 1 0 ==== 0 1 2 3
先今后出,digui(0)首先被释放,再digui(1)

# 递归实现斐波那契数列
# 1,1,2,3,5,8,13,21...

def feibo(n): # n是位置
if n == 1 or n == 2:
return 1
else:
return feibo(n-1) + feibo(n-2)
res=feibo(6)

方法二:

def fib(n):
a, b = 1, 1
for i in range(n - 1):
t=b
b=a+b
a=t
return a
print(fib(6))

# 递归 能不用就不用
# 1.运行效率及其低,2.递归的层数不能过多(1000层)3.递归不适用计算庞大的数据量
# 写递归需要注意的事项:必须给它出口,否则会一直调用自己,直到递归层数过多,栈溢出

# 递归实现阶乘 1 * 2 * 3 * 4 * 5 * 6 * ....
def func(n):
if n==1:
return 1
else:
return func(n-1)*n
res=func(6)
print(res)

闭包

闭包的定义:

内函数使用外函数的局部变量,并且外函数将内函数返回出来的方法叫闭包,
返回的内函数叫 闭包函数.

闭包的特点:
外函数的临时变量会在将来的内部函数中用到,

  • 自己调用结束后会把外函数的临时变量与内函数绑定,函数运行完成后这个闭包的临时空间不会被释放.
  • 或者说函数结束后,该函数向上层引用的局部变量仍然还是存在的不会被清空.
    将来调用内函数的时候仍可使用外函数变量.

闭包的意义:
闭包可以优先使用外函数中的变量,并对闭包中的值起到了封装保护的作用.外部无法访问.

def out():
num = 1
def middle():
num1 = 2
print(num)
def inner():
print(num1)
return inner
return middle
func = out()
res = func()  # func() 相当于 middle()
res()  # res() 相当于 inner()

money = 100
def give_money():
global money
print(money)
money += 100
give_money()
give_money()
money = 10000
give_money()
give_money()
give_money()
#结果为: 100 200 10000 10100 10200 受外部的全局变量10000影响

def give_money():
money=100
def give1_money():
nonlocal money
print(money)
money+=100
return give1_money
res=give_money()
res()
res()
money=10000
res()
res()
结果为100 200 300 400 不受外部变量影响

def out(name):
def inner():
print(name,"喜欢在夏天穿短裤")
return inner
func = out("小明")  # func == inner    : func() == inner()
func()

迭代器

  • 迭代器:数据量(序列里的数据)过大的情况需要用到迭代器
  • 特征:迭代器会生成惰性序列,它通过计算把值依次的返回,一边循环一边计算而不是一次性得到所有数据
  • 优点:需要数据的时候,一次取一个,可以大大节省内存空间.而不是一股脑的把所有数据放进内存.
    惰性序列:没有一次性的把所有数据都放在序列中,而是遍历一个放一个,这样的序列
  • iter(Iterable) zip(Iterable,Iterable…)
  • iter() 功能:把可迭代数据对象 转换为迭代器
  • 参数: 可迭代的对象(list,str,tuple,set,dict,range())
  • 返回值: 迭代器,是可迭代的对象,但可迭代的对象不一定是迭代器
检测:

#--Iterable可迭代的  Iterator迭代器
#isinstance() 判断数据类型,返回bool值

from collections import Iterable,Iterator #迭代器,可迭代类型检测,需要先调用出来.
list1 = [1,2,3,4,5]
result = isinstance(list1,Iterator)
print(result)
result1=isinstance(list1,Iterable)
print(result)

iter(Iterable)

  • 功能:使用iter可以把可迭代数据变成迭代器
  • 参数:Iterable(可迭代对象)
  • 返回值:迭代器
# 从迭代器里取值:三种方法
#方法一 print(next())
tuple
tuple1 = (1,2,3,4,5,6)
res = iter(tuple1)

print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))
print(next(res))

#方法二 for 循环
for num in res:
print(num)

#方法三 数据类型转换
print(list(res))

zip(Iterable,Iterable,…)

功能:从参数中的多个可迭代对象取元素组合成一个新的迭代器,迭代器的组成元素是元组.
参数:Iterable(可迭代对象)
返回值:返回一个zip对象(迭代器),其内部元素为元组

list1 = ["大锤","二妮","小可爱"]
tuple1 = ("80","40","白给")
res = zip(list1)
print(res,type(res))
print(next(res))
print(next(res))
print(next(res))

#多个参数的zip

list1 = ["大锤","二妮","小可爱","老可爱"]
tuple1 = ("80","40","白给")
res = zip(list1,tuple1)
for name in res:
print(name)
res1 = dict(res)
print(res1)

结果:
('大锤', '80')
('二妮', '40')
('小可爱', '白给')
{}

*zip()函数是zip()函数的逆过程,将zip对象变成原先组合前的数据。
*zip 不能作为开头直接出现,需要和zip 配合使用

list1 = ["大锤","二妮","小可爱","老可爱"]
tuple1 = ("80","40","白给")
res = zip(*zip(list1,tuple1))
for name in res:
print(name)

结果:
('大锤', '二妮', '小可爱')
('80', '40', '白给')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: