• python基础教程(七)


    本章介绍如何将语句组织成函数,这样,可以告诉计算机如何做事。

     

    下面编写一小段代码计算婓波那契数列(前两个数的和是第三个数)

     
    fibs = [0,1]   # 定义一个列表,初始内容是0,1
    for i in range(8):  #循环8次
      fibs.append(fibs[-2]+fibs[-1])  #append在末尾追加一个数,这个是它前面两个数的和
    
    #输入
    >>> fibs
    #输出
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
     

    因为赋完值fibs已经有两个数了(0,1),所以循环8次之后,列表有10个数,两个数相加等于第3个数。

    是不是觉得应该由我们输入来控制打印多少个数?只用把程序小变一下就行了。

     
    fibs = [0,1]
    num = input('How many fibonacci numbers do you want?')
    for i in range(num-2):
        fibs.append(fibs[-2]+fibs[-1])
    print fibs
    #输入
    >>> 
    How many fibonacci numbers do you want?12
    #输出
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
     

    抽象

      抽象有可以节省很多工作,它使得计算机程序可以让人读懂的关键。计算机喜欢处理精确和具体的指令,但人不同,我们更喜欢丢进去一个东西,计算机就能反馈给我们想要的结果,而不是由我们一步一步的告诉它怎么做。因此,上面的代码抽象一点,应该是这样的:

     

    num = input('How many fibonacci numbers do you want?')
    print fibs

     

    那计算机怎么知道要怎么做?我们可以把处理的过程封装成函数,在我们每次用到时只用调用这个函数就可以了。

     

     

    创建函数

      函数是可以调用的,它执行某种行为并且返回一个值。内建的callable函数可以用来判断函数是否可调用:

     
    >>> import math
    >>> x = 1
    >>> y = math.sqrt
    >>> callable(x)  
    False
    >>> callable(y)
    True
     

    备注:callable 在python3.0中不再可用。

     

    那如何定义一个函数呢?使用def语句即可:

     
    >>> def hello(name):
        return 'hello.'+name+'!'
    #我们定义了一个hello函数,它会将输入的内容前面加“hello.”后面加“!”,并返回给用
    #户
    >>> print hello('world')
    hello.world!
    >>> print hello('zhangsan')
    hello.zhangsan!
     

     

    不错吧!再回过头去想想怎样把返回婓波那契数列定义成一个函数。如下:

     
    #定义fibs函数,用于婓波那契数列
    >>> def fibs(num):
        result = [0,1]
        for i in range(num-2):
            result.append(result[-2]+result[-1])
        return result
    
    #直接调用fibs函数
    >>> fibs(10)
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
    >>> fibs(15)
    [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
     

    局部变量

      当函数定义生命变量的时候,函数内所生命的变理只在其函数内有效,与函数外具有相同名称的其他变量没有任何关系

     
    #局部变量
    def func(x):
        print 'x is',x
        x =2    # x=2只在func函数内其作用
        print 'Changed local x to',x
        
    x = 50
    func(x)   #func函数并没有返回数据过来。
    print 'x is still',x
    
    #输出
    >>> 
    x is 50
    Changed local x to 2
    x is still 50
     

    global 语句

      如果想把一个变量声名为 全局的,则可以使用global语句。

     
    def func():
        global x
    
        print 'x is',x
        x = 2
        print 'Changed local x to',x
    
    x =50
    func()
    print 'Value of x is ',x
    #输出
    x is 50
    Changed local x to 2
    Value of x is  2
     

    global 语句被用来生命x 是全局,因此在执行完func函数后,x的值已经发生了改变,并且作用于整个程序,因此最后的输入结果为2

     

     

    默认参数

      对于一些参数,我们希望它的一些参数是可选的,如果用户不想要为这些参数提供值的话,这些参数就使用默认值。

     
    def say(message,times=1):
        print message*times
    
    say('Hello')
    say('World',5)
    #输出
    >>> 
    Hello
    WorldWorldWorldWorldWorld
     

     

    定义的say函数的第两个参数就是可选的,默认为times=1;也就是将两个参数相乘输出。

     

    注意:只有在形参表末尾的那些参数可以有默认参数,如def func(a=5,b) 是无效的。

     

     

     

    关键参数

      如果某个函数有许多参数,而我们只想指定其中的一部分,那么可以使用名字(关键字)而不是位置来给函数指定实参。----这被称作 关键参数

     
    def func(a,b=5,c=10):
        print 'a is',a, 'and b is',b,'and c is',c
    
    func(3,7)
    func(24,c=32)
    func(c=23,a=14)
    
    #输出 >>> a is 3 and b is 7 and c is 10 a is 24 and b is 5 and c is 32 a is 14 and b is 5 and c is 23
     

    这样做,我就不必担心参数的顺序,使用函数变得更加简单。假设其它函数都有默认值,我们可以只给自己想要的参数赋值。

     

     

    递归:

      有用的递归函数... 等等,什么是无用的递归?先来看一个函数的定义:

    def recursion()
        return recursion()

     

    显然,它什么也干不了,程序的执行不断申请内存,直接内存耗尽,程序崩溃。

    接着,有用的递归函数包含以下几个部分:

    • 当函数直接返回值时有基本实例(最小可能性问题)
    • 递归实例,包括一个或者多个问题最小部分的递归调用。

     

    下面通过递归函数来计算一个n的阶,n*(n-1)*(n-2)*....*1

    def f(n):
        if n == 1:
           return 1
        else:
            return n*f(n-1)


    Life is not what you have gained but what you have done!
  • 相关阅读:
    数字图像处理的Matlab实现(2)—MATLAB基础
    数字图像处理的Matlab实现(1)—绪论
    统计分析与R软件-chapter2-6
    统计分析与R软件-chapter2-5
    统计分析与R软件-chapter2-3
    题目1143:Primary Arithmetic
    剑指OFFER之翻转单词顺序
    剑指OFFER之把数组排成最小的数
    剑指OFFER之丑数
    最大的两个数
  • 原文地址:https://www.cnblogs.com/cmt110/p/7464726.html
Copyright © 2020-2023  润新知