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

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
2223 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或负数。

时间: 2024-10-09 18:32:21

一些代码 I (斐波那契、for...else...、try和return、classmethod、统计个数)的相关文章

python代码实现斐波那契数列数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列",指的是这样一个数列:1.1.2.3.5.8.13.21.34.--在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*) 用生成器实现斐波那契数列代码: def fibonacci(n): first = 0 se

斐波那契查找算法完整C代码

/* 斐波那契查找法 */ #include <stdio.h> #include <stdlib.h> int Fib( int k ) { if( 1 == k || 2 == k ) return 1; else return Fib(k-1)+Fib(k-2); } int FibSearch( int *a, int n, int key ) { int k = 1; int nFib; int *b; int low, mid, high; while( Fib(k)

数据结构之---C语言实现斐波那契查找

斐波那契查找的核心思想是: 1)当key=a[mid]时,查找成功: 2)当key<a[mid]时,新的查找范围是第low个到第mid-1个,此时范围个数为F[k-1] - 1个,即数组左边的长度,所以要在[low, F[k - 1] - 1]范围内查找: 3)当key>a[mid]时,新的查找范围是第mid+1个到第high个,此时范围个数为F[k-2] - 1个,即数组右边的长度,所以要在[F[k - 2] - 1]范围内查找. 代码: //斐波那契查找 //杨鑫 #include <

算法导论 第20章 斐波那契堆

一.概念 1.斐波那契堆 斐波那契堆是可合并堆 在不涉及删除的操作(除去EXTRACT和DELETE)中,操作仅需O(1)的平摊运行时间 当EXTRACT和DELETE的操作数目较小时斐波那契堆能得到较好的运行效率. 斐波那契堆不能有效地支持SEARCH操作 用于解决诸如最小生成树和寻找单源最短路径等问题的快速算法都要用到斐波那契堆. 2.斐波那契堆的结构 斐波那契堆由一组最小堆构成,这些最小堆是有根的无序树. 结点结构: key: 关键字,作为排序.判断结点大小的标准 left, right:

斐波那契堆(一)之 图文解析 和 C语言的实现

概要 本章介绍斐波那契堆.和以往一样,本文会先对斐波那契堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文章有错误或不足的地方,请不吝指出! 目录1. 斐波那契堆的介绍2. 斐波那契堆的基本操作3. 斐波那契堆的C实现(完整源码)4. 斐波那契堆的C测试程序 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3659060.html 更多内容:数据结

递归求斐波那契数

斐波那契数列主要思想是利用前两个数求和算出下一个数,利用函数的递归思想,F(n)=F(n-1)+F(n-2),F(n)先搁置,计算F(n-1),要计算F(n-1)就要先计算F(n-2)和F(n-3),依次递归下去,直到第一第二位数,这两个数是已知的,这样就可以回去一层一层的算出F(3).F(4).F(5)....F(n-2).F(n-1),最后得到F(n)的值. 1 using System; 2 using System.Collections.Generic; 3 using System.

数据结构(六)查找---有序表查找(三种查找方式:折半,插值,斐波拉契查找)

前提 有序表查找要求我们的数据是有序的,是排序好的,我们只需要进行查找即可 我们下面将介绍折半查找(二分查找),插值查找,斐波那契查找 一:折半查找 (一)定义 二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. (二)查找过程 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关

关于斐波那契数列和递归

递归有三个基本点: 1.递归总有一个最简单的情况.即边界或者跳出递归的条件语句: 2.递归总是尝试解决一个规模更小的问题: 3.递归尝试解决的父问题和子问题之间不因该有交集: 以下是几个递归代码://斐波那契数列 import edu.princeton.cs.algs4.StdOut; public class No_1_1_19 { public static void main(String[] args) { for(int n=0;n<10;n++) { StdOut.println(

9.求斐波那契Fibonacci数列通项

(1)递归实现: #include<iostream>using namespace std;int Fibonacci(int); int main(){    int n;    cout<<"please input an number n: "<<endl;    cin>>n; for(int i=1;i<=n;i++)    {        cout<<Fibonacci(i)<<endl; 

python3 求斐波那契数列(Fibonacci sequence)

输出斐波那契数列的前多少个数. 利用函数 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan # ----斐波那契数列(Fibonacci sequence)----- def check_num(number:str): ''' 对输入的字符串检查,正整数,返回Ture,否则返回False :param number: 输入的字符串 :return: 符合要求,返回Ture,不符合返回False ''' # 输入不