函数简介

定义:

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。自己创建函数,这被叫做用户自定义函数。

定义一个函数
我们可以定义一个由自己想要功能的函数,以下是简单的规则:
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')


七、参数顺序:形参:位置形参,默认参数,*args,命名关键字参数,**kwargs

名称空间与作用域

通俗的来说,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)

函数作为对象可以赋值给一个变量、可以作为元素添加到容器对象中、可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的。



你可能感兴趣的:(python基础)