''''生成器generator'''
l = [x*x for x in range(10)]
print(l)
# 实现生成器
t = (x*x for x in range(10))
print(t)
# 使用next()方法,可以获取生成式中的下一个元素
print(next(t))
print(next(t))
print(next(t))
print(next(t))
print(next(t))
print(next(t))
print(next(t))
print(next(t))
print(next(t))
print(next(t))
# 如果生成器中的元素已经取完了,则抛出StopIteration异常
# print(next(t))
print('---------------------------------')
g = (x*x for x in range(10))
for i in g:
print(i)
'''
利用函数实现生成器
'''
import time
# 自然数序列
def nature():
n = 1
while True:
'''
return n 1.返回n的值; 2.立即结束函数的执行
yield n 1.返回n的值; 2.立即暂停函数的执行
'''
# print(n)
yield n
n += 1
g = nature()
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
# for e in g:
# print(e)
# time.sleep(1)
# 练习:利用生成器生成斐波那契数列序列
'''
1 1 2 3 5 8 13
a = 0 b = 1 a+b=1; a = b b = a+b
a = 1 b = 1 a+b=2; a = b b = a+b
a = 1 b = 2 a+b=3; a = b b = a+b
a = 2 b = 3 a+b=5; a = b b = a+b
a = 3 b = 5 a+b=8.。。。
'''
def fib():
a,b = 0,1
while True:
yield b
# t = a
# a = b
# b = t+b
# 先计算赋值符号的右边,然后再赋值
a,b = b,a+b
f = fib()
print(f)
print(fib)
# for i in f:
# print(i)
# time.sleep(0.5)
from collections.abc import Iterable
print(isinstance(f,Iterable))
'''
高阶函数
函数名本质上就是一个指向该函数的变量
'''
print(abs(-5))
print(abs)
print('-------------------------------')
# f = abs
# abs = 7
# print(abs)
# print(abs(-5))
'''
函数作为参数传入
一个函数A可以接收另一个函数B作为参数,我们把这个函数A称为高阶函数
'''
f = abs
def add(x,y,f):
return f(x)+f(y)
print(add(3,4,f))
print(add(-3,-4,f))
def g(x):
return x*x
print(add(3,4,g))
# map()函数 /reduce()/filter()
r = map(g,[1,2,3,4,5])
print(list(r))
'''
函数作为返回值
'''
print('-------======================')
def s(*args):
ss = 0
for arg in args:
ss += arg
return ss
print(s(1,2,3,4))
print(s(1,3,5,7))
'''
lazy_s()函数中定义了内部函数s(),而s()函数中又引用了外部函数lazy_s()的参数 args
当lazy_s()函数返回函数s(),相关的参数和变量都已经保存在返回的函数中
我们把这种程序结构称为 闭包Closure
'''
def lazy_s(*args):
# 定义函数
def s():
ss = 0
for arg in args:
ss += arg
return ss
return s
h = lazy_s(1,2,3,4)
'''
def s():
ss = 0
for arg in (1,2,3,4):
ss += arg
return ss
'''
print(h)
print(h())
|