《Python基础教程(第二版)》学习笔记 -> 第六章 抽象
抽象和结构
本章将会介绍如何让将语句组织成函数,还会详细介绍参数(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]
- 记录函数
如果想要给函数写文档,让后面使用该函数的人能理解的话,可以加入注释,或者就是直接写上字符串(也叫做文档字符串),示例如下:>>> def square(x): 'log or description' return x*x >>> square.__doc__ 'log or description' >>> square(3) 9
参数魔法
- 值从哪里来
保证函数在被提供给可接受参数的时候能正常工作就行。
写在def 语句中函数名后面的变量通常叫做函数的形式参数,而调用函数的时候提供的值是实际参数,或者称为参数。 - 参数能改变吗
- 关键字参数和默认值
目前为止我们所是用的参数都叫做:位置参数
使用参数名提供的参数叫做:关键字参数,它的主要作用在于可以明确每个参数的作用>>> 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! - 收集参数
>>> 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中。
- 反转过程
>>> 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中,两处都没有使用,但得到了相同的效果。
所以星号只在定义函数(允许使用不定数目的参数)或者调用(“分割”字典合作和序列)时才有用。 - 练习使用参数
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
作用域
- 函数内的变量被称为局部变量(local variable)
函数内部引用全局变量:>>> def combine(parameter): print parameter + globals()['parameter'] >>> parameter = "berry" >>> combine('Shrub') Shrubberry - 重新绑定全局变量
>>> x = 1 >>> def change_global(): global x x = x+1 return x >>> change_global() 2 >>> x 2
递归
- 递归,简单来说就是引用自身的意思
- 有用的递归函数包含以下几部分:
①当函数直接返回值时有基本实例(最小可能性问题);
②递归实例,包括一个或者多个问题最小部分的递归调用 - 递归实例:阶乘和幂
阶乘实例:>>> 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基础教程(第二版)》学习笔记 -> 第六章 抽象的更多相关文章
- <<Python基础教程>>学习笔记 | 第10章 | 充电时刻
第10章 | 充电时刻 本章主要介绍模块及其工作机制 ------ 模块 >>> import math >>> math.sin(0) 0.0 模块是程序 一个简 ...
- <<Python基础教程>>学习笔记 | 第04章 | 字典
第04章:字典 当索引不好用时 Python唯一的内建的映射类型,无序,但都存储在一个特定的键中.键能够使字符.数字.或者是元祖. ------ 字典使用: 表征游戏棋盘的状态,每一个键都是由坐标值组 ...
- <<Python基础教程>>学习笔记 | 第12章 | 图形用户界面
Python支持的工具包非常多.但没有一个被觉得标准的工具包.用户选择的自由度大些.本章主要介绍最成熟的跨平台工具包wxPython.官方文档: http://wxpython.org/ ------ ...
- <<Python基础教程>>学习笔记 | 第11章 | 文件和素材
打开文件 open(name[mode[,buffing]) name: 是强制选项,模式和缓冲是可选的 #假设文件不在.会报以下错误: >>> f = open(r'D:\text ...
- python cookbook第三版学习笔记十六:抽象基类
假设一个工程中有多个类,每个类都通过__init__来初始化参数.但是可能有很多高度重复且样式相同的__init__.为了减少代码.我们可以将初始化数据结构的步骤归纳到一个单独的__init__函数中 ...
- Jquery基础教程第二版学习记录
本文仅为个人jquery基础的学习,简单的记录以备忘. 在线手册:http://www.php100.com/manual/jquery/第一章:jquery入门基础jquery知识:jquery能做 ...
- 第二章、元组和列表(python基础教程第二版 )
最基本的数据结构是序列,序列中每个元素被分配一个序号-元素的位置,也称索引.第一个索引为0,最后一个元素索引为-1. python中包含6种内建的序列:元组.列表.字符串.unicode字符串.buf ...
- python基础教程第二版 第一章
1.模块导入python以增强其功能的扩展:三种方式实现 (1). >>> Import math >>> math.floor(32.9) 32.0 #按照 模块 ...
- <<Python基础课程>>学习笔记 | 文章13章 | 数据库支持
备注:本章介绍了比较简单,只是比较使用样品,主要假设是把握连接,利用数据库.和SQLite做演示样本 ------ Python数据库API 为了解决Python中各种数据库模块间的兼容问题,如今已经 ...
随机推荐
- 判断js中的数据类型
如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...
- 2001: [Hnoi2010]City 城市建设 - BZOJ
DescriptionPS国是一个拥有诸多城市的大国,国王Louis为城市的交通建设可谓绞尽脑汁.Louis可以在某些城市之间修建道路,在不同的城市之间修建道路需要不同的花费.Louis希望建造最少的 ...
- c++ 16 this 和 继承 及继承机制中的构造函数 与 析构函数
#include <iostream> #include <string> using namespace std; class Animal { public: Animal ...
- asp.net中js和jquery调用ashx的不同方法分享
代码如下: var xhr = new XMLHttpRequest(); xhr.open("get", 'Controls/gengCart.ashx?C ...
- NOIP2014 行记
不知道OI是啥或者信息学竞赛是啥的可以按`Ctrl+W`. <del>很早开始写的..准备出分之后再发布.</del> 谨以此文纪念我信息学竞赛的第一次正式考试. 背景音乐底部 ...
- PAT-乙级-1045. 快速排序(25)
1045. 快速排序(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 著名的快速排序算法里有一个经典的划分 ...
- APK签名校验绕过
APK签名校验绕过 Android JNI 获取应用签名 android apk 防止反编译技术第一篇-加壳技术 android apk 防止反编译技术第五篇-完整性校验 利用IDA Pro反汇编程序 ...
- C++常用语法
unordered_map<int, Node*> mp; if (mp.find(key) == mp.end()) unordered_map<int, Node*>::i ...
- 一张图让你看懂锻压、CNC、压铸、冲压四类工艺!
(锻压+CNC+阳极.CNC+阳极.压铸+阳极.冲压+阳极手机外壳比较) 上图为一张雷达图,该图比较直观形象地描述了4大手机外壳工艺在6个维度(加工成本.CNC用量.加工周期.成品率.可设计性.外观质 ...
- Mac中编译安装Qt 4.4
解压下载到的.gz源码:gunzip xxx.tar.gztar xvf xxx.tar, 其实在Mac中可以直接双击解压的.然后定位到解压后的目录下:./configuremakesudo make ...