def fib(num):
'斐波那契数列'
fibs = [0,1]
for i in range(num):
fibs.append(fibs[-2]+fibs[-1])
return fibs
抽象
--独立的函数定义
创建函数
记录函数
--在函数的开头写下字符串,它就会作为函数的一部分进行存储,称为“文档字符串”。
def fib(num):
'斐波那契数列'
#...
无“返回值”的函数返回甚?
--返回了None
>>> def func():
return
>>> x = func()
>>> print x
None
参数参数参数
--形参vs实参
--能否改变参数?
python倒是没有什么按值传递、按址传递,和java一样,统统都是引用(在对象上)。参数存储在局部作用域(local scope)内,字符串、数字、元组
是不可变的,即无法被修改(只能是被新的值覆盖),所以这仨作实参传入函数后是不能被修改的。如果可变的数据结构例如列表、字典啥的作实参传
入,一旦函数内对这些可变数据结构修改,在函数外,函数内的修改同样是有效的——这个就要说到多个变量同时引用同一个对象了
>>> x = dict(name = 'liu',age = 21)
>>> y = x
>>> y['age'] = 22
>>> x
{'age': 22, 'name': 'liu'}
def test(x,y,z):
return x+1,y+1,z+1
x = 1
y = 2
z = 3
list_ = test(x,y,z)
print list(list_)
关键字参数和默认值
--我们之前用的参数都叫“位置参数”,它们的位置很重要,重要到比名字还重要。
--关键字参数 函数的使用,定义还原来的定义方式,只不过需要把函数形参名字记住了...
>>> def hello(greeting ,name):
print greeting,name
>>> hello(name = 'liuliuliu',greeting = 'hello')
hello liuliuliu
def hello(greeting = 'Hello',name = 'liu'):
print greeting,name
收集参数
--使得函数可以接收任意数量的参数
def print_params(*params):
print params
>>> def print_params(**params):
print params
>>> print_params(greeting = 'hello',name = 'liu')
{'greeting': 'hello', 'name': 'liu'}
反转过程
--和上面收集多余位置的参数类似,只不过上面是将多余位置的参数包装成元组或者字典,而这个讲的是将元组或者字典进行解包装。
def with_twostars(**params):
print params['name']
def with_nostar(param2):
print param2['name']
#调用函数方法
var1={'name':'jinglingshu','sex':'female'}
with_twostars(**var1) #实参需要进行反转
with_nostar(var1)
作用域
--每个变量都有其有效的范围,这个范围就是作用域(命名空间)。
--在不同的作用域中发生变量重名的问题时,在哪个作用域中,优先默认使用哪个变量。但是在某个函数的命名空间中,想使用一个已经在该作用域声
明过的变量的同名全局变量:
x = 1
def func():
x = 2
y = 3
x = x + globals()['x']
print x
global x
def plus(x):
def plusplus(y):
return x+y
return plusplus
递归
--根据个人的思考,我总结的递归需要注意的两个问题
1.递归应该是由大到小的再到大的过程,所以就像剥洋葱一样,一次剥几层洋葱皮是一个需要考虑的问题。
2.递归的终止条件,啥时候该结束了一定需要一个这样的结束,剥到多少层才是头?
附上前两天写的汉诺塔实现
#将n号盘子从from_挪到to_,中转为temp_
def hanoi(n,from_,to_,temp_):
'''
1.将前n-1个盘子从A挪到B,C为中转
2.将第n个盘子从A挪到C,B为中转
3.将前n-1个盘子从B挪到C,A为中转
'''
if n == 1:
print 'Move',n,'from',from_,'to',to_
return
hanoi(n-1,from_,temp_,to_)
print 'Move',n,'from',from_,'to',to_
hanoi(n-1,temp_,to_,from_)
hanoi(int(raw_input()),'A','C','B')