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

简介: Python基础教程第2版 6:抽象 http://blog.chinaunix.net/uid-21142030-id-5676171.html 抽象与结构,事件流程 创建函数是组织程序的关键.

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










目录
相关文章
|
2月前
|
JSON C语言 C++
【Python 基础教程 26】Python3标准库全面入门教程:一步步带你深入理解与应用
【Python 基础教程 26】Python3标准库全面入门教程:一步步带你深入理解与应用
69 1
|
2月前
|
存储 安全 API
【Python 基础教程 21】Python3 文件操作全面指南:从入门到精通的综合教程
【Python 基础教程 21】Python3 文件操作全面指南:从入门到精通的综合教程
89 0
|
5天前
|
Linux Python Windows
Python更换国内pip源详细教程
Python更换国内pip源详细教程
|
5天前
|
Linux Python Windows
Python虚拟环境virtualenv安装保姆级教程(Windows和linux)
Python虚拟环境virtualenv安装保姆级教程(Windows和linux)
|
10天前
|
运维 Shell Python
Shell和Python学习教程总结
Shell和Python学习教程总结
|
10天前
|
运维 Shell Python
Shell和Python学习教程总结
Shell和Python学习教程总结
|
21天前
|
缓存 运维 Linux
保姆级python项目离线部署服务器教程只需这一篇就够了(建议收藏)
这篇文章提供了详尽的Python项目在离线Linux(CentOS)服务器上的部署教程。作者首先介绍了环境背景,强调了无网络环境和使用有网络的CentOS虚拟机准备安装包的重要性。教程分为两部分:外网环境搭建和内网离线安装。在外网环境中,包括下载Python 3.9.0安装包、传输至服务器、安装依赖包,并使用pip3下载项目所需依赖。内网安装则涉及依赖包的复制和Python环境的同样步骤。最后,作者分享了运行项目的命令,并总结了离线安装的整个流程,提醒读者注意可能出现的问题。
保姆级python项目离线部署服务器教程只需这一篇就够了(建议收藏)
|
22天前
|
Python
python教程:二维列表(list)初始化
python教程:二维列表(list)初始化
8 0
|
2月前
|
存储 算法 数据挖掘
【Python 基础教程 25】全面入门指南:深度解析Python3的命名空间,作用域及变量使用教程
【Python 基础教程 25】全面入门指南:深度解析Python3的命名空间,作用域及变量使用教程
63 0
|
2月前
|
存储 机器学习/深度学习 数据安全/隐私保护
【Python 基础教程 24】全面入门Python面向对象编程:深度探索与实战教程
【Python 基础教程 24】全面入门Python面向对象编程:深度探索与实战教程
88 0