编程语言
首页 > 编程语言> > python生成器,闭包

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