range函数
>>> range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Python的字典数据结构很特别,书上有,用的时候再说吧,不在这写了。
函数打印斐波那契数列,缩进形式编辑器自动,不是如下显示,
>>> def fib(n):
"Print a Fibonacci series up to n"
a,b=0,1
while b<n:
print b
a,b=b,a+b
>>> fib(2000)
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
在print语句后面加‘,’打印方式就不同了。
>>> def fib(n):
"Print a Fibonacci series up to n"
a,b=0,1
while b<n:
print b,
a,b=b,a+b
>>> fib(2000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597
Python在执行函数的时候会产生一个目前(local)的符号表(system table),用来记录函数中所有的local变量。目前觉得函数传参是传值。
当定义函数的时候,也就是在目前的system table里定义了这个函数的名称。对直译器来说,这个函数名称的数据类型是一个用户自定义的函数。
Python的procedure指的是没有返回值的函数。
>>> def fib(n):
"return a Fibonacci series up to n"
result=[]
a,b=0,1
while b<n:
result.append(b)
a,b=b,a+b
return result
>>> f=fib(100)
>>> f
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
这里的缩进很有问题,程序源码和运行结果对着呢。
>>> def askok(prompt,retries=4,complaint="yes or no"):
while 1:
ok=raw_input(prompt)
if ok in('y','ye','yes'):return 1
if ok in ('n','no'):return 0
retries=retries-1
if retries<0:raise IOError,'refusenik user'
print complaint
>>> askok('Do you really want to leave')
Do you really want to leavey
1
>>> askok('you really want to leave?',2)
you really want to leave?o
yes or no
you really want to leave?n
0
>>>
以上是定义了一个函数 ,用了prompt方法,接受输入,不过Python的函数参数居然可以不用按照顺序,这让人很惊讶。很神奇。
很抱歉,我很失误,前面的字符串是传给prompt方法的,后面的2可串可不传,不传就默认是4,参数顺序不能打乱。
>>> i=5
>>> def f(arg=i):print arg
>>> i=6
>>> f()
5
>>>
这段函数更有意思了,在函数定义时将i的值传给了函数,再改变i的值,函数参数值不变,这就是传值非传址的结果吧。
书上说传参是list或者dictionary类型时,问题就复杂了,那么咱们来看看吧。
>>> def f(a,l=[]):
l.append(a)
return l
>>> print f(1)
[1]
>>> print f(2)
[1, 2]
>>> print f(3)
[1, 2, 3]
>>>
以上就是将参数传给list l,顺便说一声,我看的书事电子版pdf,很模糊,调了好多次,
>>> def f(a,l=None):
if l is None:
l=[]
l.append(a)
return l
>>> f(1)
[1]
>>> f(2)
[2]
>>> f(3)
[3]
>>>
跟上次的程序区别就是l赋了初值,每次都判断。程序不难,主要记住Python的灵活,别让它的灵活带来麻烦。今天就这些吧。