函数 装饰器 生成器 列表解析式

# c = a if a>b else b   #三元运算
def func(name,*args,name1=‘name1‘,**kwargs):
    # 如果默认参数的值是一个可变数据类型,那么每一次调用函数且对其进行增删改的时候,如果不传值就公用这个数据类型的资源
    return ‘s‘    # 可以元组方式返回多个值,也可以单独返回字符串列表字典等
func(name,)        # ret = func()多个值之间用逗号隔开,接收的时候可以用一个变量接收(元组),也可以用等量的多个变量接收
func(*[‘a‘,[1,2],‘c‘])    # *打撒 将元素单个传参
#4.函数的参数
    #形参:
        # 位置参数 : 必须传
        # *args :可以接收任意多个位置参数
        # 默认参数 : 可以不传
        # **kwargs : 可以接收多个关键字参数
    #实参  调用函数的时候
        # 按照位置传参数
        # 按照关键字传参数
            # 可以混用 位置参数必须在关键字传参之前
            # 不能对一个参数重复赋值
# 作用域两种
# 全局作用域 —— 作用在全局 —— 内置和全局名字空间中的名字都属于全局作用域  ——globals()
# 局部作用域 —— 作用在局部 —— 函数(局部名字空间中的名字属于局部作用域) ——locals()
# 如果在一个局部(函数)内声明了一个 global 变量名,那么这个变量在局部的所有操作将对全局的变量有效
# globals 永远打印全局的名字
# locals 输出什么 根据locals所在的位置
# nonlocal 只能用于局部变量 找上层中离当前函数最近一层的局部变量,局部没有则报错,声明了nonlocal的内部函数的变量修改会影响到 离当前函数最近一层的局部变量,对全局无效,对局部 也只是对 最近的 一层 有影响
# func()              # 函数名就是内存地址
# func2 = func      # 函数名可以赋值
# l = [func,func2]    # 函数名可以作为容器类型的元素
# return f          # 函数名可以作为函数的返回值
# qqxing = wahaha(func)   # 函数名可以作为函数的参数
# 闭包 : 内部函数使用外部函数的变量

# 装饰器函数
# def wrapper(f):    #装饰器函数,f是被装饰的函数
#     def inner(*args,**kwargs):
#         ‘‘‘在被装饰函数之前要做的事‘‘‘
#         ret = f(*args,**kwargs)    #被装饰的函数
#         ‘‘‘在被装饰函数之后要做的事‘‘‘
#         return ret
#     return inner
# @wrapper         #语法糖 @装饰器函数名
# def func(a,b):     #被装饰的函数
#    pass
# import time
# from functools import wraps
# FLAGE = False
# def timmer_out(flag):
#     def timmer(func):
#           @wraps(func) #加在最内层函数正上方
#         def inner(*args,**kwargs):
#             if flag:
#                 start = time.time()
#                 ret = func(*args,**kwargs)
#                 end = time.time()
#                 print(end-start)
#                 return ret
#             else:
#                 ret = func(*args, **kwargs)
#                 return ret
#         return inner
#     return timmer
# @timmer_out(FLAGE)
# @ def func():
#     pass

# @wrapper3
# @wrapper2
# @wrapper1
# def func():pass

l=[‘a‘,‘b‘]
p = l.__iter__()
print(next(p),p.__next__())
# 迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器
# 可以被for循环的都是可迭代的
# 可迭代的内部都有__iter__方法
# 只要是迭代器 一定可迭代
# 可迭代的.__iter__()方法就可以得到一个迭代器
# 迭代器中的__next__()方法可以一个一个的获取值
# def func():
#     yield ‘a‘
#     yield ‘b‘
# 只要含有yield关键字的函数都是生成器函数
# 生成器函数:执行之后会得到一个生成器作为返回值,可循环取值for i in 调用的返回值:pass,next()取值
# 迭代器的特点:很方便使用,且只能取所有的数据取一次,节省内存空间
# 生成器函数:
    #含有yield关键字的函数就是生成器函数
    #特点:
        #调用函数的之后函数不执行,返回一个生成器
        #每次调用next方法的时候会取到一个值
        #直到取完最后一个,在执行next会报错
