python生成器,闭包
作者:互联网
==========================
动态语言 python 程序执行的过程,可以添加属性和方法
静态语言 Java 只能执行已经定义好的代码,如果没用提前定义,则不能执行
class Person:
def __init__(self,name):
self.name = name
xiaoming = Person('小明')
print(xiaoming.name)
# 执行过程中,添加属性
xiaoming.age = 18
print(xiaoming.age)
============================
__slots__ 可以限制当前类中能够添加哪些实例属性
class Person:
__slots__ = ('name','age','sex')
xiaoming = Person()
xiaoming.name = '小明'
xiaoming.age = 18
xiaoming.sex = '男'
print(xiaoming.name)
print(xiaoming.age)
print(xiaoming.sex)
# 无法添加没用定义的属性
# xiaoming,addr = '长沙'
# print(xiaoming.addr)
=====================
生成器:存储数据生成的方式,等需要用到的时候执行,用一次执行一次
next 打印需要next (取值)
# list1 = [i for i in range(1,11)]
# print(list1)
# 定义生成器
list2 = (i for i in range(1,11))
# print(list2)
print(next(list2))
print(next(list2))
=====================
生成器的本质也是一个函数
yield 与return相同 返回结果 yield是生成器的返回
特点 支持显示的暂停与恢复
def fei_bo():
# 定义第一项和第二项
a = 1
b = 1
for i in range(10): # 8项
yield a
a, b = b, a + b
fei = fei_bo()
# print(next(fei))
# print(next(fei))
# print(next(fei))
# print(next(fei))
for i in fei:
print(i)
====================
可迭代对象:可以通过for循环遍历的对象
list tuple str dict
迭代器,存储数据的一个容器
list1 = [1,2,3,4,5]
print(dir(list1))
# for i in list1:
# print(list1)
print('+++++++')
# iter(迭代对象)
list2 = iter(list1)
print(dir(list2))
# 迭代器和迭代对象
# print(list2)
# print(next(list2))
# print(next(list2))
# print(next(list2))
# print(next(list2))
# print(next(list2))
# for i in list2:
# print(i)
# 生成器本质上也是一个迭代器
# for循环底层原理
# try:
# with True:
# print(next(list2))
# except StopIteration:
# pass
======================
闭包:函数嵌套,外层函数返回内层函数的函数体
函数体: 调用函数的时候只写了函数名,没用加括号
nonlocal 修改局部变量,在函数的局部变量中使用
def func1():
# print('Hello world')
#
# f1 = func1() # 函数体 f1 = func1
# print(f1)
# def outer():
# num1 = 10
# def inner():
# nonlocal num1 # 修改局部变量
# num1 += 1
# print(num1)
# return
#
# inner() # 或 return
#
# outer()
# 闭包
def outer():
def inner():
print('hello')
return inner
# print(outer()) # inner
# outer()()
f1 = outer() # fi = inner
f1() # f1() = inner()
==========================
装饰器:在不改变原有函数的前提下,给函数添加功能,原理就是一个闭包函数
可以在另一个函数中,调用另一个函数
def outer(f1):
def inner(name):
print('添加的功能1')
print(f1(name))
print('添加的功能2')
return inner
@outer
def func2(name):
return '%s我也渴望添加功能'%name
func2('小明')
'''
自定义一个装饰器,它可以计算函数运行的时间
总结
'''
import datetime
now = datetime.datetime.now()
print('hello')
now_new = datetime.datetime.now()
标签:闭包,xiaoming,name,python,生成器,next,print,list2,def 来源: https://www.cnblogs.com/longwanghzx/p/16417265.html