LOADING

正在加载

Python学习(五)——函数

一、前言

在学习函数之前,需要明白为什么要学习函数?

首先有这么一段代码:

代码1:

print("Hello!World!")
print("Hello!World!")
print("Hello!World!")
print("Hello!World!")
print("Hello!World!")
print("Hello!World!")

代码2:

#这段代码的意思是将6句Hello!World!放进fun()自定义函数中,并调用fun()函数
def fun():
    print("Hello!World!")
    print("Hello!World!")
    print("Hello!World!")
    print("Hello!World!")
    print("Hello!World!")
    print("Hello!World!")
fun()

也许现在会很疑惑,这不就是简单的print函数打印6遍而已吗?
是的,他们看上去差不多,甚至有人会觉得代码2比代码1复杂许多,但是你想想如果这6句Hello!World!不是单单在一处地方打印时,而是上百处上千处时,那要把代码1打印多久?而代码2只要把定义写完,想在那打印就调用一下即可。函数在刚学习的时候不容易发现他的长处,甚至觉得比较麻烦,但是到了以后做大项目的时候,会发现编程因为有了函数而变得有趣和简洁。函数其实在很多编程语言中都有这个概念,它是后面我们要学习的面向对象编程里面类的雏形。

二、什么是函数

编程语言的函数不同于数学中的函数,编程语言的函数是一块由若干语句组成的语句块、函数名称、参数列表构成的可以实现某种功能的,并且可以重复使用的代码块,它是结构化编程对代码的最基本的封装,函数可以使得代码更加简洁美观,可读性强。

三、创建函数

格式

def 函数名([参数列表]):
…#函数体 由一行或者多行代码组成
…[return 返回值]

1.[]里面的内容表示选填内容
2.函数名是标识符,和变量名差不多
3.函数体是所要执行的存放在函数里面,当调用时执行的代码块
4.return是返回一个想要的得到的值,若没有return语句,会默认返回一个None值
5.参数列表是形式参数 ,他不同于调用函数时的实际参数,是虚的,是一种符号表达

代码

def fun():
    for i in range(1, 10):
        for j in range(i, 10):
            print("{} * {} = {:0>2}\t".format(i, j, i * j), end = "")
        print()
fun()

显示结果
在这里插入图片描述

四、函数的调用

函数定义只是声明了一个函数,就是说告诉计算机这里有这么个东西,但是不执行,它需要调用才能执行。
调用的方式是函数名后加上小括号 ,根据函数的原型判断是有必要再括号内填上参数。调用时的参数叫实际参数 ,是实实在在存在的值。

函数名([参数列表])

五、函数的分类

在使用函数时可能会将自己的数据传递进函数里进行运算,并可以返回运算结束得到的结果,再加上Python本身内置的函数和自己定义的函数。

函数分类有三种:
1.有无参数
2.有无返回值
3.是不是自定义函数

六、引用传递

引用传递可以理解为给函数再取一个名字,个人理解是函数名其实就是变量名,因为在Python中变量名就是一个标签,它可以随便贴给别人!

代码

def fun():
    print("Hello!World!")
a = fun
print(id(fun))
print(type(fun))
print(id(a))
print(type(a))
fun()
a()

显示结果
在这里插入图片描述

七、函数参数

函数在定义时会根据编写者的需求去添加函数的参数,如果说函数是编程语言的灵魂,那么参数就是函数的心脏。在Python中,函数参数的种类非常之多,也正是因为有这么多种类的参数才使得函数显得独具一格。

它们的格式在函数的参数列表中一般是:普通参数->默认参数->可变参数->命名参数。

1.普通参数

普通参数,没啥好说的,就是简单的参数值。

2.默认参数

默认参数就是需要在定义时给它赋初值,在调用函数时参数如果没有传入值,那么就被认为是默认值。

代码

#这里的num_2就是默认值参数,我们将10设置它的默认值
def fun(num_1, num_2 = "10"):
    print("num_1 = {}, num_2 ={}".format(num_1, num_2))
fun(1)

显示结果
在这里插入图片描述

3.可变参数

