哈哈,我肥来啦,大家玩得怎么样?不对,这不是重点,重点是......今天我想跟大家讲讲Python语法中的函数问题。

引言

a) 概念:函数是完成指定或者特定任务的一组代码。在面向对象编程的类中函数通常被称为方法。不同的函数在程序中会扮演不同的角色完成不同的功能。

b) 作用:

i. 函数的使用可以提高代码的复用性,省去重复代码的编写,提升程序代码重复利用率。

ii. 函数能封装内部的实现,保护内部的数据。通常,我们可以将函数看做成一个“黑盒子”。往往函数的使用者并不是函数的编写者,函数的使用者并不需要对函数内部实现和行为进行考虑,可以将精力更多投入到自身业务逻辑的设计中。只有函数的编写者才需要考虑函数内部的实现细节,如何暴露对外的接口,返回什么样的数据值,也就是API的设计。

iii. 提高程序的可读性。使得程序模块化。从一盘散散沙变成整齐队列。

iv. 提高程序的可维护性。案例:打印一个不同字符组成的分隔符。

一、函数基础

a) 可以将函数抽象成现实生活中的工具。工具需要先制作出来才可以使用。函数也是一样的需要先进行函数的定义,然后方可进行函数调用。

b) 函数定义语法结构:

def 函数名(参数):

# 内部代码

return 表达式

c) Return:return不是必须要写的,如果需要则写,不需要可不写。Return后面什么都不跟表示return None。一旦函数执行过程中遇到了return语句,那么函数中return后面的所有语句将不会执行,函数执行结束。

d) 函数调用:

i. 语法结构:函数名(参数值)

ii. 注意事项:

1. 参数之前使用逗号隔开

2. 由于python动态语言的特点,函数调用时填写的参数,python不会对参数类型进行检查,如果函数调用中的参数不符合函数内部运行机制的话,会报错。

e) 参数:现实函数和调用者之间的交互

i. 函数-》工具:使用ATM取钱时需要传入密码数据。

ii. 实参和形参的概念。

iii. 函数调用时,实参会传值给形参

1. 注意:

a) Python的函数参数传递实际上传递的是实参的地址

b) Python中的参数类型分为可变数据类型和不可变数据类型。

2. Test:使用可变数据类型和不可变数据类型的数据作为参数

a = 1

def func(a):

print("在函数内部修改之前,变量a的内存地址为: %s" % id(a))

a = 2

print("在函数内部修改之后,变量a的内存地址为: %s" % id(a))

print("函数内部的a为: %s" % a)

print("调用函数之前,变量a的内存地址为: %s" % id(a))

func(a)

print("函数外部的a为:%s" % a)

打印结果为:

调用函数之前,变量a的内存地址为: 1401140288

在函数内部修改之前,变量a的内存地址为: 1401140288

在函数内部修改之后,变量a的内存地址为: 1401140320

函数内部的a为: 2

函数外部的a为:1

解释:作为参数,a被传入函数时,将数字对象1的地址传递给了函数内部的a。执行第一句内部代码时,此时内部的a和外面的a其实是一个东西,因此打印出了同样的内存地址。而当a=2被执行后,由于整数是不可变的数据类型,所以创建了一个新的内部变量a,并赋值2,将数字对象2的内存地址赋给变量a。我们知道,首先,赋值语句具有创建新变量的功能。

刚才说的是不可变类型参数,如果是可变类型的,比如列表呢?

a = [1, 2, 3]

def func(b):

print("在函数内部修改之前,变量b的内存地址为: %s" % id(b))

b.append(4)

print("在函数内部修改之后,变量b的内存地址为: %s" % id(b))

print("函数内部的b为: %s" % b)

print("调用函数之前,变量a的内存地址为: %s" % id(a))

func(a)

print("函数外部的a为:%s" % a)

执行结果是:

调用函数之前,变量a的内存地址为: 34875720

在函数内部修改之前,变量b的内存地址为: 34875720

在函数内部修改之后,变量b的内存地址为: 34875720

函数内部的b为: [1, 2, 3, 4]

函数外部的a为:[1, 2, 3, 4]

好啦,明天给大家讲讲后半部分,也就是《Python语法中关于函数的介绍(二)》。希望大家会喜欢~还是那句话,记得关注我,你不会失望的。