第三章 函数
3.1 创建函数
1.def 语句
def fun():
print('hello world')
2.lambda
lambda是一种匿名函数(+: 避免函数名重复,不需要考虑函数名重复的问题)
和def的区别只是 lambda 没有对象名称
使用lambda有以下注意的几点:
- lambda 定义的是单行函数,如果需要复杂的函数,应该使用def
- lambda参数可以包括多个函数, 如: lambda y:x+y
- 只有一个返回值
- 不能含有命令,只有一个表达式
from math import log
def make_logarithimic_function(base):
return lambda x: log(x, base)
#此函数用于返回一个以base为底的匿名对数函数
My_LF= make_logarithimic_function(3)
#调用匿名函数
print My_LFE(9)
#result=2
3.2 函数的参数
三种形式:位置和关键字参数 / 任何数量的位置参数/任意数量的关键字参数
1.位置和关键字参数
默认参数类型
def fun2(a,b,c):
print(a,b,c)
#可以使用位置参数
>>> fun2(1,2,3) #可以使用关键词参数,关键字参数的顺序没有改变
>>> fun2(a=1,c=3,b=2)
#也可以混和使用位置和关键字,但是关键字必须在位置参数后面
>>> fun2(1,c=3,b=2)
>>> func(a=1,2,3) #报错
可以定义默认参数,但是python不允许带默认值的参数定义在没有默认值的参数之前。
def fun3(a=1,b):
print(a,b) #报错,
def fun3(a,b=2)
print(a,b)
如果调用fun3(2),那么首先会调用a=1,就没有值给b 第二个调用fun3(1),就不会报错
2.任意数量的位置的参数
需要一个星号前缀,任意数量的位置参数(1*)必须定义在位置或者关键字参数之后,且在任意数量的关键字参数(2**)之前
(意思就是 没得星号 ,一个星号, 两个星号)
3.3.可变对象和不可变
可变 | 字典,列表 |
不可变 | 数值类型,字符串,元组 |
def add1(num):
num +1 =num
还是原来的值,因为地址不一样。
如果需要可变对象和赋值对象不进行音容,而是重新分配地址空间进行复制。
1)copy.copy 仅仅复制父对象,不会复制父对象里的子对象
2)copy.deepcopy 复制父对象和子对象。
3.4作用域
python在创建,改变或者查找变量名的时候都是在命令空间中进行,也就是作用域
def print_x():
x=2
print x
>>>x=1
起初在print_x(): 外创建了一个x,又在内部创建了一个x, 局部变量和全局变量。内部函数不会访问到全局变量。
如果想访问可以用:
def print_x():
x=2
print(globals():['x'])
>>>x=1
>>>print_x()
>>>1
如何在函数内创建全局变量:
def defin_x():
global x #设置全局变量
x =2
>>>x=1
>>>defin_x()
>>>print x
>>>2
最好少用global