函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。python
函数能提升应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,好比print()。但你也能够本身建立函数,这被叫作用户自定义函数。express
你能够定义一个由本身想要功能的函数,如下是简单的规则:函数
实例测试
def sayHello(name): return "Hello:{0}".format(name)
这是一个很是简单的Python函数,接受一个参数,而后返回。ui
函数的调用spa
定义一个函数只给了函数一个名称,指定了函数里包含的参数,和代码块结构。3d
这个函数的基本结构完成之后,你能够经过另外一个函数调用执行,也能够直接从Python提示符执行。code
以下实例调用了sayHello()函数:orm
#定义函数 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的值确实没有改变,由于当你想修改不可更改的对象时,其实就开辟了一个新的存储空间新的对象。
函数的参数
如下是调用函数时可以使用的正式参数类型:
一、必备参数
必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的同样。
调用sayHello()函数,你必须传入一个参数,否则会出现语法错误.
二、关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来肯定传入的参数值。
使用关键字参数容许函数调用时参数的顺序与声明时不一致,由于 Python 解释器可以用参数名匹配参数值。咱们把sayHello改为须要传入两个参数的函数:
#定义函数 def sayHello(name1,name2): return "Hello:{0} and {1}".format(name1,name2) print (sayHello(name2="jiming2",name1="jiming1"))
以上代码name1和name2的传入顺序和函数的定义不一致,可是咱们使用关键字name1\name2进行了限定,所以函数仍是可以正确读取对应的参数的
三、缺省参数
调用函数时,缺省参数的值若是没有传入,则被认为是默认值。这个和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
也就是说,咱们把必备参数放到缺省参数的后面,会产生歧义
四、不定长参数
你可能须要一个函数能处理比当初声明时更多的参数。这些参数叫作不定长参数,和上述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 来建立匿名函数。
实例:
sum = lambda arg1, arg2: arg1 + arg2; # 调用sum函数 print "相加后的值为 : ", sum( 10, 20 ) print "相加后的值为 : ", sum( 20, 20 )
一个程序的全部的变量并非在哪一个位置均可以访问的。访问权限决定于这个变量是在哪里赋值的。
变量的做用域决定了在哪一部分程序你能够访问哪一个特定的变量名称。两种最基本的变量做用域以下:
定义在函数内部的变量拥有一个局部做用域,定义在函数外的拥有全局做用域。
局部变量只能在其被声明的函数内部访问,而全局变量能够在整个程序范围内访问。调用函数时,全部在函数内声明的变量名称都将被加入到做用域中