# def func():
#     content = yield ‘a‘
#     yield ‘b‘
# ret = g.__next__()
# ret = g.send(‘hello‘)
# send获取下一个值的效果和next基本一致,只是在获取下一个值的时候,给上一yield的位置传递一个数据
# 使用send的注意事项:第一次使用生成器的时候 是用next获取下一个值,最后一个yield不能接受外部的值
# 获取移动平均值,预激生成器的装饰器
# def init(func):   #装饰器
#     def inner(*args,**kwargs):
#         g = func(*args,**kwargs)    #g = average()
#         g.__next__()
#         return g
#     return inner
# @init
# def average():
#     sum,count,avg = 0,0,0
#     while True:
#         num = yield avg
#         sum += num    # 10
#         count += 1    # 1
#         avg = sum/count
# avg_g = average()   #===> inner
# ret = avg_g.send(10)
# print(ret)
# ret = avg_g.send(20)
# print(ret)

# [每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型]    #遍历之后挨个处理
# [满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件]   #筛选功能
l1 = [‘选项%s‘%i for i in range(10)]
# 把列表解析的[]换成()得到的就是生成器表达式
# 列表解析与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存
# l1 = [‘选项%s‘%i for i in range(10) if i%3==0] 理解如下==>
#     for i in range(10):
#        if i%3==0:
#            li.append(‘选项%s‘%i)
# 若还有条件则继续缩进代码取值
#
# l1 = (‘选项%s‘%i for i in range(10))        # 返回一个生成器对象
# for i in l1:print(i)
# print(li,list(li))
# l1.__next__()        # next(l1)
# l1 = {‘选项%s‘%i for i in range(10)}        # 生成集合
# l1 = {i:‘选项%s‘%i for i in range(10)}    # 生成字典

原文地址:https://www.cnblogs.com/ming-yuan/p/9536860.html

时间: 2024-10-06 15:15:42

函数 装饰器 生成器 列表解析式的相关文章

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()

《Python运维开发之路》 装饰器&生成器&迭代器(五)

一.装饰器 装饰器可以使函数执行前和执行后分别执行其他的附加功能,这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator),装饰器的功能非常强大.装饰器一般接受一个函数对象作为参数,以对其进行增强      说白了:就相当于C++中的构造函数,与析构函数 装饰器本身是一个函数,用于装饰其他函数 装饰器是一个闭包函数是嵌套函数,通过外层函数提供嵌套函数的环境 装饰器在权限控制,增加额外功能如日志,发送邮件用的比较多 1,原函数不带参数的装饰器 假设:我定义了一个函数lyshar

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

Python高阶函数与函数装饰器-day4

上节回顾 高阶函数 闭包函数 函数装饰器 模块导入 一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首先是Python3-->代码文件都是用utf-8来解释的.将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以"

函数装饰器和闭包(一)

装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数),装饰器可能会处理被装饰的函数,然后将它返回,或者将其替换成另一个函数或可调用对象 def deco(func): def inner(): print("running innner()") return inner # <1> @deco def target(): # <2> print("running target()") target() # <3>

python函数装饰器

学习装饰器前提需要了解高阶函数,函数嵌套,函数闭包 python函数装饰器,顾名思义就是装饰函数,为函数添加新功能的的一种方式. 为什么要使用装饰器呢? 因为函数在运行时,如果不使用装饰器对函数进行功能添加,需要修改函数源代码,这样修改无疑会增加程序的冗余和复杂性,也不便于程序员对其进行修改.使用装饰器,可以在不改变函数源代码和调用方式的前提下,使用语法糖@装饰器,对函数功能进行添加. 装饰器本质上就是一个函数. 我们使用一个简单的例子来实现: import time #这是一个装饰器函数名为t

MyPython--&gt;进阶篇--&gt;匿名函数 装饰器

当我们在传入函数时,有些时候,不需要显示地定义函数,直接传入匿名函数更方便 匿名函数 lambda x :x+x  实际就是 def s(x): return x+x 关键字 lambda 表示匿名函数,冒号前面的x表示 函数的参数 匿名函数有一个限制,就是只能有一个表达式,不用写return ,返回值就是该 表达式的结果 匿名函数没有名字,不必担心函数名冲突 也可以赋值给变量  在调用,也可以返回一个匿名函数 装饰器 在函数调用前后自动打印日志,但又不希望修改now()函数的定义,这种在代码运