定义:
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。自己创建函数,这被叫做用户自定义函数。
定义一个函数
我们可以定义一个由自己想要功能的函数,以下是简单的规则:
1.函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
2.任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
3.函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
4.函数内容以冒号起始,并且缩进。
5.return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于 返回 None。
def function():
'''注释'''
代码段
return 值
调用:
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。
function()
function(function)
参数:
一、形参与实参
def function(variable1,variable2): #variable--形参
代码段
function(data1,data2) #data--实参
二、 位置参数:按照从左到右的顺序依次定义的参数
按位置定义的形参,必须被传值,多一个不行,少一个也不行
按位置定义的实参,与形参一一对应
三、 关键字参数:实参在定义时,按照key=value形式定义
关键字参数可以不用像位置实参一样与形参一一对应,指名道姓地传值
注意的问题一:位置实参必须在关键字实参的前面
注意的问题二:实参的形式既可以用位置实参又可以是关键字实参,但是
一个形参不能重复传值
def function(variable1,variable2):
代码段
function(data1,varable2=data2)
四、 默认参数:在定义函数阶段,就已经为形参赋值,定义阶段有值,调用阶段可以
不用传值
默认参数需要注意的问题一:必须放在位置形参后面
默认参数需要注意的问题二:默认参数通常要定义成不可变类型
默认参数需要注意的问题三:默认参数只在定义阶段被赋值一次
def function(variable1,variable2=data):
代码段
function(data1)
def func(x,y,*args): #x=1,y=2,args=(3,4,5,6)
print(x,y)
print(args)
func(1,2,3,4,5,6)
def func(x,y,*args): #args=(3,4,5,6)
print(x,y)
print(args)
func(1,2,*(3,4,5,6)) #foo(1,2,3,4,5,6)
def func(x,y,z):
print(x,y,z)
func(1,*(2,3)) #func(1,2,3)
func(*(2,3)) #func(2,3)
def func(x,y=2,z=1):
print(x,y,z)
func(*('a','b','c')) #func('a','b','c')
def func(x,y,**kwargs): #x=1,y=2,kwargs={'a':1,'b':3,'z':3}
print(x,y)
print(kwargs)
func(1,y=2,z=3,a=1,b=3)
def func(x,y,**kwargs): #x=1,y=2,**kwargs=**{'a':1,'b':3,'z':3}
print(x,y)
print(kwargs)
func(1,y=2,**{'a':1,'b':3,'z':3}) #func(1,y=2,z=3,b=3,a=1)
def register(name,age,*,group,**kwargs):
print(name)
print(age)
print(kwargs)
register('egon',18)
register('egon1',18,hobby='paly1',group='group1')
名称空间与作用域
通俗的来说,Python中所谓的命名空间可以理解为一个容器。在这个容器中可以装许多标识符。不同容器中的同名的标识符是不会相互冲突的。理解python的命名空间需要掌握三条规则:
第一,赋值(包括显式赋值和隐式赋值)产生标识符,赋值的地点决定标识符所处的命名空间。
第二,函数定义(包括def和lambda)产生新的命名空间。
第三,python搜索一个标识符的顺序是"LEGB"。
简而言之,LEGB 代表名字查找顺序: locals -> enclosing function -> globals -> __builtins__
locals 是函数内的名字空间,包括局部变量和形参
enclosing 外部嵌套函数的名字空间(闭包中常见)
globals 全局变量,函数定义所在模块的名字空间
builtins 内置模块的名字空间
所以,在 Python 中检索一个变量的时候,优先回到 locals 里面来检索,检索不到的情况下会检索 enclosing ,enclosing 没有则到 globals 全局变量里面检索,最后是到 builtins 里面来检索。
当然,因为 builtins 的特殊性,我们可以直接在 builtins 里面添加变量,这样就可以在任意模块中访问变量,不过这种方法太过于变态,不推荐这么做。
locals,globals
函数的形参跟内部变量都存储在 locals 中。
===============================================================
函数是第一类对象(First-Class Object)
函数作为对象可以赋值给一个变量、可以作为元素添加到容器对象中、可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的。