可变参数是在定义时需要加一个星号”*”,并且必须在所有普通参数和所有默认参数后面,可变参数传入的参数个数是可变的,所以可以不赋值,或者当普通参数和默认参数赋值完,接收剩下的所有值,并且组成一个元组。

注意:在这里如果需要将一个列表或者元组作为实参,需要在变量前面加个”*“,*表示把这个变量列表或者变量元组的所有元素作为可变参数传进去。

代码

#这里的arge就是可变参数,在普通参数和默认参数后面
def fun(num_1, num_2 = "10", *arge):
    print("num_1 = {}, num_2 ={},*arge = {}".format(num_1, num_2, arge))
fun(1, 4.5, 89, 43.5, "sas", 45)

显示结果
在这里插入图片描述

4.关键名参数

关键名参数是在定义时需要加两个星号”**”,并且必须在所有普通参数、所有默认参数和所有可变参数后面,命名参数可以不赋值,或者通过字典的方式赋值,并组成字典的类型。

注意:和可变参数差不多,如果需要将一个字典作为实参,需要在变量前面加个”**“,**表示把这个变量字典的所有key-value用关键字参数传入到函数中,这里的形参是实参的拷贝,对形参修改不影响实参。

代码

#这里的arge_2就是命名参数,在普通参数、默认参数和·可变参数后面
def fun(num_1, num_2 = "10", *arge_1, **arge_2):
    print("num_1 = {}, num_2 ={},*arge_1 = {},*arge_2 = {}".format(num_1, num_2, arge_1, arge_2))
fun(1, 4.5, 89, 43.5, "sas", 45, a = 10, b = 11, c = 12)

显示结果
在这里插入图片描述

5.命名关键字参数

命名关键字参数就是要限制关键字参数的名字的时候使用的,和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数。如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了,命名关键字参数必须传入参数名,如果没有传入参数名,调用将报错。同时命名关键字参数可以在定义时赋值,和默认参数差不多。(个人感觉就是一样的!!!)

代码

#这里*后面的参数就是命名关键字参数
def fun(num_1, num_2 = "10", *, arge_1, arge_2 = 'ww'):
    print("num_1 = {}, num_2 ={}, arge_1 = {}, arge_2 = {}".format(num_1, num_2, arge_1, arge_2))
fun(1, 4.5, arge_1 = 89)

显示结果
在这里插入图片描述

6.将A函数作为B函数参数

在函数式编程中,我们可以将函数当作变量一样自由使用。一个函数接收另一个函数作为参数,这种函数称之为高阶函数。
举个例子:

def high_func(f, arr):
    return [f(x) for x in arr]

上面的例子中, high_func 就是一个高阶函数。其中第一个参数 f 是一个函数,第二个参数 arr 是一个数组,返回的值是数组中的所有的值在经过 f 函数计算后得到的一个列表。例如:


from math import factorial

def high_func(f, arr):
    return [f(x) for x in arr]

def square(n):
    return n ** 2

# 使用python自带数学函数
print(high_func(factorial, list(range(10))))
# print out: [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]

# 使用自定义函数
print(high_func(square, list(range(10))))
# print out: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

八、匿名函数(lambda)

有些时候再写函数时,我们想要不写函数名就可以自定义函数,Python设计团队为了简化函数的编写可以通过使用lambda关键字对函数进行定义。虽然在代码上是简化了不少,但由于只能写在一句代码里面,所以增加了代码维护成本,代码的可读性也下降了,一般很少会使用,(有时候感觉设计者闲得慌,太简单反而变得更复杂)。

格式

lambda [参数1, 参数2… n]:语句或者返回语句

lambda x,y:x + y

等价于

def add(x, y): return x + y

代码

fun = lambda x,y:x + y
print(fun(1, 2))

显示结果
在这里插入图片描述

九、内置函数

在Python中,有非常多的内置函数,我们可以通过dir(__builtins__)查看,这些函数一般是我们经常会用到的,不需要导入模块(模块将在下一篇博文讲解)就可以使用。
这里就不一一讲解了,俗话说的好,有现有的资源,肯定要好好利用啦,如果能创造出更多的资源,那就再好不过了,嘿嘿,所以列,推荐一个链接:链接在此

avatar
小C&天天

修学储能 先博后渊


今日诗句