python学习笔记之五:抽象
本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途。
一. 创建函数
函数是可以调用,它执行某种行为并且返回一个值。用def语句即可定义一个函数:(并非所有的函数都会返回一些东西)
def fibs(num):
result = [0,1]
for i in range(num-2):
result.append(result[-2]+result[-1])
return result
记录函数
如果想给函数写文档以便让人理解的话,可以加入注释(以#开头)。另一个方式就是直接写上字符串,它会作为函数的一部分进行存储,这成为文档字符串。
def square(x):
'计算x的平方'
return x*x #文档字符串可以按如下方式访问:
>>> square._doc_
'计算x的平方'
二. 参数魔法
函数使用起来很简单,创建起来也不复杂,但是函数参数的用法有时就不可思议了。
2.1 我能改变参数吗
在函数内为参数赋予新值,不会改变外部任何变量的值:
>>> def to_change(n):
n = 's' >>> name = 'b'
>>> to_change(name)
>>> name
'b'
字符串(以及数字和元组)是不可变的,即无法被修改。但是如果将可变的数据结构如列表用作参数时,参数就会被改变了。
>>> def change(n):
n[0] = 'ss' >>> names = ['aa','zz']
>>> change(names)
>>> names
['ss', 'zz']
2.2 关键字参数和默认值
目前为止,我们所使用的参数都叫做位置参数。有时候参数顺序是很难记住的,为了让事情简单些,可以提供参数的名字:
>>> def hello(greeting,name):
print '%s,%name!' >>> hello(greeting = 'hello',name = 'world')
hello,world!
这样一来,参数顺序就完全没影响了,但是参数名和值一定要对应。
这样使用参数名提供的参数叫做关键字参数,主要作用在于可以明确每个参数的作用。
关键字参数最厉害的地方在于可以在函数中给参数提供默认值:
>>> def hello(greeting = 'hello',name = 'world'):
print '%s,%name!'
当参数具有默认值时,调用的时候就不用提供参数了,可以不提供,提供一些或提供所有的参数。
>>> hello()
'hello,world!'
>>> hello('greeting')
'greeting,world!'
>>> hello(name = 'universe')
'hello,universe!'
2.3 收集参数
如果函数中能存储多个名字就好了,用户可以给函数提供任意多的参数,我们需要这样做:定义函数时提供一个参数,在前面加个星号。
>>> def print_para(*paras):
print paras >>> print_para('ss')
('ss',)
>>> print_para(1,2,3)
(1, 2, 3)
参数前的星号将所有值放置在同一个元组中,可以说是将这些“其余位置的参数”收集起来再使用。如果不提供任何收集元素,参数得到的是一个空元组()。
但是如果需要处理关键字参数的“收集”操作,我们需要2个星号“**”:
>>> def print_params(x,y,z=3,*pospar,**keypar):
print x,y,z
print pospar
print keypar >>> print_params(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
{'foo': 1, 'bar': 2}
>>> print_params(1,2)
1 2 3
()
{}
请仔细体味上面的例子,前三个参数是固定的,第四个参数pospar是位置参数,可以收集多个参数,第五个参数是关键字参数,可以收集多个关键字参数。当没有输入时,默认为空元组或者空字典。
2.4 反转过程
刚刚已经讨论过如何将参数收集为元组和字典了,如果使用*和**的话,还可以执行相反的操作。(1)在调用的时候使用
>>> def add(x,y):
return x+y >>> params =(1,2)
>>> add(*params)
3
(2)在定义的时候使用
>>> def with_stars(**kds):
print kds['name'],'is',kds['age'],'years old' >>> args = {'name':'Mr.Gumby','age':42}
>>> with_stars(**args)
Mr.Gumby is 42 years old
三. 作用域
在执行x=1赋值语句后,名称x引用到值1。这就像用字典一样,键引用值,当然,变量和所对应的值用的是个‘不可见’的字典。内建vars函数可以返回这个字典:
>>> x=1
>>> scope = vars()
>>> scope['x']
1
>>> scope['x'] += 1
>>> x
2
这个不可见的字典叫做命名空间或者作用域。除了全局作用域外,每个函数调用都会创建一个新的作用域。
一般学过编程的基本都知道什么是作用域了,这里就不细讲了。
四. 递归
递归的定义包括它们自身定义内容的引用。
一个有用的递归函数包含以下几部分:
(1)当函数直接返回值时有基本实例(最小可能性问题)
(2)递归实例,包括一个或者多个问题最小部分的递归调用。
这里的关键是将问题分解为小部分,递归不能永远继续下去,因为它总是以最小可能性问题结束,而这些问题又存储在基本实例中。
下面我们来看3个经典的递归例子:
A.阶乘
>>> def factorial(n):
if n == 1:
return 1
else:
return n * factorial(n-1)
B.幂
>>> def power(x,n):
if n == 0:
return 1
else:
return x * power(x,n-1)
C.二元查找(假设number必然在序列sequence中)
>>> def search(sequence,number,lower,upper):
if lower == upper:
assert num == sequence[upper]
return upper
else:
middle = (lower+upper) // 2
if number > sequence[middle]:
return search(sequence,number,middle+1,upper)
else:
return search(sequence,number,lower,middle)
python学习笔记之五:抽象的更多相关文章
- python学习笔记3_抽象
这一步的学习四个知识点,如何将语句组织成函数,参数,作用域(scope),和递归 一.函数 1.抽象和结构 抽象可以节省很多的工作量,实际上它的作用更大,它是使得计算机程序让人读懂的关键(这也是最基本 ...
- python学习笔记之五
1.Python HTTP server win环境需要加cgi参数 python -m http.server --cgi 8000 其他如下: python -m http.server 8080 ...
- Python学习笔记之抽象
一.创建函数 >>> import math >>> x=1 >>> y=math.sqrt >>> callable(x) # ...
- 【python学习笔记】7.更加抽象
[python学习笔记]7.更加抽象 类的定义就是执行代码块 在内存保存一个原始实例,可以通过类名来访问 类的实例化,是创建一个原始实例的副本, 并且所有成员变量与原始实例绑定 通过修改实例变量,可以 ...
- 【python学习笔记】6.抽象
[python学习笔记]6.抽象 创建函数: 使用def语句定义函数,不用声明参数类型,和返回值类型 def function_name(param1, param2): 'this is docum ...
- python学习笔记4_类和更抽象
python学习笔记4_类和更抽象 一.对象 class 对象主要有三个特性,继承.封装.多态.python的核心. 1.多态.封装.继承 多态,就算不知道变量所引用的类型,还是可以操作对象,根据类型 ...
- 【Python学习笔记之二】浅谈Python的yield用法
在上篇[Python学习笔记之一]Python关键字及其总结中我提到了yield,本篇文章我将会重点说明yield的用法 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生 ...
- Deep learning with Python 学习笔记(10)
生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...
- Deep learning with Python 学习笔记(4)
本节讲卷积神经网络的可视化 三种方法 可视化卷积神经网络的中间输出(中间激活) 有助于理解卷积神经网络连续的层如何对输入进行变换,也有助于初步了解卷积神经网络每个过滤器的含义 可视化卷积神经网络的过滤 ...
随机推荐
- Linux红黑树(二)——访问节点
核心对红黑树使用两点说明 1.头文件 <Documentation/rbtree.txt> Linux's rbtree implementation lives in the file ...
- Delphi的字符(Char),字符串(String),字符串指针(PChar),字符数组arrayofchar(来自http://delphi.cjcsoft.net/论坛)
Delphi有三种类型的字符: AnsiChar这是标准的1字节的ANSI字符,程序员都对它比较熟悉. WideChar这是2字节的Unicode字符. Char在目前相当于AnsiChar,但在De ...
- QT解析命令行(QCommandLineOption和QCommandLineParser类)
Qt从5.2版开始提供了两个类QCommandLineOption和QCommandLineParser来解析应用的命令行参数. 一.命令行写法命令行:"-abc" 在QComma ...
- php运行
运行命令: $php 1.php php教程: http://www.w3school.com.cn/php/php_variables.asp
- MySQL内存表的特性与使用介绍 -- 简明现代魔法
MySQL内存表的特性与使用介绍 -- 简明现代魔法 MySQL内存表的特性与使用介绍
- Swift - 自定义UIActivity分享
UIActivity可以十分方便地将文字.图片等内容进行分享,比如分享到微信.微博.发送邮件.短信等等.我们不仅可以分享内容出来,也可以在自己的App里添加自己的分享按钮或隐藏已有的分享按钮来实现定制 ...
- Emotion英语学习
英语学习断断续续也快两年了,以前也蜻蜓点水地写过几篇总结,但是因为思考的少,只能得到一些表面的收获.从今年三月初到现在,口语阶段已经有三个月,感触较多,所以写这篇博客对这段时间英语学习的一个整体总结. ...
- QT实现不规则窗体
看到网上有很多不规则窗体的实现,效果很酷.于是使用QT也实现了一个,QT的不规则窗体实现非常简单,只需要设置一个mask(遮掩)图片,这个图片的格式可以使用png或bmp格式,我使用了png格式,默认 ...
- javascript启示录英文单词生词
odd:奇怪的 represent:代表 primitive:原始的 trivial:平凡的 demonstrate:证明 keep this at the forefront of your min ...
- Java学习之道:jdk环境变量配置方法
JDK(Java Development Kit)是整个Java的核心,包含了Java执行环境.Java工具和Java基础类库.JDK作为JAVA开发的环境,无论是做JAVA开发还是做安卓开发,都必须 ...