[Python][华为云Python编程创造营][学习笔记][05_Python的函数]

举报
John2021 发表于 2021/11/03 07:47:56 2021/11/03
【摘要】 1,函数是什么    1.1,数学中的函数        - 数学中的函数是一种关系,这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素。    1.2,编程语言中的函数        - 在程序中,函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。        - 函数能提高应用的模块性,和代码的重复利用率。2,Python中的函数    2.1,P...

1,函数是什么

    1.1,数学中的函数

        - 数学中的函数是一种关系,这种关系使一个集合里的每一个元素对应到另一个(可能相同的)集合里的唯一元素。

    1.2,编程语言中的函数

        - 在程序中,函数是组织好的,可重复使用的,用来实现单一或相关联功能的代码段。
        - 函数能提高应用的模块性,和代码的重复利用率。

2,Python中的函数

    2.1,Python中的函数可以分为几个类型:

        - 内建函数:比如基础函数print、input等;高阶函数map、reduce等。
        - 用户自定义函数,通过def、lambda关键字构造的函数。
        - 第三方工具包中的函数。

    2.2,组成函数的零件

        img1.jpg

    2.3,定义函数的关键字

        - 在Python中用关键字def声明函数,后面跟函数名和小括号,括号内可以放置所需参数。def定义的函数,是我们平常所说的函数,也是比较常用的。
        - 使用lambda定义的函数,被称之为匿名函数。较为简洁,用于一些小功能场景。

    2.4,函数名-就像是方程的代号

        - 函数名是用来标识一个函数的标识符,其起名的规则和标识符的命名规则是一样的。
        - 好的函数名可以直观的理解函数的功能,起名方式可以遵循标识符的起名方法。
        - 函数调用时通过函数名进行使用。

    2.5,说明文档-就像是工具的说明书

def add(a, b):
    """
    用于计算两个数字之和
    param a:数值类型
    param b:数值类型
    return 两个数字之和
    """
    return a+b
help(add)
# 输出效果
# add(a, b)
#     用于计算两个数字之和
#     param a:数值类型
#     param b:数值类型
#     return 两个数字之和

    2.6,参数-就像是方程中的X

        - 形参:形式参数,没有实体,在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数实参。
        - 实参:实际参数,在代用函数时传入的数据;可以是常量、变量、表达式、函数等。

def function(param):  # 此处为形参
    '''说明文档'''
    pass
function(1)  # 实参

    2.7,返回值-就像是方程计算的结果

        - return,返回函数计算的结果,可以是具体的值、公式、函数等。
            返回值并不是必须的,如果函数中没有return(没有返回值),则默认返回None。
            返回值可以是多个,即:return a b c(实际上会被当作一个元组返回)
        - return标志着一个函数的结束。

l = [1, 2, 3, 4]
print(l.append(5))  # 输出None,即append没有返回值
print(l.pop(2))  # 输出3,返回删除的对象

    2.8,函数体-就像是方程中的计算过程

        - 函数体是函数实现功能的主要部分。
        - 函数体部分要进行缩进。
        - 是对某种功能代码的实现。
        - pass:占位符,没有实际意义。
        - 函数体中可以继续定义函数。

        2.8.1,函数中的参数的类型可以分为以下几种:

            - 必备参数:必备参数须以正确的顺序传入函数,调用时的数量必须和声明时的一样。
                function(a,b)
            - 关键字参数:函数调用时使用等号赋值的形式传入参数。
                function(a=1,b=2)
            - 默认参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
                def function(a=1,b=2):
                    pass
                function()  # 此时使用,没有传入参数,默认a=1,b=2
            - 不定长参数:有时可能需要一个函数能处理比当初声明时更多的参数,这些参数叫做不定长参数,声明时不会命名。
                *args,**kwargs:加了星号(*)的变量args会存放所有未命名的变量参数,args为元组,
                而加了(**)的变量kwargs会存放命名参数,即形如key=value的参数,kwargs为字典。
                def function(*args):
                    pass
                function(1,2,3,4,5)
                参数的位置:def func(必备参数,关键字参数,默认参数,不定长参数)。

    2.9,变量重名-就像和名人重名了

name="吴彦祖"
def func():
    name="小吴"
    print("有人喊你,%s"%(name))
func()  # 喊的是谁?小吴

        - 这段代码会显示什么结果?下面这段呢?

name="吴彦祖"
def func():
    name="小吴"
    print("有人喊你,%s"%(name))  # 小吴
