python-自定义函数
函数定义:
def func_name (parameter,...):
# 处理逻辑
return(或者yield,也或者没有) some_value
def :关键字,是个可执行语句,在被调用之前,函数其实是不存在的
func_name : 函数名字
parameter: 函数参数,可以给定默认值(def func(parameter = 0): 这里就为parameter定义了默认值0)
return (yield): 函数返回值 ,也可以没有返回值,需要根据需要而定
函数调用:
主程序调用函数时,必须保证这个函数此前已经定义过,不然就会报错。
python寻找变量的时候,会按照本地作用域、闭包、全局、内置这种顺序去查找
变量的作用域:
全局变量:定义在整个文件层次上 ,可以在文件内部任何地方被访问,包括函数内部,但是不能被修改(修改的话,需要在函数内部做特殊处理)
局部变量:定义在 函数内 ,如果不加特殊处理,python的解释器默认在函数内定义或者进行一些修改操作的都是局部变量
要在函数内部修改全局变量怎么办?
答:在函数内,用global关键字修饰全局变量,这里并不是重新声明,而是告诉解释器,函数内的这个变量和全局定义的是同一个,global起到的是标识的作用
函数内部定义的变量,和全局变量重名怎么办?
答:全局变量会被局部变量覆盖。
嵌套函数可以访问外部函数的变量,但是要修改,需要什么处理办法?
答: 在内部函数 该变量前 加 nonlocal关键字, 标识该变量 为 外部函数的变量
函数的嵌套函数内的变量, 跟外部函数的变量重名怎么办?
答: 内部函数的变量 会 覆盖 外部函数的变量
def本身就是一个声明,如果不执行,就不涉及对对象的引用,也就不会报错,即使这时在函数内部引用了一个不存在的变量。关键在于执行的时候,被引用的变量或者函数是否被加载。
python语言的特点之一: dynamically typed ,也就是 ”多态”
可以接受任何数据类型(整型,浮点,字符串等等),Python 不用考虑输入的数据类型,而是将其交给具体的代码去判断执行
这个特点,也会带来一些问题,必要时,需要在函数的开头加上类型检查的相关处理
python语言的特点之一:函数内可以嵌套函数 , 内部函数的作用域仅限于外层嵌套函数内部,无法在外层函数以外 被访问
第一:提供了很好的封装(保护敏感数据不会在外层函数之外被访问到)
第二:提高效率,比如在递归函数中,参数类型检查 等操作,在外部函数完成, 实际的递归逻辑在内部函数中完成,这样就避免了每次递归都进行参数检查
python语言特点之一:闭包(closure)
类似于函数的嵌套,只是 外部函数返回的是一个函数 , 返回的函数还可以再接收相应参数
闭包优点: 让程序变得更加的 简洁易读
提高效率 : 有些程序需要返回执行一部分核心代码,而之前还需要额外的一些处理。就可以将额外处理的代码(比如,参数检查)放在外部函数内,需要反复执行的核心代码放在内部函数里。