Python中,函数返回值通过return语句,但是返回类型不像C++那样需要定义其类型;同样输入形参只需要写名字就行了,不需要定义类型。在Python中,函数内为参数赋值不会改变外部任何变量(按值传递)。在Python里面的作用域概念,包括局部作用域和全局作用域。
(1)要改变值有两种方式:一是通过返回值;二是将要改变的值封装到列表中。
#方法1
foo = 10
def inc(x):return x + 1;#作为返回值返回
foo1 = inc(foo)
print(foo)
11
#方法2
def inc(x):x[0]+=1
foo=[10] #将值放到列表中
inc(foo)
print (foo)
[11]
#可以改变列表里面的内容,且能被保存下来
def initDict(storage):
storage.append("seu")
storage.append('njust')
return
nameDict = []
initDict(nameDict)
print (nameDict)
['seu', 'njust']
#但是如果改变列表变量本身不行
def initDict(storage):
storage = [] #该句话改变了storage,所以导致最后的输出结果为[]
storage.append("seu")
storage.append('njust')
return
nameDict = []
initDict(nameDict)
print (nameDict)
[]
(2)关键字参数和默认值
使用参数名提供的参数叫做关键字参数,主要作用是明确每个参数的作用,使调用者更清楚。下面#2,#3用了关键字参数
def hello(greet,name):
print ('%s,%s!' %(greet,name))
return
hello('Hello','World')#1 这三个条语句完全一样
hello(greet='Hello',name='World') #2 关键字参数,结果和上一样
hello(name='World',greet='Hello')#3 关键字参数,结果和上一样
同样,还可以给参数赋默认值,与关键字参数结合使用。
#给函数默认参数
def hello_2(name='world',greet='Hello'):
print ('%s,%s!' %(greet,name))
return
hello_2()
hello_2('world')
hello_2('wrold','Hello')
hello_2(greet='Hello')#这样也可以
(3)收集参数
参数前加一个星号表示搜集其余的位置参数。如果不提供任何供搜集的元素,搜集参数将为空元组。
def print_para(title,*para):
print (title+':')
print (para)
return
print_para('params',2,3,4) #后面的几个参数被para所搜集
params:
(2, 3, 4)
“**”表示处理关键字参数的“搜集”操作,搜集成字典。
#范例1
def print_para(**paras):
print (paras)
return
print_para(x='dfs',y=2,z=3)
{'y': 2, 'x': 'dfs', 'z': 3}
#范例2
def print_para(x,y,z,*pos,**paras):
print (x,y,z)
print (pos)
print (paras)
return
print_para(1,2,3,4,6,7,foo=1,bar='lsj')
1 2 3
(4, 6, 7)
{'foo': 1, 'bar': 'lsj'}
(4)反转过程
不是搜集参数,而是分配它们在“另一端”。使用*运算符。
#元组反转过程
def add(x,y):return x+y
para = (1,2)
print (add(*para))#反转过程
3
#字典的反转过程
def Hello(name,greet):
print (name+',',greet)
return
params = {'name': 'lsj','greet':'Hello'}
Hello(**params) #反转过程
lsj, Hello
(5)递归问题
函数自身调用自身。
def calSum(i):
if(i==0):
return 0
else:
return i + calSum(i-1)
for i in range(1,20):
print (calSum(i))