首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

原来Python函数只是个对象

函数是对象 Python中万物皆对象,函数也不例外,这意味着函数有以下特点: 在运行时创建 能赋值变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 用代码把函数类型打出来看到本质: >...高阶函数 接受函数为参数或者把函数作为结果返回的函数,叫做高阶函数,比如map、filter、reduce,但是!...()会报错TypeError: 'Test' object is not callable。...labmda表达式创建的匿名函数只在参数中且逻辑简单时使用。函数是可调用对象,实现了__call__的类也是可调用的,可以使用callable()函数来判断。...最后列出了函数属性,它们记录了函数各个方面的信息。 参考资料: 《流畅的Python》

48130

《流畅的Python》第五章学习笔记

一等对象 在运行时创建 能赋值变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 第二点和第三点在实际编写代码的时候经常用到!...高阶函数 接受函数为参数,或者把函数作为结果返回的函数就是高阶函数。...lambda关键字可以创建匿名函数 除了作为参数传递给高阶函数之外,不建议使用匿名函数。..._empty'> # 1:max_len=80 函数注解 为函数声明中参数和返回值附加元数据 def clip(text: str, max_len: 'int >0' = 80) -...(1)) print(add1(2)) 一个计算a+b的函数,我们把它其中的一个入参固定为3,这样我们只需要传入一个参数就可以计算了 不指定冻结的形参的话,默认是冻结左侧的形参,该函数中的a

39720

编写高效且优雅的 Python 代码(

in range(0, 1000000000)) # 生成器表达式返回的迭代器,只有在每次调用时才生成值,从而避免了内存占用 迭代 需要获取 index 时使用enumerate enumerate可以接受第二个参数...,比如定义一个求和的方法,至少要接收两个参数: def sum(a, b): return a + b # 正常使用 sum(1, 2) # 3 # 如果我想求很多数的总和,而将参数全部代入是会报错的...这意味着,如果你将一个生成器作为参数带入函数中,生成器将会先遍历一遍,转换为元组。...list(result)) # [0, 4] # 但不指定关键字参数则报错 get_indexs(array, 1, True) # TypeError: get_indexs() takes 1 positional...list(result)) # [0, 4] # 但不指定关键字参数则报错 get_indexs(array, 1, True) # TypeError: get_indexs() takes 1 positional

1.1K30

说说Python的元编程

装饰器 装饰器就是函数的函数,它接受一个函数作为参数并返回一个新的函数,在不改变原来函数代码的情况下为其增加新的功能,比如最常用的计时装饰器: from functools import wraps...add = decorator1(decorator2(add)) 在调用函数的时候,就像脱衣服,先解除最外面的 decorator1,也就是先打印 Decorator1,执行 return func...需要注意的是打印的位置,如果打印字符串的代码位于调用函数之后,像下面这样,那输出的结果正好相反: def decorator1(func): @wraps(func) def wrapper...根据可选参数,它还可以验证值在给定的最小值或最大值之间。...根据可选参数,它可以验证给定的最小或最大长度。它还可以验证用户定义的 predicate。

44810

Python 一等函数

这说明了什么问题,先来看看一等对象的定义: 在运行时创建 能赋值变量或数据结构中的元素 能作为参数传给函数 能作为函数的返回结果 那么,也就意味着 Python 函数是对象,是 function 类的实例...Python 数据模型文档列出了 7 种可调用对象:用户定义的函数、内置函数、内置方法、方法、类、类的实例、生成器函数。...,函数有的属性: 名称 类型 说明 __annotations__ dict 参数和返回值的注解 __call__ method-wrapper 实现 () 运算符,即可调用对象协议 __closure...既然 Python 函数是一等公民,那么 TA 既可以作为函数参数传入,也可以作为结果返回。而接受函数为参数,或者把函数作为结果返回的函数,我们称之为高阶函数。...sorted(*args, **kwargs) sorted 函数本身只接受一个列表来排序,但因为其可选参数 key 接受函数来应用到列表的各个元素上进行排序,所以摇身一变成了高阶函数(2333333)

43720

Python入门之面向对象编程(三)Python类的魔术方法

__doc__ # 返回类定义时下方写的字符串描述内容 # '描述类的信息,__doc__返回放在这里的字符串结果' s("__call__ is used") # 调用了__call__ # __call...可以被for循环的) 实现 __iter__ __next__ 方法 如果只实现__iter__则这个方法的返回值必须是一个迭代器 也可以__iter__返回一个self,再定义__next__方法,接受...= Ite1(3) for i in i1: print(i) # 0 5 第二种 class Ite2: def __init__(self, a, b):...i['age'] #报错,删掉就没有这个属性了 上下文管理 实现上下文管理,即可以和with结合使用 要实现 __enter__ __exit__ 两个方法 __enter__会返回一个值,并赋值as...2, 3] data['a'] # raise TypeError, 该异常没有被__exit__处理 参考

71640

Python教程(23)——Python类中常用的特殊成员

