一、函数的定义
语法如下,依赖上下文缩进对齐:
def 函数名(参数列表):
函数体
例如下面的代码:
#!/usr/bin/env
def demo(num):
print(num)
demo('小黄牛真帅!')
二、参数的传递
在 python 中,类型属于对象,变量是没有类型的,string
, tuple
, 和 number
是不可更改的对象,而 list
,dict
等则是可以修改的对象。
python 中一切都是对象,严格意义上不能说值传递还是引用传递,应该说传不可变对象和传可变对象。
python 函数的参数传递:
1、不可变类型:如整数、字符串、元组。
例如fun(a)
,传递的只是a
的值,没有影响a
对象本身。
比如在fun(a)
内部修改 a
的值,只是修改另一个复制的对象,不会影响函数外部 a
变量本身,就是通常说的作用域。
2、可变类型:如列表,字典。
如 fun(la)
,则是将 la
真正的传过去,修改后fun()
外部的la
也会受影响。
传不可变对象的例子:
#!/usr/bin/env
#定义函数
def demo(b):
b = 100
print(b)
b = 1
#调用函数
demo(b)
print(b)
运行上面的代码后,我们可以从结果中看出函数外部b
变量的值并没有发生变化。
注意:上面的b
变量为必传参数,如果我们直接调用demo()
函数就会报错
Python也允许给函数变量传递默认参数,例如这样创建函数:def demo(b=200)
传可变对象的例子:
#!/usr/bin/env
#定义函数
def demo( list ):
list[0] = 100
print(list)
list = [1,2,3,4]
#调用函数
demo(list)
print(list)
从结果可以看出,在调用过函数之后,函数外部的list
中的值也发生了改变。
三、可变参数位置
Python中允许使用关键字参数调用函数,在调用时参数的顺序与声明时可以不一致,用法如下:
#!/usr/bin/env
# 定义函数
def demo(name,phone):
print(name)
print(phone)
# 调用函数
demo(phone="110", name="小黄牛")
四、传递不定个数的参数
当我们创建一个函数的时候,需要传入的参数个数未知,这时候应该怎么办?
Python中给我们提供了两种方法:
语法一:
def 函数名(*var):
函数体
加了*
星号的参数会以元组(tuple
)的形式导入,存放所有未命名的变量参数,
例如:
#!/usr/bin/env
# 定义函数
def demo(*var):
print(var)
#调用函数
demo(1,2,3)
如果在函数调用时没有指定参数,它就是一个空元组。
可以不向函数传递未命名的变量。
语法二:
def 函数名(**var):
函数体
加了两个**
星号的参数会以字典的形式导入。
例如:
#!/usr/bin/env
# 定义函数
def demo(**var):
print(var)
#调用函数
demo(a=1,b=2,c=3)
输出结果如下:
{'a': 1, 'b': 2, 'c': 3}
五、匿名函数
Python中也支持匿名函数的创建,但没有闭包的概念,所以作用不大,只能处理简单的逻辑。
python 使用 lambda
关键字来创建匿名函数:
1、lambda
只是一个表达式,函数体比 def
简单很多。
2、lambda
的主体是一个表达式,而不是一个代码块。仅仅能在lambda
表达式中封装有限的逻辑进去。
3、lambda
函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
语法如下:lambda [变量,变量] : 函数体
示例:
#!/usr/bin/env
#定义匿名函数
sum = lambda a,b : print(a+b)
#调用函数
sum(2,2)
注意:匿名函数的函数体,只能写在同一行代码中,也无法使用\
符号进行多行划分。
六、返回值
与其他编程语言一样,Python中同样是使用return
关键字退出函数,选择性地向调用方返回一个表达式。
不带参数值的return
语句返回None
,这里需要注意,首字母N
是大写的。
在Python中没有NULL
的概念,空则是None
字符串,我们要判断是不是为None
可以直接使用if
判断,例如这样:if a== None
示例代码:
#!/usr/bin/env
#定义函数
def demo(a,b):
sum = a + b
return sum
#调用函数
total = demo(5,10)
print(total)