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))