python公共函数,python公共方法
Python的功能是“一等公民”。您可以将它们赋给变量,存储在数据结构中,作为参数传递给其他函数,甚至作为其他函数的值返回。
直观地探究这些概念,会更容易理解Lambda、decorator等Python的高级函数。也让你走上了函数式编程技术的道路。
在本教程中,我将通过许多例子来指导您,帮助您发展这种直观的理解。这些例子会相互叠加,因此您可能需要按顺序阅读它们,甚至在继续学习时在Python解释器会话中尝试其中的一些。理解我们将在这里讨论的概念可能需要比预期更长的时间。别担心,完全正常。我去过那里。你可能会觉得好像你在用头撞墙,然后当你准备好了,事情突然“咔嚓”一声到位了。
在整个教程中,我将使用这个yell函数进行演示。这是一个简单的玩具示例,输出易于识别:
def yell(text): return text.upper()!
大喊(“你好”)
“你好!”
函数是对象。
Python程序中的所有数据都由对象或对象之间的关系来表示。字符串、列表、模块和函数都是对象。Python中的函数没有什么特别的。
因为yell函数是Python中的一个对象,所以您可以将它赋给另一个变量,就像任何其他对象一样:
Bark=yell这行不会调用这个函数。它接受yell引用的函数对象,并创建指向它的第二个名称,即bark。现在,您也可以通过调用bark来执行相同的基本函数对象:
吠叫(“汪汪”)“汪汪!”
对象及其名称是两个独立的问题。这里有更多的证据:你可以删除函数的原始名称(yell)。因为另一个名字(bark)仍然指向基本函数,所以仍然可以通过它调用函数:
德尔耶尔
大喊(你好?)
name error:“name”大喊“未定义”
吠叫(“嘿”)
嘿!
顺便说一下,Python在创建时为每个函数附加了一个字符串标识符,以便调试。您可以使用name属性来访问此内部标识符:
bark.name yell
该函数的名称仍然是“黄色”,这不会影响您从代码中访问它的方式。这个标识符只是一个调试辅助工具。指向函数的变量和函数本身是两个不同的问题。(从Python 3.3开始,还有__qualname__,它有一个类似的函数,并提供限定的名称字符串来消除函数和类名的歧义。)
函数可以存储在数据结构中。
由于函数是一等公民,您可以像其他对象一样将它们存储在数据结构中。例如,您可以向列表中添加函数:
funcs=[bark,str.lower,str . capital]funcs
[,
,
]
访问存储在列表中的功能对象的方式与使用任何其他类型的对象的方式相同:
对于函数中的f:print(f,f(嘿,你好))
“嘿,你好!”
嘿,你好
嘿,你好
您甚至可以调用存储在列表中的函数对象,而不必先将它们赋给变量。您可以查找它,并立即在单个表达式中调用生成的“无实体”函数对象:
funcs0“嗨哟!”
传递给其他函数的函数
因为函数是对象,所以可以将它们作为参数传递给其他函数。这是一个问候语函数,它使用传递给它的函数对象格式化问候语字符串,然后将其打印出来:
def greet(func): greeting=func(嗨,我是Python程序)
打印(问候)
您可以通过传入不同的函数来影响生成的问候。如果通过yell函数打招呼,会发生以下情况:
打招呼(大喊)‘嗨,我是PYTHON程序!’
当然,你也可以定义一个新的函数来生成不同的问候语。例如,如果你不想让Python程序听起来像擎天柱,下面的耳语功能可能更好:
def whisper(text):return text . lower() .
问候(耳语)
‘嗨,我是python程序……’
将函数对象作为参数传递给其他函数的功能非常强大。它允许你抽象和转移程序中的行为。在这个例子中,greet函数保持不变,但是您可以通过传入不同的问候行为来影响它的输出。
可以接受其他函数作为参数的函数也称为高阶函数。它们是函数式编程风格的必要条件。
Python中高阶函数的一个经典例子是内置的map函数。它接受一个函数和一个iterable对象,对iterable对象中的每个元素调用函数,并随着迭代的进行产生结果。
通过将yell函数映射到问候语,您可以立即格式化所有问候语:
list(map(大喊,[你好,嘿,嗨])[你好!,‘嘿!’,‘嗨!’]
Map遍历整个列表,并将yell函数应用于每个元素。
嵌套函数
Python允许在其他函数中定义函数。这些通常被称为嵌套函数或内部函数。这是一个例子:
def speak(文本):def whisper(t):
return t.lower() .
回复耳语(文本)
说话(“你好,世界”)
“你好,世界…”
现在,发生什么事了?每次调用,它都会定义一个新的内部函数whisper,然后调用它。
而这里的内部功能,外界是看不到的。
whisper(Yo )名称错误:“名称 whisper 未定义”
说话,耳语
AttributeError:“”函数对象没有属性“whisper”
但是,如果您真的想从外部访问嵌套函数呢?是一个函数对象,可以将内部函数返回给父函数的调用者。例如,这是一个定义了两个内部函数的函数。根据传递给顶级函数的参数,它选择一个内部函数并将其返回给调用者:
def get_speak_func(音量):def whisper(文本):
return text.lower() .
def yell(文本):
return text.upper()!
如果体积为0.5:
回喊
否则:
回复耳语
注意get_speak_func实际上并不调用它的一个内部函数,它只是根据volume参数选择合适的函数然后返回这个function对象:
get_speak_func(0.3)。在0x10ae18耳语
get_speak_func(0.7)。对着0x1008c8大喊
当然,您可以直接调用返回的函数,或者先将它赋给变量名:
speak _ func=get _ speak _ func(0.7)speak _ func( Hello )
“你好!”
让它在这里呆一会儿.这意味着函数不仅可以通过参数接受行为,还可以返回行为。多酷啊。你知道吗,这里开始有点混乱了。在继续写之前,我会喝点咖啡休息一下(我建议你也这样)。
函数可以捕获本地状态。
您刚刚学习了函数如何包含内部函数,您甚至可以从父函数返回这些(否则是隐藏的)内部函数。
最好现在就系好安全带,因为这会变得更加疯狂——我们将进入函数式编程的更深领域。
函数不仅可以返回其他函数,而且这些内部函数可以捕获并携带一些父函数的状态。
我将稍微改写前面的get_speak_func示例来说明这一点。新版本立即带有一个“volume”和一个“text”参数,以便可以立即调用返回的函数:
def get_speak_func(text,volume): def whisper():
return text.lower() .
def yell():
return text.upper()!
如果体积为0.5:
回喊
否则:
回复耳语
get_speak_func(Hello,World ,0.7)()
“你好,世界,”
现在,仔细看看内部函数的耳语和叫喊。请注意,它们不再有文本参数了吗?但是它们仍然可以以某种方式访问父函数中定义的文本参数。事实上,他们似乎领会并“记住”了这一论点的价值。
执行这个操作的函数被称为词法闭包(或简称为闭包)。即使程序流不再在这个范围内,闭包也会从它的词法范围中记住这些值。
实际上,这意味着函数不仅可以返回行为,还可以预先配置这些行为。这里有另一个简单的例子来说明这个想法:
def make_adder(n): def add(x):
返回x n
返回添加
plus_3=make_adder(3)
plus_5=make_adder(5)
加号_3(4)
七
加号_5(4)
九
在这个例子中,make_adder被用作创建和配置“adder”函数的工厂。注意“adder”函数仍然可以访问make_adder函数的n参数(封闭范围)。
对象也可以像函数一样被调用。
在Python中,对象不是函数,但是它们可以被调用,这使得在许多情况下可以像函数一样对待它们。
如果一个对象是可调用的,这意味着你可以在它上面使用括号()并将函数调用参数传递给这个对象。这是一个可调用对象的示例:
类加法器:def init(self,n):
self.n=n
定义调用(自身,x):
回归自我. n x
plus_3=加法器(3)
加号_3(4)
七
在后台,作为函数“调用”对象实例试图执行对象的__call__方法。
当然,并不是所有的对象都是可调用的。这就是为什么有一个内置的可调用函数来检查一个对象是否可调用:
可调用(正3)真
可调用(大喊)
真实的
可调用(假)
错误的
摘要
Python中的一切都是对象,包括函数。您可以将它们赋给变量,存储在数据结构中,并在其他函数之间传递或返回它们(一级函数)。
“第一类公民”函数使你能够抽象和转移程序中的行为。
函数可以嵌套,一些父函数的状态可以被捕获和携带。执行这个操作的函数叫做闭包。
您可以使对象可调用,这使您能够在许多情况下像对待函数一样对待它们。
参考:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。