Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1779205
  • 博文数量: 276
  • 博客积分: 1574
  • 博客等级: 上尉
  • 技术积分: 2894
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-26 23:23
个人简介

生活的美妙在于,不知道一下秒是惊艳还是伤神,时光流转,珍惜现在的拥有的时光

文章分类

全部博文(276)

文章存档

2017年(17)

2016年(131)

2015年(63)

2013年(2)

2012年(32)

2011年(31)

分类: Python/Ruby

2016-03-17 00:12:44

Python基础教程第26:抽象

http://blog.chinaunix.net/uid-21142030-id-5676171.html

抽象与结构,事件流程

创建函数是组织程序的关键.def

使用函数改变数据结构(比如list,dict)是将程序抽象化的好方法.

函数定义中的参数是形参

函数调用中的参数是实参

函数通过参数获取值.

函数内部作用域修改参数值不会影响外部值.

抽象的要点是隐藏更新时的烦琐细节.

函数只能修改参数对象本身.

一个将姓名查询添加程序

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2.     #-*- coding:utf-8 -*-
  3.     '''
  4.     斐波那契数列:初始为0,1,列表中的一个数字是前两个元素的和
  5.     '''
  6.     num=int(raw_input('请输入要计算的斐波那契数列的数目:'))
  7.     def fibs(num):
  8.         '文档字符串 fibs.__doc__查看'
  9.         result=[0,1]
  10.         for i in range(num-2):
  11.             result.append(result[-2]+result[-1])
  12.         return result
  13.     print fibs(num)
  14.     #初始化数据库
  15.     def initdata(data):
  16.         data['first']={}
  17.         data['middle']={}
  18.         data['last']={}
  19.     storage={}
  20.     initdata(storage)
  21.     me='eric lei wang'
  22.     you='talen tf HAO'
  23.     her='mei liu'
  24.     #查询方法
  25.     def lookup(database,lable,name):
  26.         result=database[lable].get(name)
  27.         return result
  28.     #录入数据库
  29.     def store(database,username):#把用户存入数据库中
  30.         #1.分割用户名
  31.         names=username.split()
  32.         lables=['first','middle','last']
  33.         if len(names)==2:
  34.             names.insert(1,'')
  35.         for lable,name in zip(lables,names):
  36.             #判断是否已经存在
  37.             people=lookup(database,lable,name)
  38.             if people:
  39.                 #如果列表中有值,直接添加
  40.                 people.append(username)
  41.             else:
  42.                 #如果列表没有值,新创建,注意,这里生成的是列表.
  43.                 database[lable][name]=[username]
  44.     store(storage,me)
  45.     store(storage,me)
  46.     store(storage,you)
  47.     store(storage,her)
  48.     print storage
关键字参数和默认值


位置参数与关键字参数是可以联合使用的.除非完全清楚程序的功能和参数的意义,否则应该避免混合使用.

使用*收集任意多的参数,返回数组.

使用**收集任意多的关键字参数,返回字典.

修改一下上面的程序,支持多个名字同时录入

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2.     #-*- coding:utf-8 -*-
  3.     '''
  4.     斐波那契数列:初始为0,1,列表中的一个数字是前两个元素的和
  5.     '''
  6.     num=int(raw_input('请输入要计算的斐波那契数列的数目:'))
  7.     def fibs(num):
  8.         '文档字符串 fibs.__doc__查看'
  9.         result=[0,1]
  10.         for i in range(num-2):
  11.             result.append(result[-2]+result[-1])
  12.         return result
  13.     print fibs(num)
  14.     #初始化数据库
  15.     def initdata(data):
  16.         data['first']={}
  17.         data['middle']={}
  18.         data['last']={}
  19.     storage={}
  20.     initdata(storage)
  21.     me='eric lei wang'
  22.     you='talen tf HAO'
  23.     her='mei liu'
  24.     #查询方法
  25.     def lookup(database,lable,name):
  26.         result=database[lable].get(name)
  27.         return result
  28.     #录入数据库
  29.     def store(database,*usernames):#把用户存入数据库中
  30.         #1.分割用户名
  31.         for username in usernames:
  32.             names=username.split()
  33.             lables=['first','middle','last']
  34.             if len(names)==2:
  35.                 names.insert(1,'')
  36.             for lable,name in zip(lables,names):
  37.                 #判断是否已经存在
  38.                 people=lookup(database,lable,name)
  39.                 if people:
  40.                     #如果列表中有值,直接添加
  41.                     people.append(username)
  42.                 else:
  43.                     #如果列表没有值,新创建,注意,这里生成的是列表.
  44.                     database[lable][name]=[username]
  45.     store(storage,me,you)
  46.     store(storage,me)
  47.     store(storage,you)
  48.     store(storage,her)
  49.     print storage

