为何使用函数

最大化代码的重用和最小化代码冗余

流程的分解

编写函数

>>def语句

在Python中创建一个函数是通过def关键字进行的,def语句将创建一个函数对象并将其赋值给一个变量名。def语句一般的格式如下所示:

def (arg1,arg2,... argN):

通常情况下,函数体中会有一个return语句,可以出现在函数体的任何位置,它表示函数调用的结束,并将结果返回至函数调用处。但是return语句是可选的,并不是必须的。从技术角度上说,一个没有返回值的函数自动返回了none对象,但是这个值可以被忽略掉。

>>def语句是实时执行的

Python的def语句实际上是一个可执行的语句:当它运行的时候,它创建一个新的函数对象并将其赋值给一个变量名。(请记住,Python中所有的语句都是实时运行的,没有对像独立编译时间这样的流程)因为它是一个语句,它可以出现在任一语句可以出现的地方――甚至是嵌套在其他语句中。

if test:

def func():

...

else:

def func():

...

...

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 = echo

x('Indirect call!') #Prints:Indirect call!

传递给其他函数:

def indirect(func,arg):

func(arg)

indirect(echo,'Argument call') #Prints:Argument call

把函数对象填入到数据结构中:

schedule=[(echo,'Spam!'),(echo,'Ham!')]

for (func,arg) in schedule:

func(arg)

从上述的代码中可以看到,Python是非常灵活的!

>>函数内省

由于函数是对象,我们可以用用常规的对象工具来处理函数。

func.__name__

dir(func)

内省工具允许我们探索实现细节,例如函数已经附加了代码对象,代码对象提供了函数的本地变量和参数等方面的细节:

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':,'b':(1,10),'return':}

注意点

如果编写了注解的话,仍然可以对参数使用默认值,例如: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) #Return 9

f = lambda x,y,z : x + y + z

f(2,3,4) #Return 9

默认参数也能在lambda中使用

x=(lambda a="fee",b="fie",c="foe": a+b+c)

x("wee") #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)) #Prints:9

实际上,我们可以用Python中的字典或者其他数据结构来构建更多种类的行为表:

key='got'

{'already':(lambda: 2+2),

'got':(lambda: 2*4),

'one':(lambda: 2 ** 6)}[key]() #Prints:8

这样编写代码可以使字典成为更加通用的多路分支工具。

最后需要注意的是,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调用,计算了一个列表中所有元素的累加和与累积乘积。

编程软件python中的if用法-总结Python编程中函数的使用要点相关推荐

  1. AR单片机编程软件的菜单栏功能及用法

    <转载>IAR单片机编程软件的菜单栏功能及用法全面介绍 原网站 原网站 原网站 网站内介绍如下内容 选取部分 Ⅴ.View视图菜单 这个菜单的意思就是打开或关闭视图窗口,比如我们的工作空间 ...

  2. python中的super用法详解_Python中super函数用法实例分析

    本文实例讲述了python中super函数用法.分享给大家供大家参考,具体如下: 这是个高大上的函数,在python装13手册里面介绍过多使用可显得自己是高手 23333. 但其实他还是很重要的. 简 ...

  3. python中tile的用法_Python:numpy中的tile函数

    在学习机器学习实教程时,实现KNN算法的代码中用到了numpy的tile函数,因此对该函数进行了一番学习: tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复 ...

  4. python手机编程软件-盘点几个在手机上可以用来学习编程的软件

    前天在悟空问答的时候,很荣幸被邀请参加回答"在手机上可以用来学习编程的软件有哪些?"这个问题,当时在回答的首页看到一个头条大微(小小猿爱嘻嘻)的回答,觉得十分受用,在此将其整理好, ...

  5. python中print的用法_Python2与Python3中print用法总结

    Python2中的print用法 在Python2 中 print 是一种输出语句 strHello = 'Hello Python' print strHello # Hello Python 1. ...

  6. 安卓手机可以用python编程软件-有哪些可以在手机上敲Python代码的App

    相信多数安卓用户都使用过Qpython这款移动端的Python编辑器吧?之前我也研究过一阵子这个工具,但因为一次简单的爬虫让我对它失望之极.Qpython不支持lxml这个模块,然而python中lx ...

  7. python中if else用法详解_Python 中的 else详解

    我们都知道 Python 中else的基本用法是在条件控制语句中的 if...elif...else...,但是 else 还有两个其它的用途,一是用于循环的结尾,另一个是用在错误处理的 try 中. ...

  8. 怎样下载安装python编程软件视频_程序员如何利用Python下载视频?几串代码轻松搞定...

    很多学生或者工作人员想要下载网络上的一些视频,但是苦于找不到合适的下载方法.无从下手. 首先,我这里用到的是Python代码.没想到又是Python吧.这次很简单,不需要复制和写代码. 首先,你先下载 ...

  9. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

最新文章

  1. 寒假——练车、脑力风暴和辅导初中生
  2. HYSBZ-1951 古代猪文 【好题】
  3. 【深度学习】Tensorflow2.x入门(一)建立模型的三种模式
  4. Qt Creator图片
  5. 根据用户查进程_【磨叽教程】Android进阶教程之在Android系统下各进程之间的优先级关系...
  6. python数据结构-栈和队列的实现
  7. Java笔记-spring boot支持jsp文件做前端页面
  8. 浙江linux学习,浙江大学现代教务管理系统
  9. java 获取mysql路径_如何使用JPQL收集MySQL基本路径?
  10. jenkins 读取json文件_使用插件轻松获取jenkins构建数据
  11. 计算机辅助翻译术语PPT,计算机辅助翻译
  12. 用msicuu2.exe卸载office可能遇到的问题及解决办法
  13. 【土壤分类】基于支持向量机实现土壤分类附matlab代码
  14. 夜曲歌词 拼音_夜曲歌词完整版 lrc 周杰伦 - Yo歌词网
  15. 僵尸网络是什么;僵尸网络有什么特点
  16. 树状数组(Binary Indexed Tree),看这一篇就够了
  17. 闲话四巨头:腾讯,阿里,百度,华为
  18. 为什么现在更多需要用的是 GPU 而不是 CPU,比如挖矿甚至破解密码?
  19. 解决linux vi/vim或命令行出现方向键、删除出现乱码
  20. 等保测评师-等保测评工程师-发展路线(不喜勿喷)

热门文章

  1. EasyDarwin开源社区 短视频拍摄项目Github地址
  2. 设计模式---(创建型)单例模式
  3. Spring事务支持:利用继承简化配置
  4. JSEnhancements.vsix
  5. C#操作Access数据库中遇到的问题(待续)
  6. 快速组建的开发团队要怎么活下来?
  7. PHP MVC框架核心类
  8. Runtime实战之定制TabBarItem大小
  9. vc 取windows系统信息 版本 cpu信息 内存信息 ie版本信息 office版本
  10. Code:blocks 调试经历,调试成功这其一