func()
print("有人喊你,%s"%(name))  # 吴彦祖

        - 变量可分为全局变量和局部变量
            定义在脚本中的变量(吴彦祖)为全局变量(脚本中都可以使用)。
            定义在函数、类内部的变量为局部变量(离开函数后就不能再使用了)。
            如果变量重名,在函数内部优先使用局部变量。
        - 当函数中要使用的变量就是全局变量时,可以通过关键字global使用。

name="吴彦祖"
def func():
    global name
    print("我就是,%s"%(name))  # 吴彦祖
func()
print("我就是,%s"%(name))  # 吴彦祖

        - 可变数据对于函数的影响

l = [1, 2]
def func():
    l.append(5)
func()
print(l)  # [1, 2, 5]

    3.0,匿名函数

        - Python中提供了lambda来创建匿名函数。相比于普通函数而言,匿名函数有以下特点:
            lambda只是一个表达式,函数体比def简单很多。
            lambda不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去。
            lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
        - 定义匿名函数:
            #lambda 参数:函数体
            lambda x:x+1
        - 匿名函数的优势
            - 让代码更简洁,例如:
                实现功能,输出x的平方、三次方、四次方

def f1(x):
    return x**2
def f2(x):
    return x**3
def f3(x):
    return x**4
l=[f1,f2,f3]
x=3
for f in l:
    print(f(x))

x=3
l = [lambda x:x**2,lambda x:x**3,lambda x:x**4]
for i in l:
    print(i(x))

3,Python函数的特点

    3.1,Python函数的小特点

        - 函数本身可以作为参数和返回值。
        - Python程序的执行过程:
            自上而下。
            函数体在调用时才会被执行。

    3.2,函数式编程

        - 函数就是面向过程的程序设计的基本单元。
        - 函数式编程思想更接近数学计算。
        - 函数式编程就是一种抽象程度很高的编程范式。
        - 函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数。
        - Python对函数式编程提供部分支持。

    3.3,思考一下

        - 结合Python函数的特点,以下输出结果是多少?

def func():
    temp=[lambda x:x*i for i in range(4)]
    return temp
for i in func():
    print(i(3))  # 9 9 9 9

4,高阶函数

    4.1,高阶函数(1)

        - 既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就是高阶函数。
        - 高阶函数有以下特点:
            变量可以指向函数。
            可以传入函数。

    4.2,高阶函数(2)

        - 高阶函数中变量可以指向函数。
        - 要获得函数调用结果,我们可以把结果赋值给变量。
            例如:x = abs(-10) => x = 10
        - 函数本身也可以赋值给变量,即:变量可以指向函数。
            例如:f = abs => f(-10) = 10

    4.3,高阶函数(3)

        - 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数。
        - 一个最简单的高阶函数:
            def add(x,y,f):
                return f(x)+f(y)
        - 以下输出结果是?

def add(x,y,f):
    return f(x)+f(y)
print(add(-5,6,abs))  # 11

    4.4,map函数

        - Python内建了map()函数。
        - map()函数接收两个参数,一个是函数,一个是Iterable对象,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
        - 比如我们有一个函数f(x)=x^2,要把这个函数作用在一个list[1,2,3,4,5,6,7,8,9]上,就可以用map()实现如下:

def f(x):
    return x*x
r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(r))  # [1, 4, 9, 16, 25, 36, 49, 64, 81]

    4.5,reduce函数

        - reduce把一个函数作用在一个序列[x1,x2,x3,...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
            reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
        - 把序列[1,3,5,7,9]变换成整数13579,reduce就可以派上用场:

from functools import reduce
def fn(x,y):
    return x*10+y
print(reduce(fn,[1,3,5,7,9]))  # 13579

    4.6,filter函数

        - Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。
        - 和map()不同的是,filter()把传入的函数依次用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
        - 利用filter把序列中的空字符串删除:

def not_empty(s):
    return s
result=list(filter(not_empty,['a','b',None,'c','']))
print(result)  # ['a', 'b', 'c']

    4.7,sorted函数

        - 排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。
        - 比较的过程必须通过函数抽象出来。Python内置的sorted()函数就可以对list进行排序。
        - sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序。
        - 对字符串排序,是按照ASCII的大小比较的。

print(sorted(['bob','about','zoo','credit'],key=str.lower))  # ['about', 'bob', 'credit', 'zoo']

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。