抽象
函数
判断某个对象是否可调用,可使用内置函数callable
自定义函数:使用def语句
def fibs(num):
result = [0,1]
for i in range(num-2):
result.append(result[-2] + result[-1])
return result
>>>fibs(10)
注:return语句用于从函数返回值
函数参数:
在def语句中,位于函数名后面的变量通常称为形参,而调用函数时提供的值为实参
def change(n):
n[0] = "root"
>>>names=['webadmin','clouder']
>>>change(names)
>>>names --->['root', 'clouder']
在函数内修改了参数,修改了变量关联到的列表:相当于:
>>>names=['webadmin','clouder']
>>>n=names #再次假装传递名字作为参数
>>>n[0]="root" #修改列表
>>>names --->['root', 'clouder']
将同一个列表赋值给两个变量,这两个变量将同时指向这个列表。要避免这样的结果,必须创建列表的副本;对列表执行切片操作时,返回的切片都是副本。
>>>names=['webadmin','clouder']
>>>n=names[:]
>>>n --->['webadmin', 'clouder']
>>>n == names --->True
>>>n is names --->False
注:n和names是两个相等但不同的列表,现若像函数change中那样修改n,将不会影响names
>>>n[0] = "osadmin"
>>>n --->['osadmin', 'clouder']
>>>names --->['webadmin', 'clouder']
修改参数:
def init(data): #创建一个初始化数据结构的函数
data['first'] = {}
data['middle'] = {}
data['last'] = {}
>>>storage = {}
>>>init(storage)
>>>storage --->{'first': {}, 'middle': {}, 'last': {}}
def lookup(data,lable,name):
return data[lable].get(name)
获取人员姓名的函数:函数lookup接受参数lable和name,并返回一个由全名组成的列表,返回的是储存在数据结构中的列表,若对返回的列表进行修改,将影响数据结构。
def store(data,full_name):
names=full_name.split()
if len(names)==2: names.insert(1,"")
lables = 'first','middle','last'
for lable,name in zip(lables,names):
people=lookup(data,lable,name)
if people:
people.append(full_name)
else:
data[lable][name] = [full_name]
结合上面的init,lookup函数:
>>>myname={}
>>>init(myname)
>>>store(my,"webadmin clouder root")
关键字参数和默认值:
使用名称指定的参数称为关键字参数,主要优点是有助于说明各个参数的作用
def hello_1(greeting,name):
print("{},{}!".format(greeting,name))
def hello_2(name,greeting):
print("{},{}!".format(name,greeting))
def hello_3(greeting="hello",name="world"):
print("{},{}!".format(greeting,name))s
>>>hello_1("hello","world") --->hello,world!
>>>hello_2("hello","world") --->hello,world!
>>>hello_3() --->hello,world!
>>>hello_3("welcome") --->welcome,world!
>>>hello_3("welcome","clouder") --->welcome,clouder!
收集参数:
def print_params(title,*params):
print(title)
print(params)
>>>print_params("root",1,2,3,4,5,6)
运行结果:
root
(1, 2, 3, 4, 5, 6)
注:参数前面的星号(*)将提供的所有的值都放在一个元组中
星号(*)收集余下的参数,若没有可收集的参数,将是一个空元组。
星号(*)不会收集关键字参数;若要收集关键字参数,可使用两个星号(**),这样得到的是一个字典而不是元组
def middle(x,*y,z,k):
print(x,y,z,k)
>>>middle(1,2,3,4,5,6,7,8) ---TypeError: middle() missing 2 required keyword-only arguments: 'z' and 'k'
注:星号(*)不会收集关键字参数;所以需要使用名称来指定后续参数
>>>middle(1,2,3,4,5,6,7,8,z=9,k=10) --->1 (2, 3, 4, 5, 6, 7, 8) 9 10
def params(**params):
print(params)
>>>params(x="root",y=2,z=3) --->{'x': 'root', 'y': 2, 'z': 3}
def par(x,y,z=3,*pospar,**keypar):
print(x,y,z)
print(pospar)
print(keypar)
>>>par(5,6,7,8,9,foo=1,bar=2)
5 6 7
(8, 9)
{'foo': 1, 'bar': 2}
>>>par(1,2)
1 2 3
()
{}
----------
同时储存多个:
def store(data,*full_name):
for full_name in full_name:
names=full_name.split()
if len(names)==2: names.insert(1,"")
lables = 'first','middle','last'
for lable,name in zip(lables,names):
people=lookup(data,lable,name)
if people:
people.append(full_name)
else:
data[lable][name] = [full_name]
>>>myname={}
>>>init(myname)
>>>store(myname,"webadmin 1","clouder 2 2","root 3 3 4")
作用域:(命名空间)
局部变量和全局变量:
局部变量:函数内部使用的变量
在函数中访问全局变量:
def combine(param):
print(param + external)
>>>external="HUB"
>>>combine("python") --->pythonHUB
这样访问全局变量有bug。若局部变量和全局变量同名,则无法直接访问全局变量,因为全局变量被遮住。
另:使用函数globals来访问全局变量
def combine(param):
print(param + globals()['param'])
>>>param ='python'
>>>combine(param) --->pythonpython
重新关联全局变量(使其指向新值):
在函数内部给变量赋值时,默认是局部变量,若要其是全局变量,使用global
def change_global():
global x
x=x+1
>>>x=2
>>>change_global()
>>>x --->3