函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。Python内置了很多有用的函数,我们可以直接调用。要调用一个函数,需要知道函数的名称和参数,可以直接从Python的官方网站查看文档:http://docs.python.org/2/library/functions.html 函数能提高应用的模块性,和代码的重复利用率。下面我们自己创建函数,这被叫做用户自定义函数。
一、定义函数
python定义函数的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数内容以冒号起始,并且缩进
return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
实例:
def 函数名(参数):
"""函数说明"""
函数体
# 实例:空函数
def test():
"""空函数:什么事都不做"""
pass # pass可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass,让代码能运行起来
二、函数调用
定义了函数之后,就相当于有了一个具有某些功能的代码,想要让这些代码能够执行,需要调用它,调用函数很简单的,通过 函数名() 即可完成调用。
def test():
"""定义函数:打印欢迎访问"""
print('欢迎访问csx博客')
# 调用函数
test() # 结果:欢迎访问csx博客
三、函数的参数
3.1 参数的传递
在 python 中,类型属于对象,变量是没有类型的:
# a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是 List 类型对象,也可以指向 String 类型对象等。
a= 1 # a 是数值型(int)
a = 'str' # a是字符串
a = [1,2,3] # a是列表
可变类型与不可变类型:
在python中,string、tuple和numbers都是不可变类型,list和dict是可变类型。
- 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。
- 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。
- 在python 传递参数中:传递不可变类型:仅仅是传递了值,对原对象没有影响。传递可变类型:传递的是实实切切的原对象,函数对参数的修改会影响原对象。
3.2 函数的参数类型
- 必备参数
- 关键字参数
- 默认参数
- 不定长参数
必备参数
必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。调用abs()函数,你必须传入一个参数,不然会出现语法错误:
def abs(a):
"""取绝对值"""
if a > 0:
print(a)
else:
print(-a)
# 调用函数
abs()
Traceback (most recent call last):
File “test.py”, line 11, in
abs()
TypeError: abs() takes exactly 1 argument (0 given)
关键字参数
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
#可写函数说明
def printme( str ):
"打印任何传入的字符串"
print(str)
# 调用printme函数
printme( str = "My string")
- 关键字参数必须出现在位置参数的后面
- 不允许使用关键字参数对同一个形参进行多次赋值
- 关键字参数既可以为位置参数赋值,也可以为默认参数赋值。通常使用关键字参数解决默认参数选择性赋值问题。
默认参数:
当我们没有传递参数时我们可以使用参数的默认参数。
def add(a,b=100):
print(a+b)
#只传递一个参数
add(100)#打印结果200
不定长参数:
当我们不确定函数该传递多少个参数时我们可以使用不定长参数:
#args本质上是一个元组
def sumFun(n,*args):
sum=0
sum=sum+n
for num in args:
sum = sum+num
return sum
print(sumFun(1))
print(sumFun(1,2,3,4,5,6,7,8,9,10))
匿名函数
python 使用 lambda 来创建匿名函数。
- lambda只是一个表达式,函数体比def简单很多。
- lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
- lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
- 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
# 匿名函数格式:lambda [arg1 [,arg2,.....argn]]:expression
a = lambda x,y :x+y
print(a(1,2)) # 3
使用匿名函数可以动态改变函数的特性:
# 匿名函数格式:lambda [arg1 [,arg2,.....argn]]:expression
sum1 = lambda x,y :x+y
power = lambda x,y :x*y
def test(x,y,fun):
return fun(x,y)
print('求和:',test(2,3,sum1))
print('求幂:',test(2,3,power))
五、变量作用域
一个程序的所有的变量并不是在哪个位置都可以访问的。访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了在哪一部分程序你可以访问哪个特定的变量名称。两种最基本的变量作用域如下:
- 全局变量
- 局部变量
全局变量和局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
sum=0 #这是全局变量
def add(x,y):
sum=x+y #这是局部变量
return sum
print(add(1,1))
#输出2
print(sum)
#仍然输出0
对于上面我们想通过函数修改全局变量sum的值,因为它是个不可变类型所以通过函数的传参是无法实现的,我们需要使用global关键字:
sum=0
def add(x,y):
global sum
sum=x+y
return sum
print(add(1,1))
#输出2
print(sum)
#输出2,修改成功