1、函数的定义:
函数是一段具有特定功能的、可重用的语句组。
说明:过程语言,程序员是按照顺序一行一行的编写代码,然后是顺序执行,很容易出现大量重复的代码行,那么有人就考虑将相同的代码提取出来,独立实现一个功能,供需要的代码调用,这就是函数的来源。
2、通过函数名来进行调用,函数也被看着是一段具有名字的程序,在需要的地方调用执行。对函数的使用不需要了解函数内部实现的原理,只要了解函数的输入输出方式即可。
3、函数的参数:每次函数提供不同的参数作为输入,以实现对不同数据的处理。参数是调用该函数时传递给它的值,可以有零个、一个或者多个。
4、函数的返回值:函数执行后,可以反馈相应的处理结果。当需要返回值的时候,使用保留字return和返回值列表,函数也可以没有return语句。
定义函数的语法形式:
def 函数名(<参数列表>):
<函数体>
return <返回值列表>
5、函数的特点:
1)减少代码重复;
2)使程序更加模块化;
3)使程序便于阅读。
例1:
str1 = '我爱中华人民共和国'
def my_len(s): # def是保留字定义一个函数,my_len是函数名,s是形参
i = 0 # i是计数器
for k in s: # k是字符串元素
i = i + 1
return i #返回的是字符串元素的个数
ret = my_len(str1) # my_len函数名调用函数,str1是实参
print(ret)
6、函数的调用过程:
程序调用一个函数需要执行4个步骤:
1)调用程序在调用处暂停执行;
2)在调用时将实参复制给函数的形参;
3)执行函数体语句;
4)函数调用结束给出返回值,程序回到调用前的暂停处继续执行。
函数式编程是一种编程范式,常见的编程范式还包括命令式编程和面向对象编程等,函数式编程的主要思想是把程序过程尽量写成一系列函数调用,通过函数进一步提高封装级别。函数式编程通过使用一系列函数能够使代码编程编写更简洁、更易于理解,是中小规模软件项目中最常用的编程方式。
7、函数的返回值:
return语句用来退出函数并将程序返回到函数被调用的位置继续执行。return语句可以同时将0个、1个、多个函数运算后的结构返回给函数被调用处的变量。
7.1 返回值的三种情况:
# 没有返回值,返回值为None;
1)不写return语句;
2)只写return,结束一个函数;
3)return None:不常用;
# 返回1个值:
1)可以返回任意数据类型;
2)只要返回就可以被接收到;
3)如果一个程序中有多个return语句,那么只执行第一个。(如果是顺序执行的话)
# 返回多个:
1)用多个变量接收:有多少返回值就用多少返回值接收;
2)用一个变量接收:得到的是一个元组。
例2:函数调用。
def f1(l1):
print("f1 function")
print("f1 for:")
for i in l1:
print(i)
def f2(l1):
print("f2 function")
f1(l1)
print("f2 for:")
for i in l1:
print(i)
f2([1, 2, 3, 4])
例3:返回元组。
def func(a, b):
return b, a
s = func('chang', 2)
print(s, type(s))
结果:
8、函数对变量的作用:
一个程序中的变量包含两类:全局变量和局部变量。全部变量指在函数外定义的变量,一般没有缩进,在程序执行全过程有效。局部变量是指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在。
例4:
n = 1 # n是全局变量
def func(a, b):
global n # 如果n是全局变量,那么需要在n使用前显示声明变量为全局变量
n = b # 将局部变量赋值给全局变量n
return a * b
s = func('chang', 2)
print(s, n)
该例中,请注意下global的使用。
例5:
ls = [] # ls是全局列表变量
def func(a, b):
ls.append(b) # 将局部变量b增加到全局列表变量ls中
return a * b
s = func('chang', 2)
print(s, ls) # 测试ls的值是否发生变化ng', 2)
print(s, ls)
结果:
这个地方就是Python才刚刚开始展示它的魅力。
列表等组合数据类型由于操作多个数据,所以它们在使用中有创建和引用的分别。当列表变量被方括号赋值时,这个列表才被真实创建,否则只是对之前创建列表的的一次引用。
上面的代码func()函数的ls.append(b) 语句执行时需要一个真实创建过的列表,此时,func()函数专属的内存空间中没有已创建过的且名称为ls的列表,因此,func()函数进一步去寻找全局内存空间,自动关联全局ls列表,并修改其内容。当func()函数退出后,全局ls列表中的内容被修改。简单地说,对于列表类型,函数可以直接使用全局列表而需要使用global进行声明。
总结:
1)函数内局部变量x,对全局变量x没有影响;
2)函数内部global x,就可以修改全局变量x;
3)组合数据类型,函数内部没有的话,就直接修改全局变量的组合数据类型;
4)组合数据类型,函数内部有的话,那么函数仅对局部变量进行操作,对全局的组合数据类型没有影响。
最后再看下指针和引用的区别:
1)指针是保存内存地址的变量;指针直接指向内存地址,说明对象已经生成。
2)引用是某一种变量的别名,用这个名字可以对这个变量进行操作。引用只是别名,需要真实创建对象才能操作对象。