Python学习笔记(十)—函数和变量
转载请注明出处:http://www.jianshu.com/p/db00f2baf91a
本文出自Shawpoo的简书
我的博客:CSDN博客
【Python学习笔记专栏】:http://blog.csdn.net/column/details/17658.html
一、Python中的函数
1、函数的定义与调用
-
a、函数的定义
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。函数能提高应用的模块性,和代码的重复利用率。我们已经知道Python已经提供了许多内置的函数,例如常见的
print()
函数、input()
函数,我们也可以自定义函数。 -
b、定义(声明)一个函数
定义一个函数语法如下:def 函数名(参数列表): 函数体
例:
>>> def hello(): # 声明函数 ... print("Hello Python~") ... >>> hello() # 调用函数 Hello Python~
定义函数的几条规则:
- 函数代码块以
def
关键词开头,后接函数标识符名称和圆括号()
。 - 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号
:
起始,并且缩进。 -
return
[表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return
相当于返回None
,当函数体为空时,可以借助pass
语句来替代。
- 函数代码块以
2、参数与参数的传递
-
参数的类型有以下4种:
-
1、必需参数
必需参数必须按照顺序传入函数,同时数量必须和声明时保持一致,否则会报错。并且,参数与参数之间声明和传入时都要用逗号隔开。# 声明一个参数的函数 def testFun(s): print(s) testFun("Hello") # 声明两个参数的函数 def testFun2(s, version): print(s + str(version)) testFun2("Python", 3)
-
2、关键字参数
关键字参数指的是,在声明函数的时候参数名为关键字,在调用函数的时候,通过关键字来指定函数参数的值,关键字参数传入函数时不要求顺序,但是关键字必须与声明的参数名保持一致。def testFun2(s, version): # 声明参数名s和version print(s + str(version)) testFun2(version = 3, s = "Python") # 通过参数名指定参数值
-
3、默认参数
调用函数时,如果没有传递参数的话,会采用默认值。如果传递的话,则参数的值为传递的值。默认参数声明必须在非默认参数之后。def testFun(s, version = 3): print(s + str(version)) testFun("Python")
-
4、不定长参数
有的时候我们在声明函数的时候,无法确定函数参数的个数,那么这就用到了不定长参数。参数前面加*
表示不定长参数,如果不定长参数后还有参数的话,则在调用的时候必须使用参数名指定参数值,即:“参数名=值”的方式传值 。def testFun(s, *args): print(s) print(args) testFun("Hello", "Python", "3") 运行结果: Hello ('Python', '3')
-
1、必需参数
3、匿名函数
在Python中使用 lambda
表达式来创建匿名函数。但是Python对匿名函数的支持有限,只有一些简单的情况下可以使用匿名函数。
-
匿名函数的特点:
-
lambda
只是一种表达式,具体的函数声明比def
声明简单很多,去除定义函数的过程,代码更加精简。 -
lambda
的主体(函数体)也只是一个表达式,并不是一个代码块,所以编写逻辑时要比代码块有限。
-
-
a、语法
lambda 参数列表 :(return) 表达式
ps:由于lambda函数返回的是一个函数对象,所以需要一个变量去接收返回值。例:
l = lambda x : x ** 3 print(l(5)) # 输出结果:125
-
b、无参匿名函数
l = lambda : 22 + 66 print(l()) # 输出结果:88
-
c、有参匿名函数
l = lambda x : x + 66 print(l(88)) 输出结果:154
-
d、匿名函数的调用
声明好匿名函数后用一个变量接收值,然后类似于普通函数调用即可。如上面提到的有参与无参匿名函数。
二、变量
1、全局变量和局部变量
全部变量:定义在函数外的变量,拥有全局的作用域的变量;
局部变量:定义在函数内部的变量,拥有局部作用域的变量。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。例:
sum = 0 # 此处的sum为全局变量,整个程序内都可访问
def add(num1, num2) :
sum = num1 + num2 # 此处的sum为局部变量,仅在add函数内部访问
print("局部变量 sum 的值:", sum)
return sum
sum = add(22, 33)
print("全局变量 sum 的值:", sum)
运行结果:
局部变量 sum 的值: 55
全局变量 sum 的值: 55
2、global 和 nonlocal关键字
-
变量的作用域
在python中,访问变量并不是在任何位置都能访问的,需要按照作用域的大小来查找的。python中有4种作用域:- L (Local) 局部作用域
- E (Enclosing) 闭包函数外的函数中
- G (Global) 全局作用域
- B (Built-in) 内置作用域
在访问变量的时候,程序会按照L -> E -> G -> B说顺序去查找定义的变量。即:先在局部作用域中查找,找不到的话然后在函数外的函数(闭包)中查找, 再找不到的话再全局中查找,否则会在Python内置的作用域中查找。
x = max(2, 3) # 内置作用域 sum= 0 # 全局作用域 def outer(): num1 = 1 # 闭包函数外的函数中 def inner(): num2 = 2 # 局部作用域
-
global关键字
假如有个小需求,在某个函数中修改一个全局变量的值:num = 66 def change(): num = 88 print("change()函数打印:", num) change() print("全局打印:", num) 输出结果: change()函数打印: 88 全局打印: 66
通过上面的例子我们会发现,通过调用
change()
函数后并没有将num
的值改成88。原因就是作用域的不同,如果要在函数中访问全局变量的话,需要使用global
关键字。将上面例子修改为:num = 66 def change(): global num # 声明访问全局变量的num num = 88 print("change()函数打印:", num) change() print("全局打印:", num) 输出结果: change()函数打印: 88 全局打印: 88
-
nonlocal关键字
nonlocal
的作用与关键字global
类似,使用nonlocal
关键字可以在一个嵌套的函数中修改嵌套作用域中的变量,如:def func(): num = 66 def change(): num = 88 print("change()函数打印: ", num) change() print("func()函数打印: ", num) func() 输出结果: change()函数打印: 88 func()函数打印: 66
本例和
global
的例子类似,通过闭包函数修改num
的值并没有成功,这时就涉及到了nonlocal
关键字,修改上述例子如下:def func(): num = 66 def change(): nonlocal num # 声明访问局部变量num num = 88 print("change()函数打印: ", num) change() print("func()函数打印: ", num) func() 输出结果: change()函数打印: 88 func()函数打印: 88
好了,基本的函数和变量的使用就记录到这~
参考阅读:【菜鸟教程】