python之函数

转自:https://www.cnblogs.com/Eva-J/articles/7156261.html

1、函数的定义:

1 def main():
2     #代码

2、函数可以返回一个值,也可以返回多个值。

     返回多个值时:如果用一个变量去接收,返回的是元祖。用多个变量接收,变量的个数要和返回值的个数相同

3、函数参数:定义顺序为:位置参数>可变参数>默认参数>关键字参数

例如:

def func(a,b,*args,c=1,d=2,**kwargs):
    print(a)
    print(b)
    print(args)
    print(c)
    print(d)
    print(kwargs)
func(1,2,'c','d',c=2,k=6,f=9,d=7)

显示结果

1
2
('c', 'd')
2
7
{'k': 6, 'f': 9}

  PIS:默认参数如果定义为可变参数,默认参数只要不重新赋值( list = [] 也算重新赋值),list指向的地址永远不变!

def extendList(val, list=[]):
    list.append(val)
    return list
list1 = extendList(100)
print(list1)
list2 = extendList(40, list=[])
print(list2)
list3 = extendList(200)
print(list3)
list4 = extendList(50, list=[])
print(list4)

显示结果:

[100]
[40]
[100, 200]
[50]

4、命名空间:

有三种空间:内置命名空间,全局命名空间,局部命名空间

 加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载)

调用顺序:局部命名空间->全局命名空间->内置命名空间(不可逆)

x = 1
def f(y):
global x
print(x) print(y) f(3)

显示如下:

1

3

5、作用域

全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效

局部作用域:局部名称空间,只能在局部范围生效

globals和locals方法:可以在函数内声明,某个变量为全局变量

a = 10
def func():
    global a
    a = 20

print(a)
func()
print(a)

显示:10 20   如果没有global a  显示 10 10 具体看:https://www.cnblogs.com/zzq888/articles/10302702.html

6、函数的嵌套调用

def max2(x,y):
    m  = x if x>y else y
    return m

def max4(a,b,c,d):
    res1 = max2(a,b)
    print(res1)
    res2 = max2(res1,c)
    print(res2)
    res3 = max2(res2,d)
    print(res3)
    
max4(1,2,3,4)

7、函数的嵌套定义

def f1():
    print("in f1")
    def f2():
        print("in f2")

    f2()
f1()

 8、函数的本质

函数名本质上就是函数的内存地址

8.1可以被引用

def func():
    print('in func')

f = func
print(f)

8.2可以被当作容器类型的元素使用(加上括号,就是运行函数)

def f1():
    print('f1')


def f2():
    print('f2')


def f3():
    print('f3')

l = [f1,f2,f3]
d = {'f1':f1,'f2':f2,'f3':f3}
#调用
l[0]()
d['f2']()

8.3

可以当作函数的参数和返回值(当成普通变量使用)

9、闭包(内部函数对外部作用域而非全剧作用域的名字进行了引用,则该内部函数称为闭包函数):

  #1、必须要有一个内嵌函数
  #2、内嵌函数中要对外层函数中的引用(对全局变量的引用不算闭包函数)
  #3、外部函数必须返回内嵌函数的地址
def func():
    name = 'eva'
    def inner():
        print(name)
    return inner

f = func()#返回的是内部闭包函数inner的地址
f()#地址+括号,运行闭包函数

 闭包,多层嵌套

def wrapper():
    money = 1000
    def func():
        name = 'eva'
        def inner():
            print(name,money)
        return inner
    return func

f = wrapper()
i = f()
i()

以下不属于闭包(对全局变量引用了)

#输出的__closure__为None :不是闭包函数
name = 'egon'
def func2():
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f2 = func2()
f2()

  

原文地址:https://www.cnblogs.com/zzq888/p/10302415.html