08-函数

2023-04-03  本文已影响0人  飘摇的水草
定义函数

函数是能够实现一个具体的功能,是多行代码的集合

def 函数名():
      函数代码
函数的文档说明
def function():
    """
    打印输出
    """
    print ("好好学习")
函数参数
def func1(a,b):
    c = a + b
    print ("求和的结果是%d" % c)

func1(10,20)
局部变量
def func2():
    num = 100
    print (num)
全局变量
g_num = 200
def func2():
    num = 100
    print (num)

    # 注意global要放在前面
    global g_num
    print ("g_num 的值是%d" % g_num)
    g_num = 20

func2()
print (g_num)
函数返回值
def add(a,b):
    c = a + b
    return c

result = add(100,200)
print result
函数返回多个数据
def add2(a,b):
    c = a + b
    d = a - b
    return c,d

resul = add2(20,30)

print ("a + b的结果是%d, a - b的结果是%d" % (resul[0],resul[1]))
函数传参的形式
def func3(a,b,c):
    print ("a = %d" % a )
    print ("b = %d" % b)
    print ("c = %d" % c)

func3(c = 300,a = 100,b = 200)
func (10, b = 20, c = 30)
缺省参数
def func(a,b,c = 30):
    print ("a = %d" % a )
    print ("b = %d" % b)
    print ("c = %d" % c)

func(10,20)
不定长参数
def func4(*args,**kwargs):
    print(args)
    print (kwargs)

func4(1,2,3,4,5)
func4(a = 1,b = 2,c = 3,d = 4)
func4(1,2,3,a = 4,b = 5,c = 6)

输出结果如下所示:

不定长参数.png
函数形参的完整格式

这种形式相对较好

def func5(a, *args, b = 5):
    print (a)
    print (b)
    print (args)

func5(2,3,4,5,6,b = 4)
拆包
a = 1,2,3;
b,c,d = a;

print (b)
print (d)
print (c)

e,f = [10,20]
print (e)
print (f)

my_dict = {"name":"lin","age":10}
g,h = my_dict

print (g)
print (h)

# 交换数值 
a, b = b, a
引用
my_list = [1,2,3]
my_list1 = my_list

print (my_list, id(my_list))
print (my_list1, id(my_list1))

my_list.append(4)
print (my_list, id(my_list))
print (my_list1, id(my_list1))

可以发现当 my_list 变化以后,my_list1 也变化了

引用举例.png
类型的可变与不可变
引用做参数

当引用做为函数的参数传递时,当在函数内部修改了参数,则在外部访问时参数也修改了

def func5(a):
    a.append(4)

func5(my_list2)
print (my_list2)
递归函数

如果一个函数在内部不调用其他的函数,而是调用自己本身的话,这个函数就是递归函数,但必须要有退出条件

def getAge(num):
    if (num == 1):
        return 18
    return  getAge(num - 1) + 2

print (getAge(1))
print (getAge(2))
print (getAge(3))
print (getAge(4))
匿名函数

使用 lambda 关键字定义的函数就是匿名函数
格式如下:

lambda 参数列表:表达式

主要可以分为以下几种:

  1. 无参数无返回值
def  函数名():
       函数代码

lambda:函数代码
  1. 无参数有返回值
def  函数名():
       return 1 + 2

lambda: 1 + 2
  1. 有参数无返回值
def 函数名(a, b):
      print(a, b)

lambda a, b: print(a, b)
  1. 有参数有返回值
def 函数名(a, b):
      return a + b

lambda a, b: a + b

和之前的代码对比如下所示:

# 无参有返回值

def fun2():
    return 1 + 2

f2 = lambda :1 + 2
print (f2())

# 有参无返回值

def func3(name):
    print (name)

f3 = lambda name:print(name)
f3("lin")

# 有参有返回值
def func4 ( *args):
    return args

f4 = lambda *args:args
print (f4(1,2,3,4,5))

匿名函数的应用

下面是用匿名函数代替普通函数的用法

def my_calc(a, b ,func):
    print ("其他的函数代码:")
    num = func (a,b)
    print (num)

def add(a, b):
    return a + b

my_calc(10,20,add)
# 与上面代码的功能相似
my_calc(10,20,lambda a,b: a + b)
my_calc(10,20, lambda a,b: a - b)
my_calc(10,20, lambda a,b: a / b)
列表排序
  1. 根据某个 key 值进行排序
mylist = [
    {"name":"d","age":10},
    {"name": "a", "age": 11},
    {"name": "b", "age": 5},
    {"name": "c", "age": 2}]

# x表示列表中的每个数据
mylist.sort(key = lambda x:x["name"])
print mylist

mylist.sort(key = lambda x:x["age"])
print mylist

输出结果如下所示:

列表排序.png
  1. 根据多个条件进行排序,排序规则:key = lambda 形参:(排序规则1,排序规则2)

下面是先按照名字排序,再根据年龄排序

mylist.sort(key = lambda x:(x["name"],x["age"]))
print mylist
列表推导式

变量 = [生成数据的规则 for 临时变量 in xx]

  1. 普通格式
mylist1 = [i for i in range(5)]
print mylist1
  1. 加 if 条件
mylist1 = [i for i in range(5) if i % 2 == 0]

高阶函数

把函数作为参数传入,这样的函数被称为高阶函数,高阶函数是函数式编程的体现,函数式编程就是指这种高度抽象的编程范式

def sum_num(a, b, f):
    return  f(a) + f(b)

result = sum_num(10, - 6, abs)
print result
内置高阶函数

map函数

list = [1,2,3,4,5]

def func(x):
    return x ** 2

list2 = map(list,func)
print list2

reduce函数

reduce(func, list), 其中func必须有两个参数,每次func计算的结果继续和序列的下一个元素做累积计算

上一篇下一篇

猜你喜欢

热点阅读