Python 函数和lambda表达式

函数入门

定义函数

可以先调用后定义

def 方法名(形参列表)pass
      返回值
def my_max(x, y):
      z = x if x>y else y
      return z

编写帮助文档

在第二行用三个引号注释的内容就是帮助文档
查看:

help( my_max)
 my_max__.doc__

多个返回值

可以包装成列表返回,或者直接返回,会自动包装成元组

def sum_and_avg(list):
      pass
      return sum, sum/count
#使用:
 s , a = sum_and_avg(a_list)

递归函数

注意递归方向

函数的参数

关键字参数

可以这样调用:

f(v1 = 12, v2 = 15)

但是关键字参数必须放在普通的位置参数后面

参数默认值

带默认值的参数的默认值放在不带默认值的参数后面

可变参数(参数收集)

*形参名

def f( * book, a):

只能有一个“普通”可变参数,位置任意,但是可变参数后面的参数调用时要用关键字调用:

f("asd", "adf", a = "ddd")

还可以同时包含一个关键字参数收集:
会被收集成字典

def f(a, *b, **c):
    print(a)
    for e in b:
        print(e, end="\t")
    print()
    for ele in c.items():
        print(ele, end="\t")
f("aaa", "bb1","bb2", c1 = 1, c2 = 2)

逆向参数收集

就是把元组列表字典等拆开后当成多个参数输入方法中
元组列表:前面加*, 字典:加**

def test(a, b):
     print(a)
     print(b)
a_list = [1,2]# 长度必须为2
test(*a_list)

支持收集的参数也要逆向参数收集

def test(a, *b):
     print(a)
     print(b)
a_list = [1,23]# 长度可以不为2,多的给b了
test(*a_list)

变量作用域

局部变量:函数中定义
全局变量:函数外定义

globals(),返回全局变量的字典,在函数内外调用返回相同,可以修改,并且会真正改变值
locals() 返回局部变量的字典,函数内外调用返回值不同,修改没用
vars(Object):返回对象的字典,没有参数是同locals().

遮蔽

在函数内访问全局变量以后,定义一个同名的局部变量会覆盖全局变量

name = "aa"
def test():
   # 加入这一句会报错
   # pirnt(name)
    name = "bb"
    print(name)
test()
print(name)

解决方法:

  1. 通过globals()方法访问全局变量
  2. 方法内声明使用的是全局变量,则不会定义新的局部变量覆盖
name = "aa"
def test():
    global name
    print(name)
    name = "bb"
print(name) #"bb"

局部函数

在函数体内定义的函数
对外隐蔽,内层函数可以外层函数作为返回值

def f(type ,n):
    def square(n):
        return n*n
    def cube(n):
        return n*n*n
    if type =="square":
        return square(n)
    return cube(n)

在内部函数里面给同名变量赋值,也存在覆盖的问题,解决方法:
用nonlocal声明。

高级内容

函数也是对象
可以作为参数赋值,返回值,函数的参数

赋值给参数

相当于别名

def max1(m,n):
    return m if m>n else n
My_max = max1
a = My_max(1,2)
a = max1(1,2)

作为函数的形参

def fuc(a, f1):
    for e in a:
        f1(e)
def printit(ele):
    print(ele)
a_list =[1,2,3]
fuc(a_list, printit)

作为返回值

前面局部函数里已经介绍了

局部函数和lambda表达式

lambda x,y : x+y
返回的是一个函数
用于简化那些只调用一次的函数

f1 =f("square")
print(f1(5))
发布了9 篇原创文章 · 获赞 0 · 访问量 75

猜你喜欢

转载自blog.csdn.net/longzu233/article/details/103787991