Python自学之路——Python基础(三)函数初识
- 函数
之前学的编程都是从上到下一步一步面向过程的编程,这样做的后果就是很多类似的代码不断地复制粘贴,显得很没有技术含量。现在,终于可以开始接触函数了,开始要进行函数式编程了,想想还是很激动的~~~~~~好了,废话不说,函数到底是怎么样的呢?
一、函数定义的基本形式:
def function(params): block return expression/value
形式很简单,但这里有几点要注意:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
- 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数,参数可以没有,一个或者多个。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。return语句不是必须的。
此时,返回的是None
函数的最大特点是提高了代码的重用性和可读性,那么该怎么调用函数呢?
二、函数的使用
在定义了函数之后,就可以使用该函数了,但是在Python中要注意一个问题,就是在Python中不允许前向引用,即在函数定义之前,不允许调用该函数。
在函数的使用过程中,有几点需要我们特别注意:
函数的参数
参数有分形参和实参。形参的全称是形式参数,是用def关键字定义函数时函数名后括号内的变量,实参的全称是实际参数,是指调用函数时提供的值或者变量。举例如下:
def add(a,b) #a,b为形参 return a+b add(1,2) #1,2为实参 x=2 y=3 add(x,y) #x,y为实参
参数的分类:
详见:http://www.cnblogs.com/dolphin0520/archive/2013/03/15/2959602.html(该文章有些出入,谨看慎思。python中,所有的变量、值都是按引用传递的)
http://www.cnblogs.com/wupeiqi/articles/5453708.html
函数补充1:程序执行是从上往下一步步执行的,如下图,定义了两个f1函数,第一个f1由于第二个f1的存在,在执行的过程中会被废弃,python中有垃圾回收机制清除。
函数补充2:编程中一个绕不过去的问题是变量是按值传递还是按引用传递,不理解这一点会使自己在看别人程序或者自己写代码时云里雾里,现在,就让我们一起看下这两点到底有什么区别。如下 ,左图是按值传递对一个函数的调用过程,若是这个原理的话,那么输出的结果将还是[11, 22, 33, 44].........右图是按引用传递,此时,lis 和 a1指向的是同一个内存地址,那么,输出的结果将是[11, 22, 33, 44, 999].分析了那么多,真正的结果是什么呢?哈哈,看下面的运行结果吧……
"C:\Program Files\Python35\python3.exe" C:/Users/linlinda/PycharmProjects/fighting/test/set.py [11, 22, 33, 44, 999] Process finished with exit code 0
按值传递
按引用传递
函数补充3:全局变量和局部变量
所谓全局变量,是在所有作用域都可读。在函数里面定义的一个变量是局部变量,局部变量的改变并不会改变全局变量的值,如果想要在函数里改变全局变量的值,需要在变量前加global。但有特例需要注意,如果全局变量是列表或者字典这种复杂类型时,函数里可对全局变量进行修改,但是不可重新赋值,因为重新赋值在全局中并不生效。还有,定义全局变量的时候要全部都是大写,利人利已(原谅我下面代码中没有使用,不要学我……)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 name = 'alex'
2 def f1():
3 age = 18
4 name = 'jack'
5 print(age, name)
6
7
8 def f2():
9 age = 19
10 print(age, name)
11
12 f1()
13 f2()
14 输出结果:
15 name = 'alex'
16 def f1():
17 age = 18
18 name = 'jack'
19 print(age, name)
20
21
22 def f2():
23 age = 19
24 print(age, name)
25
26 f1()
27 f2()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 name = 'alex' 2 def f1(): 3 age = 18 4 global name #name表示全局变量 5 name = 'jack' 6 print(age, name) 7 8 9 def f2(): 10 age = 19 11 print(age, name) 12 13 f1() 14 f2() 15 输出结果: 16 18 jack 17 19 jack
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 name = ['alex', 'jack', 'eric'] 2 def f1(): 3 age = 18 4 name[0] = 'davie' 5 print(age, name) 6 7 8 def f2(): 9 age = 19 10 print(age, name) 11 12 f1() 13 f2() 14 输出结果: 15 18 ['davie', 'jack', 'eric'] 16 19 ['davie', 'jack', 'eric']