Python基础总结--09(函数应用)

函数的应用

一、匿名函数

语法:
lambda 参数列表:返回值
函数别名=lambda 参数列表:返回值

sum1= lambda x,y,z:x+y+z
print(sum1(1,2,3))

sum2_0=lambda n:sum(range(n+1)) #返回值只能是一个语句,不能写循环
print(sum2_0(5))

sum2_1= lambda *n:sum(n)
print(sum2_1(1,2,3,4,5))

string_print_0=lambda x,y,z:print("zhe shi yi ge han shu ") #print函数的返回值为None
print(string_print_0(1,2,3))
string_print_1=lambda x,y,z:print(x,y,z) #print函数的返回值为None
print(string_print_1(1,2,3))

sum3=lambda x=1,y=1,z=1:sum1 #将sum1函数作为返回值
print(sum3())

sum4=lambda x=1,y=1,z=1:sum1(1,2,3) #在sum4中调用sum1
print(sum4())

sum5=lambda x=1,y=1,z=1:sum1
print(sum5()(1,2,3)) #在sum5的返回值为sum1,再调用sum1

col=[]

for item in range(1,5):
    col.append(lambda x:x*item)
print(col[0](2))  #打印的值是多少?
print(col[1](2))  #打印的值是多少?
#注意:函数在调用的时候才执行函数体
'''
item=1~4
item=1--> [lambda x:x*item]
item=2--> [lambda x:x*item,lambda x:x*item]
item=3--> [lambda x:x*item,lambda x:x*item,lambda x:x*item]
item=4--> [lambda x:x*item,lambda x:x*item,lambda x:x*item,lambda x:x*item]
col[0](2)=x*item=2*4=8
col[1](2)=x*item=2*4=8
'''

二、变量作用域

变量的作用域是指变量能够使用的范围
作用域链:变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错
1、全局变量:
申明在函数或类外面的变量都是全局变量,作用域从申明开始到整个py文件结束
(与C和Java都有区别,Python没有块级作用域)

for x in range(1,5):
    for y in range(1,5):
        z=100
print(x,y,z) #x,y,z 都是全局变量

2、局部变量
申明在函数或类里面的变量都是局部变量,作用域从申明开始到整个函数或者类结束

def func1():
    name = "Band"
    print(name)
func1()

**3、global关键字 **
注意:只能用于函数中
作用:在局部域中定义全局变量

name="James"
def func2():
    print(name)
def func3():
    global name  #在函数中申明一个name全局变量
    global age   #在函数中申明一个age全局变量
    name = "James Band"
    age = 30
    print(name)
func2() #调用函数,打印局部变量
func3() #全局变量指向的地址被func3修改
print(name,age)#打印在func3中申明的全局变量

**4、nonlocal关键字 **
只能用于函数中
作用:在局部域的局部域中修改变量的值

name="James"  #全局变量
def func4():
    name="James Band"  #局部变量(func4作用域)
    def func5():
        name="James Band 007" #局部变量(func5作用域)
        print(name)
    func5()
    print(name)
func4()   #James Band 007  James Band 
print(name)  #James 

name="James"
def func6():
    name="James Band"
    def func7():
        nonlocal name  #在func7中申明了一个在func6作用域的变量,在作用域链中扩大了一个层级
        name="James Band 007"
        print(name)
    func7()
    print(name)
func6()        #James Band 007  James Band 007(局部参数被重新申明)
print(name)    #James

三、函数作为变量使用

申明函数就是申明一个function类型的变量,函数名就是变量名
1、函数作为变量赋值给其他变量

func1=lambda x,y:x*y
a=func1#函数作为变量赋值给a
b=func1(2,3)#返回值赋值给b

2、函数作为序列的元素

def func2():
    print('调用了func2函数')
    return 10
list1=[1,func2,func2()]
print(list1[1]())
print(list1[2])

3、将函数作为参数

def func11(n):
    n()
def func12():
    print("调用func12函数")
func11(func12)
re=func11(func12)
print(re)

4、将函数作为返回值
将函数的申明写在函数里面,可以隐藏函数的实现

#根据操作符进行相关的数字计算
def opration(oprater:str):
    if oprater=="+":
        def func1(*param1,**param2):
            sums=0
            for x in param1:
                sums+=x
            for x in param2:
                sums+=param2[x]
            return sums
        return func1
    if oprater=="*":
        def func2(*param1,**param2):
            sums=1
            for x in param1:
                sums*=x
            for x in param2:
                sums*=param2[x]
            return sums
        return func2
f1=opration("+")
re=f1(1,2,3,4,a=5,b=6)
print(re)
print(opration("*")(3,4,a=5))

函数可以将自己作为返回值

def func21(n):
    print("调用func21函数")
    n()
    return func21
def func22():
    print("调用func22函数")
    return func22
func21(func22()) #调用func22函数、调用func21函数、调用func22函数
func21(func22)  #调用func21函数、调用func22函数

分析:func21(func22())-->func22()对func22函数进行调用,就打印了一次"调用func22函数",同时将func22的返回值(函数自身)作为函数func21的变量,调用func22函数,打印了一次"调用func21函数",然后n()相当于func21()又调用了一次,打印了一次"调用func22函数"

关于sort()的应用
sort(key=None,reverse=False):可以给key赋值一个函数变量,指定元素的排序规则
要求:
(1)函数变量要求有一个参数和返回值;
(2)参数代表列表中的元素,返回值代表排序规则

list2=[{'name':"James","age":25,"city":"guangzhou"},
       {'name': "James Band", "age": 22, "city": "chengdu"},
       {'name': "James Band 007", "age": 33, "city": "chongqing"}]
def get_age(items):
     return items['age']
list2.sort(key=get_age)
print(list2)
#[{'name': 'James Band', 'age': 22, 'city': 'chengdu'}, {'name': 'James', 'age': 25, 'city': 'guangzhou'}, {'name': 'James Band 007', 'age': 33, 'city': 'chongqing'}]

四、函数的调用

注意:函数的调用过程是一个压栈的过程
每次调用函数系统都会在内存中(栈)开辟空间存储执行过程中产生的数据(函数中申明的变量);当函数调用结束后,该内存空间会自动销毁
1、函数可以有多个返回值

def sum_and_average(*param):
    """返回数组的和以及平均值"""
    sums=sum(param)
    average=sums/len(param)
    return sums,average
result=sum_and_average(1,2,3,4,5,6,7,8,9)
print(result)

2、函数递归调用
怎么写递归函数:
1、确定临界值(循环结束的条件),让函数结束
2、找关系,假设函数的功能已经实现,找f(n)和f(n)的关系
3、根据关系,用f(n-1)实现f(n)的功能

def My_sums(n):
    if n==1:return 1
    return My_sums(n-1)+n
print(My_sums(5))

注意:不推荐使用递归调用,运行时消耗内存

你可能感兴趣的:(Python基础总结--09(函数应用))