【AI编程学习之Python】第十八天:Python的函数基本概念
发布者:admin发表于:16天前阅读数:61评论:0
关键词:pythonai

python_AI

函数是可重用的程序代码块。函数如的作用,不仅可以实现代码的复用,更能实现代码的一致性。一致性甘指的是,只要修改函数如的代码,则所有调用该函数如的地方都能得到体现。

在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增勖加了函数调用、传递参数、返回计算结果等内容。

为了让大家更容易理解,掌握的更深刻。我们也,要深入内存底层进行分析。绝大多数语言内存底层都是高度相似的,这样大家掌握了这些内容也便于以后学习其他语言。

函数简介

函数的基本概念

  1. 一个程序由一个个任务组成;函数就是代表一个任务或者一个功能。

  2. 函数是代码复用的通用机制。

Python函数分类

Python中函数分为如下几类:

  1. 内置函数
    我们前面使用的str()、ist()、len()等这些都是内置函数,我们可以拿来直接使用。

  2. 标准库函数
    我们可以通过import语句导入库,然后使用其中定义的函数。

  3. 第三方库函数
    Python社区也提供了很多高质量的库。下载安装这些库后,也是通过import语句导入,然后可以使用这些第三方库的函数。

  4. 用户自定义函数
    用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数。今天我们学习的就是如何自定义函数。

函数的定义和调用

Python中定义函数语法如下

def 函数名([参数列表]): '''备注''' 函数体/若干语句内容

要点:

  1. 我们使用def来定义函数,然后就是一个空格和函数名称:

    1. Python执行def时,会创建一个函数对象,并绑定到函数名变量上。
  2. 参数列表

    1. 圆括号内是形式参数列表,有多个参数如则使用逗号隔开

    2. 形式参数不需要声明类型,也不需要指定函数返回值类型

    3. 无参数,也必须保留空的圆括号

    4. 实参列表必须与形参列表—对应

  3. return返回值

    1. 如果函数体中包含return语句,则结束函数执行并返回值:
    2. 如果函数体中不包含return语句,则返回None值。
    3. return只能返回一个值,默认返回None,如需要返回多个值,可写入到序列里再返回
  4. 调用函数之前,必须要先定义函数,即先调用def创建函数对象

    1. 内置函数奴对象会自动创建

    2. 标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句

    我们通过实际定义函数来学习函数的定义方式。

形参和实参

【操作】定义一个函数,实现两个数的比较,并返回较大的值。

def printMax(a,b): if a>b: print(a) elif a<b: print(b) else: print("a=b")printMax(10,20)

上面的printMax函数中,在定义时写的printMax(a,b)。a和b称为“形式参数”,简称“形参”。也就是说,形式参数是在定义函数时使用的。形式参数如的命名只要符合“标

识符”命名规则即可。

在调用函数时,传递的参数称为“实际参数”,简称“实参”。上面代码中,printMax(10,20),10和20就是实际参数。

文档字符串

程序的可读性最重要,一般建议在函数体开始的部分附上函数定义说明,这就是“文档字符串“,也有人成为“函数的注释”。我们通过三个单引号或者三个双引号来实现,中间可以加入多行文字进行说明。

【操作】

def printStar(n): '''根据传入的n,打印n个完美岛''' print("完美岛"*n)printStar(10)

我们调用help(函数名.doc) 可以打印输出函数的文档字符串。

help(printStar.__doc__)

返回值

【操作】定义一个打印n个星号的无返回值函数

def printStar(n): print("*"*n)printStar(5)

【操作】定义一个返回两个数评价值的函数

def myAvg(a,b): return (a+b)/2

函数也是对象

Python中,”一切都是对象”。实际上,执行def定义函数后,系统就建了相应的函数对象。我们执行如下程序,然后进行解释:

def printStar(n): print("*"*n)print(printStar)print(id(printStar))c=printStarc(3)

执行结果:


1695985981760

上面代码执行def时,系统中会创建函数对象,并通过printStar这个变量进行引用:

变量作用域

全局变量,通常作为常量使用

在函数内使用,需要global 声明

局部变量与全局同名时,函数内隐藏全局变量

局部变量比全局变量效率更快

参数传递

函数声明时的形式参数,使用时,等同于函数体内的局部变量。由于Python中一切皆对象。因此,参数传递时直接传递对象的地址,但具体使用分两种类型:

  1. 传递不可变对象的引用 (起到其他语言值传递的效果)

  2. 传递可变对象的引用 (起到其他语言引用传递的效果)

b=[12,13]print(id(b))def a(b): b.append(14)a(b)print(id(b))print(b)

传递不可变对象的引用

传递参数是不可变对象(例如:int、float、字符串、元组、布尔值),实际传递的还是对象的引用。在使用时,实际上会创建一个新的对象拷贝。

【操作】参数传递:传递不可变对象的引用

a=100def f1(n): print("n:",id(n)) #传递进来的是a对象的地址 n=n+200 #由于a是不可变对象,因此创建新的对象n,值和a一致 print("n:",id(n)) #n已经变成了新的对象 print(n)f1(a)print("a:",id(a))

执行结果:

n: 140720681408024
n: 2355122056656
300
a: 140720681408024

传递可变对象的引用

传递参数是可变对象(例如:列表、字典、自定义的其他可变对象等),实际传递的还是对象的明引用。在函数体中不创建新的对象拷贝,而是可以直接修改所传递的对象。

【操作】参数传递:传递可变对像的引用

b=[100,200]def f2(m): print("m:",id(m)) #b和m是同一个对象 m.append(30) #由于m是可变对象,不创建对象拷贝,直接修改这个对象f2(b)print("b:",id(b))print(b)

执行结果:

m: 2453963657600
b: 2453963657600
[100, 200, 30]