Python为什么要有函数有效驾龄这个概念念

Python 为什么要使用函数嵌套函数
· 333 天前 · 2515 次点击
看一些代码会写成函数中嵌套函数,例如:
def func():
def new_func():
a = new_func()
这种写法和 lambda 和单独创建一个 function 有什么区别或优势吗?
20 回复 &| &直到
14:16:47 +08:00
& &333 天前
& &333 天前
对啊,要写闭包的时候很好用的
& &333 天前
查看一下柯里化的定义,这样写返回的新函数能够保持当时的状态,而且能够达到惰性求值的效果(用到这个函数的时候再处理传入的参数)
& &333 天前
例如装饰器传参,就是多层嵌套的函数,
& &333 天前
因为 lambda 的限制
& &333 天前
你的例子确实 lambda 也可以做到。但是下面的呢?
def func(x):
def new_func(y):
return x+y
return new_func
&&& a = func(10)
&&& a(3)
13
&&& a(5)
15
& &333 天前 via Android
也许是为了方便吧。脚本嘛
& &333 天前
额,其实我也不是很了解这两种用法的差异的,不过一不小心就写了出来 @
In [1]: def func(x):
return lambda y:y+x
In [2]: a = func(10)
In [3]: a(3)
Out[3]: 13
In [4]: a(5)
Out[4]: 15
& &333 天前
@ 你的例子不合适啊。
&&& a = lambda x: lambda y: x + y
&&& b = a(10)
&&& b(3)
13
&&& b(5)
15
& &333 天前
因为 lambda 是匿名的,我想区别应该是名字是否有意义,比如递归吧。
&&& def func(x, sum):
...
if(x==0):
...
return sum
...
return func(x-1, sum + x)
...
&&& func(10, 0)
55
lambda 大概写不出上面这个递归?
& &333 天前 via Android
能省几个参数,函数的作用域小了
& &333 天前 via Android
一般是返回一个函数指针时用。一般外部固定了函数指针的参数,但是自己又需要传递给函数指针一些数据,这样嵌套函数可以使得内部函数可以访问外部函数的变量。关键字:闭包,需求的例子:装饰器。
不用 lambda 的原因是 lambda 限制太大,不方便。
& &333 天前
这就是 meta 编程啊
& &332 天前
lambda 你能多写几行么
& &332 天前 via Android
Python 里 lambda 只能写一行啊
& &332 天前
需要做到这个的话直接用指针不行吗?
& &332 天前
@ 无法实现,像下面的装饰器例子:
&显示 Gist 代码&
需要将 @(123) 的 123 传递给 fffff 函数,但是 fffff 函数是会被当作 hello3 参数给用户调用的,用户不会帮你把 123 传递进去,只能通过闭包的方式传递进去 123 .
& &332 天前
lambda 写复杂的函数很麻烦啊
& &332 天前
这是一种嵌套函数的写法,有时候它和 lambda 没什么区别,但有些情况下它会实现一个闭包,所以我姑且认为楼主是想知道闭包的特性.
那么这里首先强烈建议楼主了解一下 namespace 与变量作用域的相关知识.
如果只要了解闭包的概念,请参考这篇文章.
如果想知道闭包的实现原理.那么你必须得明白函数调用过程.因为闭包本身就是调用一个函数反回另一个函数.
这里推荐 UCSB 的教程,提供了一个交互式的函数调用演示程序.共6个课程,每个课程都很短,但看完这些你大概能对函数调用帧栈有初步了解.
到现在你已经可以开始探究 python 在函数调用中如何精妙地完成参数传递.
如果能坚持到这里,那么你已经停不下来了...函数调用过程中所有涉及到的源码作者都给出了分析,看完之后应该什么都明白了
以下链接可以看看,也许能帮助你理解源码.
& &327 天前
一种劣习,让函数变成有状态的,或者叫不完全依赖于字面输入,还依赖一个隐藏输入的东西
& · & 1080 人在线 & 最高记录 3541 & · &
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.0 · 27ms · UTC 00:33 · PVG 08:33 · LAX 16:33 · JFK 19:33? Do have faith in what you're doing.python函数(2):函数进阶,专业承接网页前端工作室,专业承接网页切图排版|html页面制作|jpg或psd转html,网页外包接活
时间: 来源:
python函数(2):函数进阶
点击次数:5944
其它web前端开发资讯
web前端行业资讯Web new NewsListSL4A_ApiReferenceexamples(2)日我们保证We guarantee> psd效果文件手工切图,保证图片效果最好体积最小利于传输> 100%手写的HTML(DIV+CSS)编码,绝对符合W3C标准> 代码精简、css沉余量小、搜索引擎扫描迅速,网页打开快捷> 应用Css Sprite能够减少HTTP请求数,提高网页性能> 跨浏览器兼容(IE6、7、8、9,Firefox火狐,Chrome谷歌)一些合作过的客户友情链接: |他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)总结Python编程中函数的使用要点
转载 & & 作者:Flyaway
这篇文章主要介绍了Python编程中函数的使用要点总结,文中也讲到了人民群众喜闻乐见的lambda表达式的用法,需要的朋友可以参考下
为何使用函数
最大化代码的重用和最小化代码冗余
流程的分解
在Python中创建一个函数是通过def关键字进行的,def语句将创建一个函数对象并将其赋值给一个变量名。def语句一般的格式如下所示:
def &name&(arg1,arg2,... argN):
&statements&
通常情况下,函数体中会有一个return语句,可以出现在函数体的任何位置,它表示函数调用的结束,并将结果返回至函数调用处。但是return语句是可选的,并不是必须的。从技术角度上说,一个没有返回值的函数自动返回了none对象,但是这个值可以被忽略掉。
&&def语句是实时执行的
Python的def语句实际上是一个可执行的语句:当它运行的时候,它创建一个新的函数对象并将其赋值给一个变量名。(请记住,Python中所有的语句都是实时运行的,没有对像独立编译时间这样的流程)因为它是一个语句,它可以出现在任一语句可以出现的地方——甚至是嵌套在其他语句中。
def func():
def func():
它在运行时简单地给一个变量名进行赋值。与C语言这样的编译语言不同,Python函数在程序运行之前并不需要全部定义,更确切地说,def在运行时才评估,而在def之中的代码在函数调用时才会评估。
就像Python中其他语句一样,函数仅仅是对象,在程序执行时它清除地记录在了内存之中。实际上,除了调用之外,函数允许任意的属性附加到记录信息以供随后使用:
othername=func #Assign function object
othername() #Call func again
func() #call object
func.attr=value #attach attribute
一个例子:定义和调用
def times(x,y):
return x*y
times(2,4) #return 8
times(3.12,4) #return 12.56
times('Ni',4) #return 'NiNiNi'
上面代码中对函数的三次调用都能正确运行,因为”*“对数字和序列都有效,在Python我们从未对变量、参数或者返回值有过类似的声明,我们可以把times用作数字的乘法或是序列的重复。
换句话说,函数times的作用决定于传递给它的参数,这是Python的核心概念之一。
需要强调的是,如果我们传入了一个不支持函数操作的参数,Python会自动检测出不匹配,并抛出一个异常,这样就能减少我们编写不必要的类型检测代码。
&&局部变量
所有在函数内部定义的变量默认都是局部变量,所有的局部变量都会在函数调用时出现,并在函数退出时消失。
函数设计概念
耦合性:对于输入使用参数并且输出使用return语句。
耦合性:只有在真正必要的情况下使用全局变量。
耦合性:不要改变可变类型的参数,除非调用者希望这样做。
聚合性:每一个函数都应该有一个单一的、统一的目标。
大小:每一个函数应该相对较小。
耦合:避免直接改变在另一个模块文件中的变量。
函数对象:属性和注解
&&间接函数调用
由于Python函数是对象,我们可以编写通用的处理他们的程序。函数对象可以赋值给其他的名字、传递给其他函数、嵌入到数据结构、从一个函数返回给另一个函数等等,就好像它们是简单的数字或字符串。
把函数赋值给其他变量:
def echo(message):
print(message)
x('Indirect call!')
#Prints:Indirect call!
传递给其他函数:
def indirect(func,arg):
indirect(echo,'Argument call')
#Prints:Argument call
把函数对象填入到数据结构中:
schedule=[(echo,'Spam!'),(echo,'Ham!')]
for (func,arg) in schedule:
从上述的代码中可以看到,Python是非常灵活的!
&&函数内省
由于函数是对象,我们可以用用常规的对象工具来处理函数。
func.__name__
内省工具允许我们探索实现细节,例如函数已经附加了代码对象,代码对象提供了函数的本地变量和参数等方面的细节:
dir(func.__code__)
func.__code__.co_varnames
func.__code__.co_argument
工具编写者可以利用这些信息来管理函数。
&&函数属性
函数对象不仅局限于上一小节中列出的系统定义的属性,我们也可以向函数附加任意的用户定义的属性:
func.count=0
func.count+=1
func.handles='Button-Press'
这样的属性可以用来直接把状态信息附加到函数对象,而不必使用全局、非本地和类等其他技术。和非本地不同,这样的属性信息可以在函数自身的任何地方访问。这种变量的名称对于一个函数来说是本地的,但是,其值在函数退出后仍然保留。属性与对象相关而不是与作用域相关,但直接效果是类似的。
&&Python3.0中的函数注解
在Python3.0也可以给函数对象附加注解信息——与函数的参数相关的任意的用户定义的数据。Python为声明注解提供了特殊的语法,但是,它自身不做任何事情;注解完全是可选的,并且,出现的时候只是直接附加到函数对象的__annotations__属性以供其他用户使用。
从语法上讲,函数注解编写在def头部行,对于参数,它们出现在紧随参数名之后的冒号之后;对于返回值,它们编写于紧跟在参数列表之后的一个-&之后。
def func(a:'spam',b:(1,10),c:float) -& int:
return a+b+c
注解和没注解过的函数在功能和使用上完全一样,只不过,注解过的函数,Python会将它们的注解的数据收集到字典中并将它们附加到函数对象自身。参数名变成键,如果编写了返回值注解的话,它存储在键return下,而注解的值则是赋给了注解表达式的结果:
func.__annotations__
#Prints:{'a':'spam','c':&class 'float'&,'b':(1,10),'return':&class 'int'&}
如果编写了注解的话,仍然可以对参数使用默认值,例如:a:'spam'=4 意味着参数a的默认值是4,并且用字符串'spam'注解它。
在函数头部的各部分之间使用空格是可选的。
注解只在def语句中有效。
匿名函数:lambda
除了def语句之外,Python还提供了一种生成函数对象的表达式形式。由于它与LISP语言中的一个工具很相似,所以称为lambda。就像def一样,这个表达式创建了一个之后能够调用的函数,但是它返回了一个函数而不是将这个函数赋值给一个变量名。这也就是lambda有时叫做匿名函数的原因。实际上,它们常常以一个行内函数定义的形式使用,或者用作推迟执行一些代码。
&&lambda表达式
lambda的一般形式是关键字lambda,之后是一个或多个参数,紧跟的是一个冒号,之后是一个表达式:
lambda argument1,argument2,...argumentN:expression using arguments
由lambda表达式所返回的函数对象与由def创建并赋值后的函数对象工作起来是完全一样的,但是lambda有一些不同之处让其在扮演特定的角色时很有用。
lambda是一个表达式,而不是一个语句。
lambda的主体是一个单个的表达式,而不是一个代码块。
一下两段代码生成了同样功能的函数:
def func(x,y,z):return x+y+z
func(2,3,4)
f = lambda x,y,z : x + y + z
默认参数也能在lambda中使用
x=(lambda a="fee",b="fie",c="foe": a+b+c)
#Prints:'weefiefoe'
在lambda主体中的代码像在def内的代码一样都遵循相同的作用域查找法则。
&&为什么要使用lambda
通常来说,lambda起到了一种函数速写的作用,允许在使用的代码内嵌入一个函数的定义。它们总是可选的,因为总是能够用def来代替。
lambda通常用来编写跳转表:
L=[lambda x: x ** 2,
lambda x: x ** 3,
lambda x: x ** 4]
for f in L:
print(f(2))
#Prints:4,8,16
print(L[0](3))
实际上,我们可以用Python中的字典或者其他数据结构来构建更多种类的行为表:
{'already':(lambda: 2+2),
'got':(lambda: 2*4),
'one':(lambda: 2 ** 6)}[key]()
这样编写代码可以使字典成为更加通用的多路分支工具。
最后需要注意的是,lambda也是可以嵌套的
((lambda x:(lambda y: x+y))(99))(4)
#Prints:103
在序列中映射函数:map
map函数会对一个序列对象中的每个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表。
counters=[1,2,3,4]
def inc(x):return x+10
list(map(inc,counters))
#[11,12,13,14]
由于map期待传入一个函数,它恰好是lambda最常出现的地方之一。
list(map((lambda x: x+10),counters)) #[11,12,13,14]
函数式编程工具:filter和reduce
在Python内置函数中,map函数是用来进行函数式编程的这类工具中最简单的内置函数代表。所谓的函数式编程就是对序列应用一些函数的工具。例如过滤出一些元素(filter),以及对每对元素都应用函数并运行到最后的结果(reduce)。
list(filter((lambda x: x&0),range(-5,5)))
#[1,2,3,4]
序列中的元素若其返回值是真的话,将会被加入到结果列表中。
reduce接受一个迭代器来处理,但是,它自身不是一个迭代器,它返回一个单个的结果。
from functools import reduce
#Import in 3.0,not in 2.6
reduce((lambda x,y: x+y),[1,2,3,4]) #Return:10
reduce((lambda x,y: x*y),[1,2,3,4]) #Return:24
上面两个reduce调用,计算了一个列表中所有元素的累加和与累积乘积。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具python的函数基本概念 - 简书
python的函数基本概念
首先,复习几个函数的基本概念:参数组你可以将所有参数放到一个元组或者一个字典中,不必显式地放倒一个函数调用中func(*tuple_group_nonkw_args,**dict_group_kw_args)l举个例子,
from operator import add, sub
from random import randint, choice
ops={'+':add, '-':sub}
op=choice('+-')
nums=[3,1]
ops[op](*nums)
注意此处nums前面的星号是一定不能少的函数属性句点属性标识保证了不同函数的名称空间时互不干涉的foo.x+bar.x(此处的两个x表示对应部不同的内存地址,不同的数字)内嵌函数在函数体内创建另外一个函数对象函数与方法装饰器修饰仅当声明一个函数或者方法,才会应用的额外调用
@decorator(dec_opt_args)
def(func2Bdecorated)(fund_opt_args):
带参数的装饰器装饰器输入参数,返回一个函数对象,该函数对像的参数正是被装饰的函数装饰器的本质是函数引入日志增加计时逻辑来检测性能给函数加上事物的能力传递函数Python和C的最大不同:没有指针的概念
函数本身是可以被引用的:bar=foo
函数本身是可以被调用的:def bar(argfunc):argfunc()
Property 简单来说,就是使得类中的属性既保有直接访问的灵活性,又能够进行合理的检查,保持程序的健壮。相关资料可以参考下面的连接,这里不多说了
一只呆狗子想要学划水
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
1.1==,is的使用 ·is是比较两个引用是否指向了同一个对象(引用比较)。 ·==是比较两个对象是否相等。 1.2深拷贝、浅拷贝 1.2.1浅拷贝 浅拷贝是对于一个对象的顶层拷贝 拷贝了引用,并没有拷贝内容 1.2.2深拷贝 深拷贝是对于一个对象所有层次的拷贝(递归) ...
摘要:本系列主要对tf的一些常用概念与方法进行描述。本文主要针对tensorflow的模型训练Training与测试Testing等相关函数进行讲解。为‘Tensorflow一些常用基本概念与函数’系列之四。 1、序言 本文所讲的内容主要为以下列表中相关函数。函数train...
1.元类 1.1.1类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这一点仍然成立: &&&classObjectCreator(object): …pass … &&&my_object = ObjectCreator() &&...
每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了。于是...
#行走的力量悦果多寻食记# 日19:0
今天偷了懒,凌晨4点多入睡,醒来的时候已经上午10点多了。地瓜合伙人王哥来酒店接我,直接去了我们今天在采的地瓜地。这块地瓜是王哥的亲戚的,一家人仅仅玫瑰红春薯地瓜就种了53亩地。
每一次下地直接和种...
1 周末闲来无事,约闺蜜欢聚畅聊,吃什么自然是重点。 欢聚畅聊从见面前讨论吃什么开始。定地点、上网搜打分、看评价。 闺蜜最终发来三家店供我选择,都甚得我心(好闺蜜间就是默契,喜欢的口味都一致)。其中一家据说上过某档知名美食节目,点单率最高的是一道宫保鸡丁烤鱼。 毫不犹豫,就...
许久没有勇气照镜子了 可无意从手机屏幕的影像看到深深的抬头纹 我的精神,我的理想,我的不服老的壮志 第一时间崩溃了,灰飞烟灭于残酷现实 岁月的年轮,碾压了飞扬的青春之梦 好心态,至关重要,真的 一直以十八的心理年龄挑战生理极限 回首昨天,无怨无悔无憾无敌 人生在世,自信人生...
例句: I was really embarrassed--the teacher asked me a question and I didn' I was daydreaming and my head was in the clouds...
我不知道这部电影好在哪,但是我大概知道这部电影为什么会好评如潮! 因为任何时候赞扬一部政治正确并且略有逼格的电影都不会错。 政治正确,如同网络上呼吁收回钓鱼岛或者是为灾区点赞一样,是不会遭到反驳的一件事,正如这部电影表达的爱情观以及奋斗观一样,是不允许质疑的格调。 更何况这...}

我要回帖

更多关于 中华这个概念 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信