day04;
函数名的本质,闭包函数,装饰器,迭代器,生成器,列表推导式,三元运算,匿名函数 。
=================================================================
#函数名;
def a():
print('in a func')
# a()
# print(a) # <function a at 0x00000000039C41E0>
# b = a
# print(b)
# b()
# 并不是只有函数名()才能调用一个函数
# 只要是函数的地址对应的变量都可以通过()调用函数
# l = [a]
# print(l[0])
# l[0]()
#函数的名字可以被赋值,也可以作为一个容器类型的元素,可以作为函数的参数,可以做返回值
# 变量怎么使用,函数的名字都可以怎么用
#闭包函数 :
# 闭包的作用 :Python中闭包的主要用途就是用于装饰器的实现,如果一个内部的函数引用了外部函数的变量,那么这个内部函数就是一个闭包函数。
# def hanshu():
# name = 'alex'
# def a():
# # '''一旦内层函数引用了外层函数的变量,a就是一个闭包函数'''
# print('in func a',name) # 这是一个闭包函数
# return a
#
# a = hanshu()
# print(a())
# def func1():
# a = 1
# b = 2
# def inner(): # inner中没有用到a,b所以不是闭包
# print(1,2)
#装饰器 ;
@timemer 装饰器
# 什么情况下使用用:
# 在已经写好要发版的程序的基础上,需要对一个函数执行前或者是执行后在需要增加功能的时候
# 开放封闭原则
# 开放 :对扩展是开放的
# 封闭 :对修改时封闭
# 有的时候也会写好一些装饰器,加在需要装饰的函数上面
# login django框架里也这么用
# log
# 装饰器的固定格式;
# def 装饰器的名字(func):
# def inner(*args,**kwargs):
# '''在执行被装饰的函数之前要做的事儿'''
# '''判断是否登录'''
# ret = func(*args,**kwargs)
# '''在执行被装饰的函数之后要做的事儿'''
# '''写log'''
# return ret
# return inner
#迭代器 :
# 迭代器的特点:
# 1.一个一个的取值,而不是一次性把所有数据都创建出来,迭代器中的数据不取不创建
# 2.只能按照顺序取,不能跳过也不能回头
# 3.一个迭代器中的数据只能从头到尾取一次
# 可迭代器协议: 如果一个数据类型中有 iter方法 ,那么这个数据类型就是可迭代类型
# 迭代器协议:如果一个数据类型中有iter和next方法,那么这个数据类型就是一个迭代器类型
# print('__iter__' in dir(123))
# print('__iter__' in dir(123.43))
迭代器的特点:节省内存空间
# 除了文件操作符以外你见过的所有内容都不是迭代器类型
# 都只是可迭代类型
# 可迭代类型是可以通过某些方法转换成迭代器,所有能被for循环的至少是一个可迭代类型