python学习之函数

函数

 一、函数介绍

1.什么是函数?

函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。函数可以减少重复代码、使程序变的可扩展、使程序变得易维护。

2.为什么要使用函数?

代码的组织结构不清晰,可读性差;
遇到重复的功能只能重复编写实现代码,代码冗余;
功能需要扩展时,需要找出所有实现该功能的地方修改之,无法统一管理且维护难度极大;

3.函数的分类

内置函数:为了方便我们的开发,针对一些简单的功能,python解释器已经为我们定义好了的函数即内置函数。对于内置函数,我们可以拿来就用而无需事先定义,如len(),sum(),max()

自定义函数:很明显内置函数所能提供的功能是有限的,这就需要我们自己根据需求,事先定制好我们自己的函数来实现某种功能,以后,在遇到应用场景时,调用自定义的函数即可。

二、函数的定义

#语法
def 函数名(参数1,参数2,参数3,...):
    '''注释'''
    函数体
    return 返回的值

#函数名要能反映其意义
# 定义函数 name是函数需要接受的一个参数,我们称为形式参数,即形参,形参的值根据函数调用时接受的值来决定
def say_hello(name):
    print(f"hello, {name}")


# 调用函数 "cdc"为调用函数时传入的实际参数,即实参
say_hello("cdc")

三、函数的参数

函数的主要传参方式:

1.普通参数

# 定义函数
def say_hello(name):
    print(f"hello, {name}")


# 调用函数
say_hello("cdc")

2.默认参数

定义了默认参数后,在函数调用时不需要再传入,默认参数放在最后面

def info(name,age,country = 'CN'):   #country定义了一个默认参数
    print('姓名:',name)
    print('年龄:',age)
    print('国籍:',country)

info('cdc',22)     #调用时,没穿实参countrty,就用默认的参数

3.关键参数

 正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后

def info(name,age,country = 'CN'):
    print('姓名:',name)
    print('年龄:',age)
    print('国籍:',country)

info(22,'cdc')   #未使用关键参数时,若不按照顺序传递参数,会导致函数结果错误
info(age=22,name='cdc')   #使用关键参数,可以不按顺序

4.不定长参数

*args  会把多传入的参数变成一个元组形式

def info(name,age,*args):     #*args会把多传入的参数变成一个元祖形式
    print(name, age,args)

info("cdc","22","CN","Python")     #cdc 22 ('CN', 'Python')

**kwargs  会把多传入的参数变成字典形式

def info(name, *args, **kwargs):  # **kwargs 会把多传入的参数变成一个dict形式
    print(name, args)    #cdc (22, 'CN', 'Python')
    print(kwargs)        #{'sex': 'Male', 'province': 'JiangSu'}

info("cdc", 22, "CN", "Python", sex="Male", province="JiangSu")

四、递归函数

定义:如果一个函数在内部调用自身,那么这个函数就叫做递归函数。

递归三要素:

  1. 必须有一个明确的结束条件;

  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少;

  3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出

#递归实现阶乘n! = (n-1)! × n
def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n-1)
print(factorial(5))

结果:120

过程:
factorial(5)                        # 第 1 次调用使用 5
* factorial(4)                    # 第 2 次调用使用 4
* (4 * factorial(3))              # 第 3 次调用使用 3
* (4 * (3 * factorial(2)))        # 第 4 次调用使用 2
* (4 * (3 * (2 * factorial(1))))  # 第 5 次调用使用 1 
* (4 * (3 * (2 * 1)))             # 从第 5 次调用返回
* (4 * (3 * 2))                   # 从第 4 次调用返回
* (4 * 6)                         # 从第 3次调用返回
* 24                              # 从第 2 次调用返回
                                # 从第 1 次调用返回

五、高阶函数

满足下列条件之一就可称函数为高阶函数

  • 某一函数当做参数传入另一个函数中

  • 函数的返回值包含一个或多个函数

#简单的高阶函数

def func():
    print('in the func')
    return foo()
def foo():
    print('in the foo()')
    return 666

res = func()
print(res)

结果:
in the func
in the foo()

六、常用内置函数

map()是 Python 内置的高阶函数,它接收一个函数 f 和一个list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回

def func(x):
    return x * x
a= map(func,range(1,10))
print(list(a))

结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值

from functools import reduce
def f(x,y):
    return x + y
a = reduce(f,[1,3,5,7,9,10])
print(a)

# 结果:35
"""
执行过程
x 1
y 3
>>>>>>>>>>>>>>>>>>>>>>>>>>>
x 4     
y 5
>>>>>>>>>>>>>>>>>>>>>>>>>>>
x 9     
y 7
>>>>>>>>>>>>>>>>>>>>>>>>>>>
x 16   
y 9
>>>>>>>>>>>>>>>>>>>>>>>>>>>
x 25   
y 10
"""

filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list

def is_odd(x):
    return x % 2 == 1
a = filter(is_odd,[1,2,3,4,5,6,7,8])
print(list(a))

结果:[1, 3, 5, 7]

七、匿名函数

ambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方

优点:让代码更加精简,不需要考虑命名的问题

#常规函数
def fun(x,y):
    return x + y

#匿名函数
a = lambda x,y:x + y
print(fun(2,3))

 

参考博客:https://www.cnblogs.com/derek1184405959/p/8044289.html

     https://www.cnblogs.com/linhaifeng/articles/7532497.html

posted @ 2019-11-12 23:01  cdcx  阅读(194)  评论(0)    收藏  举报