抽象和结构


本章将会介绍如何让将语句组织成函数,还会详细介绍参数(parameter)和作用域(scope)的概念,以及递归的概念及其在程序中的用途。

创建函数


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

>>> import math
>>> x =
>>> y = math.sqrt
>>> callable(x)
False
>>> callable(y)
True#py 3.0中,callable不再可用,

创建一个函数:

>>> def fibs(num):
    result = [0,1]
    for i in range(num-2):
        result.append(result[-2]+result[-1])
    return result

>>> fibs(20)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181]
>>> fibs(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
  1. 记录函数
    如果想要给函数写文档,让后面使用该函数的人能理解的话,可以加入注释,或者就是直接写上字符串(也叫做文档字符串),示例如下:

    >>> def square(x):
        'log or description'
        return x*x
    
    >>> square.__doc__
    'log or description'
    >>> square(3)
    9

参数魔法


  1. 值从哪里来
    保证函数在被提供给可接受参数的时候能正常工作就行。
    写在def 语句中函数名后面的变量通常叫做函数的形式参数,而调用函数的时候提供的值是实际参数,或者称为参数。
  2. 参数能改变吗
  3. 关键字参数和默认值
    目前为止我们所是用的参数都叫做:位置参数
    使用参数名提供的参数叫做:关键字参数,它的主要作用在于可以明确每个参数的作用
    >>> def hello_test(greeting='Hello',name='Python'):
        print '%s,%s!'%(greeting,name)
    
    >>> hello_test()
    Hello,Python!
    >>> hello_test('test')
    test,Python!
    >>> hello_test('python','powerful')
    python,powerful!
  4. 收集参数
     >>> def print_params(x,y,z=3,*pospar,**keypar):
         print x,y,z
         print pospar
         print keypar
    
     >>> print_params(1,2,3,7,8,9,foo=2,foo2='python')
     1 2 3
     (7, 8, 9)
     {'foo': 2, 'foo2': 'python'}
     >>> print_params(2,3)
     2 3 3
     ()
     {}

    *号的意思就是“收集其余的位置参数”,一个星号的参数存储在一个tuple中,两个星号的参数存储在一个dict中。

  5. 反转过程
    >>> def with_stars(**kwds):
        print kwds['name'],'is',kwds['age'],'years old'
    
    >>> def without_stars(**kwds):
        print kwds['name'],'is',kwds['age'],'years old'
    
    >>> args= {'name':'python','age':28}
    
    >>> with_stars(**args)
    python is 28 years old
    
    >>> without_stars(**args)
    python is 28 years old

    在with_stars中,定义和调用函数时都使用了星号,而在without_stars中,两处都没有使用,但得到了相同的效果。
    所以星号只在定义函数(允许使用不定数目的参数)或者调用(“分割”字典合作和序列)时才有用。

  6. 练习使用参数
    def story(**kwds):
        return 'Once upon a time, there was a %(job)s called %(name)s.'%kwds
    
    def power(x,y,*others):
        if others:
            print 'Received redundant parameters:',others
        return pow(x,y)
    
    def interval(start,stop=None,step=1):
        'Imitates range() for step >0'
        if stop is None:
            start,stop = 0,start
        result = []
        i =start
        while i<stop:
            result.append(i)
            i +=step
        return result

    运行结果如下:

    >>> print story(job='King',name='Gumby')
    Once upon a time, there was a King called Gumby.>>> print story(name='Sir Robin',job='brave knight')
    Once upon a time, there was a brave knight called Sir Robin.
    >>> params = {'job':'language','name':'Python'}
    >>> print story(**params)
    Once upon a time, there was a language called Python.
    >>> del params['job']
    >>> print story(job='stroke of genius',**params)
    Once upon a time, there was a stroke of genius called Python.

    >>> params = (5,)*2
      >>> power(*params)
      3125
      >>> power(3,3,'Hello, python')
      Received redundant parameters: ('Hello, python',)
      27
      >>> interval(10)
      [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      >>> interval(1,5)
      [1, 2, 3, 4]
      >>> interval(3,12,4)
      [3, 7, 11]
      >>> power(*interval(3,7))
      #interval(3,7)返回了(3,4,5,6),然后单星号分裂成元组(3,4)和(5,6),所以执行了3的4次方,而(5,6)则是返回的Others
      Received redundant parameters: (5, 6)
      81

     

作用域


  1. 函数内的变量被称为局部变量(local variable)
    函数内部引用全局变量:

    >>> def combine(parameter):
        print parameter + globals()['parameter']
    
    >>> parameter = "berry"
    >>> combine('Shrub')
    Shrubberry
  2. 重新绑定全局变量
    >>> x = 1
    >>> def change_global():
        global x
        x = x+1
        return x
    
    >>> change_global()
    2
    >>> x
    2

递归


  1. 递归,简单来说就是引用自身的意思
  2. 有用的递归函数包含以下几部分:
    ①当函数直接返回值时有基本实例(最小可能性问题);
    ②递归实例,包括一个或者多个问题最小部分的递归调用
  3. 递归实例:阶乘和幂
    阶乘实例:
    >>> def factorial(n):
        if n == 1:
            return 1
        else:
            return n*factorial(n-1)
    
    >>> factorial(5)
    120

    求幂实例:

    >>> def power(x,n):
        if n == 0:
            return 1
        else:
            return x*power(x,n-1)
    
    >>> power(2,5)
    32

《Python基础教程(第二版)》学习笔记 -> 第六章 抽象的更多相关文章

  1. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第10章 | 充电时刻

    第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...

  2. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第04章 | 字典

    第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...

  3. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第12章 | 图形用户界面

    Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ ...

  4. &lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第11章 | 文件和素材

    打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...

  5. python cookbook第三版学习笔记十六:抽象基类

    假设一个工程中有多个类,每个类都通过__init__来初始化参数.但是可能有很多高度重复且样式相同的__init__.为了减少代码.我们可以将初始化数据结构的步骤归纳到一个单独的__init__函数中 ...

  6. Jquery基础教程第二版学习记录

    本文仅为个人jquery基础的学习,简单的记录以备忘. 在线手册:http://www.php100.com/manual/jquery/第一章:jquery入门基础jquery知识:jquery能做 ...

  7. 第二章、元组和列表(python基础教程第二版 )

    最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...

  8. python基础教程第二版 第一章

    1.模块导入python以增强其功能的扩展:三种方式实现 (1). >>> Import math >>> math.floor(32.9) 32.0 #按照 模块 ...

  9. &lt;&lt;Python基础课程&gt;&gt;学习笔记 | 文章13章 | 数据库支持

    备注:本章介绍了比较简单,只是比较使用样品,主要假设是把握连接,利用数据库.和SQLite做演示样本 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,如今已经 ...

随机推荐

  1. EF4.1之复杂类型

    首先我们生成两张对应表: public class Client { public int ClientID { set; get; } public string ClientName { set; ...

  2. Code for the Homework2 改进

    1. 实现了到指定点各个关节的转角计算(多解性),并且所求解满足各个关节的最大角和最小角的限制条件. 2. 对方向向量进行了单位化,保证任意大小的向量都行 #include<iostream&g ...

  3. iOS基本网络请求

    常见的网络请求有同步GET, 同步POST, 异步GET, 异步POST. GET请求和POST请求的区别: 1. GET请求的接口会包含参数部分,参数会作为网址的一部分,服务器地址与参数之间通过 ? ...

  4. Extjs-4.2.1(一)——编辑 hello word

    前言:在搭建好环境后,就可以利用Extjs进行开发了. 一.在项目中拷贝相关的Extjs文件,如下图: 注意:不需要整个Ext开发包全部导入,这样很容易造成eclipse卡死,因为eclipse会自动 ...

  5. AxureRP制作Tab标签

    1.添加动态Panel 2.双击进入编辑动态Panel 3.点击一个面板状态,编辑全部状态 4.选择虚线框,画出两个矩形图,一大一小:

  6. URAL 1260 Nudnik Photographer(递推)

    题目链接 题意 : 给你1到n这n个数,排成一排,然后1放在左边最开始,剩下的数进行排列,要求排列出来的数列必须满足任何两个相邻的数之间的差不能超过2,问你有多少种排列 思路 : 对于dp[n], n ...

  7. 扩展DJANGO的LISTVIEW

    不用MODEL,不用QUERYSET,而用get_queryset方法来扩展LISTVIEW, 从而实现特定过滤或搜索功能. class DVListView(ListView): template_ ...

  8. C#基础精华03(常用类库StringBuilder,List<T>泛型集合,Dictionary<K , V> 键值对集合,装箱拆箱)

    常用类库StringBuilder StringBuilder高效的字符串操作 当大量进行字符串操作的时候,比如,很多次的字符串的拼接操作. String 对象是不可变的. 每次使用 System. ...

  9. Microsoft SQL Server 2012 数据库安装图解教程

    本文部分引用以下文章: SQL Server 2012 安装图解教程(附sql2012下载地址)_MsSql_脚本之家 http://www.jb51.net/article/36049.htm SQ ...

  10. Python之函数篇

    函数形参 函数取得的参数是你提供给函数的值,这样函数就可以利用这些值 做 一些事情.这些参数就像变量一样,只不过它们的值是在我们调用函数的时候定义的,而非在函数本身内赋值. 参数在函数定义的圆括号对内 ...