Python——函数基础

函数基础

  • 函数就是将一些语句集合在一起的部件,不止一次地在程序中运行。还能计算出一个返回值,并能够改变作为函数输入的参数。

编写函数

函数基础

  • def是可执行的代码,Python函数时由def编写的,def是一个可执行的语句,函数并不存在。直到Python运行了def后才存在。
  • def创建了一个对象并将其赋值给某一变量名。当Python运行到def语句时,将会生成一个新的函数对象并将其赋值给这个函数名。就像所有的赋值一样,函数名变成了某一个函数的引用。
  • return将一个结果对象发送给调用者,当函数被调用时,其调用者停止运行直到这个函数完成了工作,之后函数将控制权返回调用者,return返回值就是函数调用的结果
  • yield向调用者返回一个结果对象
    global声明了一个模块级的变量并被赋值,在默认情况下,所有在一个函数中被赋值的对象,是这个函数的本地变量,并且仅在这个函数运行的过程中存在。为了分配一个可以在整个模块中都可以使用的变量名,函数需要在global语句中将它列举出来。变量名需要关注它的作用域,并且是通过赋值语句将变量名绑定至作用域的
  • nonlocal声明了将要赋值的一个封闭的函数变量。在Python3中添加的nonlocal语句允许一个函数来赋值一条语法封闭的def语句的作用域中已有的名称。允许封闭的函数作为保留状态的地方
  • 函数时通过对象引用传递的,在Python中,参数通过赋值传递给函数。
  • 参数、返回值以及变量并不是声明,在函数中并没有类型约束。可以传递任意类型的参数给函数。函数也可以返回任意类型的对象

def语句

格式

def将创建一个函数对象并将其赋值给一个变量名

def <name>(arg1,arg2,....argn):
      <statements>
  • def包含了首行并有一个代码块跟随在后边,这个代码块通常会缩进。这个代码块就是Python函数的执行语句
  • def的首行定义了函数名,赋值给了函数对象,并在括号中包含了0个或多个参数。在函数调用的时候,在首行的参数名称赋值给了括号中传递来的对象
  • 带返回值的格式
def <name>(arg1,arg2,....argN):
  statement
return <value>
  • return语句可以在函数主体中任何地方出现,表示函数调用的结束。并将结果返回至调用处。
  • 定义的函数中,如果没有return,会默认return null
  • 如果在函数中return多个对象,Python会将多个对象封装为一个元组返回,其实返回的还是一个对象

def是实时执行的

  • Python的def语句实际上是一个可执行的语句:当运行时,创建一个新的函数对象并将其赋值给一个变量名,Python中的所有语句都是实时运行的,没有独立编译这样的流程。所以def语句可以出现在任一地方。还可以嵌套在其他的语句中
if test:
  def func():
      statement
else:
  def func()
      statment
statement
func()
  • def在运行时简单地给一个变量名进行赋值,Python函数在程序运行之前并不需要全部定义。
  • 函数的函数名并不重要,可以将函数赋值给一个不同的变量名,并通过新的变量名进行调用。
  • 函数允许任意的属性附加到记录信息供随后使用
def func():....
func()
func.attr = value
示例
# 返回两个数的计算结果
>>> def times(x,y):
...     return x*y
... 
>>> time = time(2,3)
>>> time = times(2,3)
>>> time
6
  • 函数中的参数完全取决于参数的对象类型

用户定义的函数属性

用户定义的函数具有以下属性

  • f.doc 文档字符串
  • f.name 函数名称
  • f.dict 包含函数属性的字典
  • f.code 字节编译的代码
  • f.defaults 包含默认参数的元组
  • f.globals 定义全局命名空间的字典
  • f.closure 包含与嵌套作用域相关数据的元组

Python中的多态

同样的函数,在不同的实例下执行的结果取决于不同的实例。这种依赖行为称为多态。

  • 作为函数,可以自动的适用于所有类别的对象类型。只要对象支持所预期的接口,函数就能处理
  • Python中代码不应该关心特定的数据类型。
# 寻找序列的交集
>>> def intersect(seq1,seq2):
...     res=[]
...     for x in seq1:
...             if x in seq2:
...                     res.append(x)
...     return res
... 
>>> x = [1,2,3,4,5]
>>> y = ['a',1,2,'b','c',4]
>>> resout = intersect(x,y)
>>> resout
[1, 2, 4]
  • 如果我们传入了不支持这些接口的对象,Python将会自动检测出不匹配,并抛出一个异常
本地变量

在上述的代码中res是本地变量,这个变量只是在def内的函数中是可见的,并且仅在函数运行时是存在。所有的在函数内部进行赋值的变量名都默认为本地变量。

  • 参数也是通过赋值被传入的,所以seq1和seq2是本地变量
  • for循环将元素赋值给了变量X,所以变量X是本地变量
  • 所有的本地变量都会在函数调用时出现,并在函数退出时消失。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容