一些代码 I (斐波那契for...else...try和returnclassmethod统计个数)

Posted 刘[小]倩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些代码 I (斐波那契for...else...try和returnclassmethod统计个数)相关的知识,希望对你有一定的参考价值。

1. 斐波那契

from itertools import islice
def fib():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a+b

print list(islice(fib(), 5))    # [0, 1, 1, 2, 3]

 2. for……else……用法(以查找素数为例)

正常版本:

1 def print_prime(n):
2     for i in xrange(2, n):
3         found = True
4         for j in xrange(2, i):
5             if i % j == 0:
6                 found = False
7                 break
8         if found:
9             print %d is a prime number %i

for……else……版本

1 def print_prime(n):
2     for i in xrange(2, n):
3         for j in xrange(2, i):
4             if i % j == 0:
5                 break
6         else:
7             print %d is a prime number % i

当循环‘自然’终结(循环条件为假)时,else从句会被执行一次,而当循环是由break语句中断时,else子句就不被执行。

与for语句相似,while语句中的else子句的语意是一样的:else块在循环正常结束和循环条件不成立时被执行。

try...except...else...finally...语句中,else在没有异常时被执行。

3. try和return

 1 def ReturnTest(a):                                                          
 2     try:
 3         if a <= 0:
 4             raise ValueError(data can not be negative)
 5         else:
 6             return a
 7     except ValueError as e:
 8         print e
 9     finally:
10         print the end
11         return -1
12   
13 print ReturnTest(0)    # -1
14 print ReturnTest(2)    #-1

ReturnTest(0)返回-1,不做解释。

ReturnTest(2)返回-1,是因为a>0,会执行else分值,但由于存在finally语句,在执行else语句的return a 语句之前会先执行finally中的语句,此时由于finally语句中有return,故程序直接返回了,所以永远不执行else语句中的return。

在实际应用程序开发过程中,并不推荐在finally中使用return语句进行返回。

4. @classmethod

 1 class Fruit(object):
 2     total = 0
 3     
 4     @classmethod
 5     def print_total(cls):
 6         print cls.total
 7         
 8     @classmethod
 9     def set(cls, value):
10         cls.total = value
11         
12 class Apple(Fruit):
13     pass
14 
15 class Orange(Fruit):
16     pass
17 
18 
19 Apple.set(200) 20 Apple.print_total() # 200 非classmethod不可这样调用,要先实例化 21 22
23 Orange.set(300) 24 Orange.print_total() # 300

普通继承是需要子类重构父类的方法。@classmethod被调用时隐形传入的参数为该对象所对应的类。

5. 统计个数

1 from collections import Counter
2 
3 data = [a, 2, 2, 4, 5, 2, b, 4, 7, a, 5, d, a, z]
4 print Counter(data)
5 # Counter({‘a‘: 3, 4: 2, 5: 2, ‘2‘: 2, 2: 1, ‘b‘: 1, 7: 1, ‘z‘: 1, ‘d‘: 1})

Counter主要用来统计散列对象,提供了3中不同的初始化方法:

1 Counter(success)                         # 可迭代对象
2 Counter(s=3, c=2, e=1, u=1)          # 关键字参数
3 Counter({s:3, c:2, u:1, e:1})    # 字典

使用elements()方法来获取Counter中的key值

1 list(Counter(data).elements())
2 # [‘a‘, ‘a‘, ‘a‘, 2, ‘b‘, 4, 4, 5, 5, 7, ‘2‘, ‘2‘, ‘z‘, ‘d‘]

使用most_common(N)方法找出前N个出现频率最高的元素以及他们对应的次数。

1 Counter(data).most_common(2) # [(‘a‘, 3), (4, 2)]

当访问元素不在时,默认返回0,而不是抛出KeyError异常。

1 (Counter(data))[y]    # 0

使用update()方法用于实现计数器对象总元素统计相加。

使用subtract()方法实现计数器对象中元素统计值相见,输入和输出的统计值允许为0或负数。

以上是关于一些代码 I (斐波那契for...else...try和returnclassmethod统计个数)的主要内容,如果未能解决你的问题,请参考以下文章

python递归求斐波那契数列前10项

谁能帮我用JAVA编写一个斐波那契数列,用eclipse实现,代码不对不采纳!

斐波那契数列小结

,c语言:利用数组求斐波那契数列的前20项

斐波那契数列

用递归和非递归方法求解斐波那契数列