= arg2 # ... self 代表对象本身,arg1、arg2 等是用于接收传入的参数的形参,我们可以根据实际需要为 __init__ 方法传入不同的参数。...通常情况下,我们会定义 __init__ 方法来初始化对象的属性。 __del__ __del__ 是Python中的一个特殊方法,也被称为析构方法。它在对象被销毁前自动调用,用于进行清理工作。...当我们像调函数一样使用对象时,Python 解释会自动调用对象的 __call__ 方法,并将传入的参数作为参数递给该方法。我们可以在 __call__ 方法中定义对象的调用逻,然后执行相应的操作。...在该方法中,我们将传入的两个参数进行相加,Python 解释器会自动调用对象 add 的 __call__ 方法,并将传递给该方法。...__call__ 方法中的逻辑会被执行,参数进行相加操作,然后返回结果。 通过使用 __call__ 方法,我们可以将一个对象实例化后,即可像函数一样进行调用,并执行预定义的逻辑。

9010

Python 的 __.call()__ 方法:创建可调用实例

在上面的示例中,你可以观察方法对象,如 sample_instance.method,也有一个 .__call__() 特殊方法,将它们变成可调用对象。...__call__() 对它必须接受参数没有特殊要求。它和其它实例方法一样,以 self 作为第一个参数,并且可以根据需要接受任意多的额外参数。 下面的示例说明了带有 ....__call__() 方法没有限制。因此,可以让它们接受参数、返回值,甚至像 Counter 类示例中那样产生副作用。...__call__() 方法允许你将这些类的实例作为普通的 Python 函数来使用。这个特性在很多情况下都会派上用场,我们将在 Python 的 .__call__() 应用一节中学习。...如果当前输入的数字不在.cache字典中,那么该方法将递归计算阶乘,缓存结果,并将最终值返回调用者。

25820

卧槽,好强大的魔法,竟能让Python支持方法重载

其中第2个构造方法和第3个构造方法尽管都有一个参数类型分别是int和long。...从另一个角度看,默认参数其实与方法重载是异曲同工的,也就是过程不同,结果相同。所以Java并没有同时提供两种形式。 2....也就是说,按正常的方式不支持,你想让他支持,那就支持。要知详情,继续看下面的内容。 我们先来看一下Python为什么不支持方法重载,前面说过,方法重载需要3个维度:方法名、数据类型和参数个数。...Python只有2个维度,那就是参数名和参数个数。所以下面的代码是没办法实现重载的。..., type): raise TypeError( '参数 {} 的注解必须是数据类型'.format(name)

1.8K20

python奇遇记:深入的了解函数

Python中的函数使用def关键字定义,这个大家都知道,而且Python中函数的定义很灵活,什么位置参数、关键字参数、默认参数、可变参数等等一大堆,而且经常听到的匿名函数又是什么,还有个装饰器、闭包,...函数是一等对象 在Python中,函数就是对象,你可以直接把一个函数赋值变量,作为参数,或者在函数中返回(这样的函数叫做高阶函数),像下面这样: # 计算斐波那契 deffactorial(n):''...return1ifn # 把函数赋值一个变量 fac = factorialprint(fac(5)) # 作为列表推导式的参数 d = [fac(n)forninrange(6)]print(d)...# 会报错 v(2,3) TypeError: 'Vector' object is not callable 出错的原因是因为变量v是不可调用的,它只是Vector类的实例而已。...实现call方法之后再来试试: # 只列出__call__部分的代码 '''def __call__(self, x, y): return Vector(x, y)''' v = Vector

459100

Python学习笔记(三)——函数

调用函数 调用函数的时候,如果传入的参数数量不对,会报TypeError的错误,并且Python会明确地告诉你:abs()有且仅有1参数出了两个: >>> abs(1, 2) Traceback...(2 given) 如果传入的参数数量是对的,参数类型不能被函数所接受,也会报TypeError的错误,并且给出错误信息:str是错误的参数类型: >>> abs('a') Traceback (most...但是,在语法上,返回一个tuple可以省略括号,而多个变量可以同时接收一个tuple,按位置对应的值,所以,Python的函数返回多值其实就是返回一个tuple,写起来更方便。 3....函数的参数 >>> power(5, 2) 25 >>> power(5, 3) 125 修改后的power(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋参数...除了必选参数name和age外,还接受关键字参数kw。

53810

python装饰器进阶指南

同时也是自己对装饰器掌握的一个总结,希望能够帮助大家。需求我打算带着实际的需求来看待装饰器,这样也会更加容易理解。...装饰器的参数我将对上述的函数装饰器进行改造,使其可以接受参数。也就是make_tag('b')将会生成make_bold()这样的形式。...TypeError: wrapper() takes 0 positional arguments but 1 was given为此我需要改进下装饰器的参数列表,使其可以接受参数。...因此,正确的做法是,我们将装饰器的参数列表设置为*args, **kwargs,这样就可以接受任意数量的参数了。...换句话说,无论被装饰的函数有什么样的参数,我作为装饰器,==被装饰函数的参数统统接受,并全部打回被装饰的函数。

34250

Python装饰器是个什么鬼?

函数也是对象,可以赋值变量,可以做为参数,也可以嵌套在另一个函数内。 对于第三种情况,如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。...和**kwargs,作为装饰器内部函数inner_wrapper()的参数 ,表示接受任意数量和类型的参数,因此装饰器就可以写成下面的形式: def my_decorator(func): def...除了函数外,我们也可以让任何一个类(class)变得“可被调用”(callable),只要自定义类的 __call__ 方法即可。 因此不仅仅是函数,类也可以做为装饰器来用。...作为装饰器的类需要包含__call__()方法。...missing 1 required positional argument: 'x'""" # foo如下方式可以使用正常,显式的传递实例参数a。

85610
领券