当前位置: 首页 > news >正文

Python基础教程第二版 6:抽象

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










相关文章:

  • UnicodeEncodeError: 'ascii' codec can't encode
  • 【Android 学习】 Android反编译
  • 【转】Java 中的 i = i++
  • 在我lenovo上装windows10
  • Shell编程
  • 构建自己的PHP框架--创建组件的机制
  • 闲扯 『 document.write 』
  • 【vSphere故障案例】案例九:ESXi主机HA未配置错误
  • 在Mac上关于tomcat服务器的安装、配置、启动、部署web详细流程
  • git分享(二)git checkout
  • Android源码大放送之material design类型
  • 国内收益最高的聚合平台--KeyMob移动广告聚合平台
  • SQL 存储过程返回值
  • 利用excel办公软件快速拼凑sql语句
  • 如何利用又拍云玩转live photo,没有6S也能玩
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 《Java编程思想》读书笔记-对象导论
  • 【mysql】环境安装、服务启动、密码设置
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Apache的80端口被占用以及访问时报错403
  • HTTP那些事
  • Java 23种设计模式 之单例模式 7种实现方式
  • java 多线程基础, 我觉得还是有必要看看的
  • learning koa2.x
  • MySQL-事务管理(基础)
  • oschina
  • php的插入排序,通过双层for循环
  • 百度小程序遇到的问题
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端技术周刊 2019-01-14:客户端存储
  • 微信公众号开发小记——5.python微信红包
  • 线上 python http server profile 实践
  • 阿里云API、SDK和CLI应用实践方案
  • ​业务双活的数据切换思路设计(下)
  • ###STL(标准模板库)
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (BFS)hdoj2377-Bus Pass
  • (C++)八皇后问题
  • (C语言)fgets与fputs函数详解
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (转)我也是一只IT小小鸟
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 5种线程安全集合
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .Net 应用中使用dot trace进行性能诊断
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)