Python 函数
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义一个函数
你可以定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
实例
def sayHello(name): return "Hello:{0}".format(name)
这是一个非常简单的Python函数,接受一个参数,然后返回。
函数的调用
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从Python提示符执行。
如下实例调用了sayHello()函数:
#定义函数 def sayHello(name): return "Hello:{0}".format(name) #调用函数 print(sayHello("jiming"))
输出结果为:
所有参数在Python里都是按引用传递,如果你在函数内部修改了参数,那么原始的参数也被改变了
例如:
myList = [1,2,3] print("修改前myList值:",myList) def changeMyList(list): myList[0:] = [3,2,1] print("函数内修改后myList值:",myList) changeMyList(myList) print("函数外修改后myList值:",myList)
在上述代码中,我们在函数内将myList的值改为3,2,1,代码执行结果为:
注意:在python中,strings, tuples, 和numbers是不可更改的对象,而list,dict等则是可以修改的对象。
我们来做个测试:
Money = 2000 print("修改之前函数外Money值:{0}".format(Money)) def AddMoney(_money): _money +=1 print("修改之后函数内Money值:{0}".format(Money)) AddMoney(Money) print("修改之后函数外Money值:{0}".format(Money))
看到了吧,Money的值确实没有改变,因为当你想修改不可更改的对象时,其实就开辟了一个新的存储空间新的对象。
函数的参数
以下是调用函数时可使用的正式参数类型:
- 必备参数
- 关键字参数
- 默认参数
- 不定长参数
1、必备参数
必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。
调用sayHello()函数,你必须传入一个参数,不然会出现语法错误.
2、关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。我们把sayHello改成需要传入两个参数的函数:
#定义函数 def sayHello(name1,name2): return "Hello:{0} and {1}".format(name1,name2) print (sayHello(name2="jiming2",name1="jiming1"))
以上代码name1和name2的传入顺序和函数的定义不一致,但是我们使用关键字name1\name2进行了限定,因此函数还是能够正确读取对应的参数的
3、缺省参数
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。这个和C#的缺省参数是一样的,例如:
#定义函数 def sayHello(name1,name2="jiming2"): return "Hello:{0} and {1}".format(name1,name2) print (sayHello("jiming1"))
输出的结果为:
如果我们把name1改为缺省参数,而name2为必备参数的时候,代码还能正确运行吗?
#定义函数 def sayHello(name1="jiming1",name2): return "Hello:{0} and {1}".format(name1,name2) print (sayHello("jiming2"))
编译器汇报如下错误:SyntaxError: non-default argument follows default argument
也就是说,我们把必备参数放到缺省参数的后面,会产生歧义
4、不定长参数
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。基本语法如下:
def functionname([formal_args,] *var_args_tuple ): "函数_文档字符串" function_suite return [expression]
实例
#定义函数 def sayHello(sayPerson,*allPersons): for p in allPersons: print("{0} say :'Hello:{1}'".format(sayPerson, p)) sayHello("jiming","friend1","friend2","friend3")
输出结果为:
为了避免歧义,不定长参数也应该放到方法参数的最后一个
匿名函数
python 使用 lambda 来创建匿名函数。
- lambda只是一个表达式,函数体比def简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
实例:
sum = lambda arg1, arg2: arg1 + arg2; # 调用sum函数 print "相加后的值为 : ", sum( 10, 20 ) print "相加后的值为 : ", sum( 20, 20 )
变量作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
- 全局变量
- 局部变量
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中