哈哈,我肥来啦,大家玩得怎么样?不对,这不是重点,重点是......今天我想跟大家讲讲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语法中关于函数的介绍(二)》。希望大家会喜欢~还是那句话,记得关注我,你不会失望的。