点击(此处)折叠或打开

  1. 请输入要计算的斐波那契数列的数目:11
  2.     [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
  3.     {'middle': {'tf': ['talen tf HAO', 'talen tf HAO'], 'lei': ['eric lei wang', 'eric lei wang'], '': ['mei liu']}, 'last': {'liu': ['mei liu'], 'wang': ['eric lei wang', 'eric lei wang'], 'HAO': ['talen tf HAO', 'talen tf HAO']}, 'first': {'mei': ['mei liu'], 'eric': ['eric lei wang', 'eric lei wang'], 'talen': ['talen tf HAO', 'talen tf HAO']}}

点击(此处)折叠或打开

  1. 参数练习
  2.     def story(**kwds):
  3.         return 'Once upon a time,there was a %(job)s called %(name)s.' % kwds
  4.     def power(x,y,*others):
  5.         if others:
  6.             print 'Received redundant parameters:',others
  7.         return pow(x,y)
  8.     def interval(start, stop=None,step=1):
  9.         '打印指定范围的数字'
  10.         if stop is None:
  11.             start,stop=0,start
  12.         result=[]
  13.         while start < stop:
  14.             result.append(start)
  15.             start+=step
  16.         return result
  17.     print story(job='ttserver',name='workhard')
  18.     print story(name='mile',job='assssfsffa')
  19.     params={'job':'job1','name':'nameserver'}
  20.     print story(**params)
  21.     print power(2,3)
  22.     print power(y=4,x=5)
  23.     params=(5,)*2
  24.     print power(*params)
  25.     print power(3,3,'talen')
  26.     print interval(10)
  27.     print interval(1,5)
  28.     print interval(3,12,4)
  29.     print power(*interval(3,7))

点击(此处)折叠或打开

  1. Once upon a time,there was a ttserver called workhard. 
  2.     Once upon a time,there was a assssfsffa called mile. 
  3.     Once upon a time,there was a job1 called nameserver. 
  4.     8
  5.     625
  6.     3125
  7.     Received redundant parameters: ('talen',) 
  8.     27
  9.     [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
  10.     [1, 2, 3, 4] 
  11.     [3, 7, 11] 
  12.     Received redundant parameters: (5, 6) 
  13.     81

嵌套函数返回内嵌套在内的函数是带着返回的函数的环境和相关局部变量一起返回的,所以可以调用外部函数时附加变量值给返回的函数.
def A(a):
    def B(b):
        a+b
    return B
A(a)(b)或
C=A(a)
C(b)
C是A的返回函数即C=B


递归
函数调用自身的行为就是递归
递归必须以最小可能性为结束

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3. def factorial(n):
  4.     result=n
  5.     for i in range(1,n):
  6.         result*=i
  7.         print result
  8.     return result
  9. print('最终结果是%s' %factorial(5))

  10. def factorial2(n):
  11.     if n == 1 :
  12.         return 1
  13.     else:
  14.         return n*factorial2(n-1)
  15. print('阶乘的结果是%s' % factorial2(6))

  16. def power(x,n):
  17.     result=x
  18.     if n == 0:
  19.         return 1
  20.     else:
  21.         return result * power(x,n-1)
  22. print(power(3,3))

点击(此处)折叠或打开

  1. 5
  2. 10
  3. 30
  4. 120
  5. 最终结果是120
  6. 阶乘的结果是720
  7. 27
二元查找
如果不自己写,标准库有bisect模块可以有效实现二元查找.
宇宙中的粒子数约为10的87次方,只要290个问题就能分辨它们.

点击(此处)折叠或打开

  1. #二元运算

  2. #元素:序列,,位置,范围最小值位置,最大值位置
  3. def search(sequence,number,lower=0,upper=None):
  4.     #先判断是否在序列中
  5.     if number in sequence:
  6.         if upper is None:
  7.             upper=len(sequence)-1
  8.         if lower==upper:
  9.             return upper
  10.         else:
  11.             #定义中间数,不能
  12.             middle=(lower+upper)//2
  13.             #判断在哪一边
  14.             if number > sequence[middle]:
  15.                 return search(sequence,number,middle+1,upper)
  16.             else:
  17.                 return search(sequence,number,lower,middle)
  18.     else:
  19.         return '没有这个数字'
  20. seq=[34,67,8,123,4,100,95]
  21. seq.sort()
  22. print seq
  23. print('数字位于%s' % search(seq,34))
  24. print('数字位于%s' % search(seq,55))
  25. print('数字位于%s' % search(seq,95))

点击(此处)折叠或打开

  1. [4, 8, 34, 67, 95, 100, 123]
  2. 数字位于2
  3. 数字位于没有这个数字
  4. 数字位于4










阅读(1144) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~