- 浏览: 406115 次
- 性别:
- 来自: 天津
文章分类
最新评论
-
junchao_qin:
[img][flash=200,200][url][img]引 ...
MyEclipse中使用VSS插件 -
tigerwood008:
IE11不好用!!
js弹出窗口 + 获取上传文件全路径 -
TheMatrix:
$.ajaxSetup({async : false});这种 ...
jquery 中的post和get方法如何同步 -
多多成长记:
Blazeds与java通信 -
ZED.CWT:
[align=ceiinter][/align]
java中利用JFrame创建窗体 【转】
第六章 抽象
1. 函数 def functionname(para):
用于def后面的' '添加文档字符串,相当于注释#
>>> def fibs(num): 'Get fibonaqi 这里的字符串用来注释,一般说明函数功能' result = [0, 1] for i in range(num - 2): result.append(result[-1] + result[-2]) return result >>> fibs(10) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
使用help()可以查询函数的文档字符串
>>> help(fibs) Help on function fibs in module __main__: fibs(num) Get fibonaqi 这里的字符串用来注释,一般说明函数功能 >>>
return后不加值,只表示函数的结束,而没有返回值,这样可以避免应该返回序列时,意外返回None
>>> def test(): print "test" return #无返回值 print "hello" #不执行 >>> x = test() test
2. 参数对外部变量影响
函数内给参数赋值,不会改变外部变量的值,参数存储在局部作用域中
>>> def try_to_change(n): n = 3 >>> a = 4 >>> try_to_change(a) #虽然在函数内部重新赋值,但外部不变, n和a实际上是完全不同的变量, >>> a 4
但是对于可改变的数据结构,如列表,参数的内部赋值会改变外部变量的值
内部参数与外部变量指向同一个列表,所以会被修改
若不想改变外部列表,可以传进一个副本
>>> def change(n): n[0] = 'test' >>> names = ['Hello', 'world'] >>> change(names) >>> names ['test', 'world'] >>> #采用普通方法进行模拟 >>> names = ['Hello', 'world'] >>> n = names #模拟传参 >>> n[0] = 'test' #改变列表 >>> names ['test', 'world']
完整示例——存储名字,并能用名字、中间名或姓来查找联系人
若名字为'Magus Lie Hetland'存储格式类似
data = {
'first': { 'Magus': 'Magus Lie Hetland'},
'middle': {'Lie': 'Magus Lie Hetland'},
'last': {'Hetland': 'Magus Lie Hetland'}
}
注意insert(index,value)函数,在列表的索引位置插入值
>>> def init(data): #data作为存储表,初始化 data['first'] = {} data['middle'] = {} data['last'] = {} >>> def store(data, full_name): #存储,将全名存储到表中 names = full_name.split() #将名字按空格(即first,middle,last)分开,返回列表,如'Ma Li He'返回['Ma', 'Li', 'He'] if len(names) == 2: names.insert(1, '')#若无中间名,则插入空来表示中间名['Mr', 'Zha']返回['Mr', '', 'Zha'] labels = 'first', 'middle', 'last' #元组 for label, name in zip(labels, names): #元组与序列间也可使用zip people = lookup(data, label, name) if people: people.append(full_name) else: data[label][name] = [full_name] #当键不存在时,自动添加键值对, #但如果输出不存在键对应值,则报错 >>> def lookup(data, label, name): #查找,根据label查找是name的中间人 return data[label].get(name) >>> MyNames = {} >>> init(MyNames) >>> store(MyNames, 'Magnus Lie Hetland') >>> lookup(MyNames, 'middle', 'Lie') ['Magnus Lie Hetland'] >>> store(MyNames, 'Robin Hood') >>> store(MyNames, 'Robin Locksley') >>> lookup(MyNames, 'first', 'Robin') ['Robin Hood', 'Robin Locksley'] >>> store(MyNames, 'Mr. Gumby') >>> lookup(MyNames, 'middle', '') ['Robin Hood', 'Robin Locksley', 'Mr. Gumby']
例2. 不可变的数字和可改变的参数
>>> def inc(x): return x + 1 >>> foo = 10 >>> inc(foo) 11 >>> foo #外部变量未发生变化 10 >>> foo = inc(foo) #将foo重新赋值 >>> foo 11
使用列表外部变量foo改变了
>>> def inc(x): x[0] = x[0] + 1 >>> foo = [10] >>> inc(foo) >>> foo [11]
3. 关键字参数和默认值
位置:是指根据参数的对应位置传参,如def a(a,b,c):,调用a(1,2,3),1传给a,2传给b,3传给c,这样参数位置容易记混。
关键字参数,适用于大规模程序,清晰
>>> def hello(name, greeting): print '%s, %s!' %(greeting, name) >>> hello('sun', 'Hello') #位置参数 Hello, sun! >>> hello(name = 'Sun', greeting = 'Hello') #关键字参数 Hello, Sun! >>> hello(greeting = 'Hello', name = 'Sun') #关键字参数,不必关心位置 Hello, Sun!
默认值
>>> def hello(name = 'world', greeting = 'Hello'): print '%s, %s!' %(greeting, name) >>> hello() Hello, world! >>> hello('Sun') Hello, Sun! >>> hello(greeting = 'Hi') Hi, world!
位置参数与关键字参数混用,将位置参数放在前面。尽量避免这么用,容易引起混乱。
>>> def hello(name, greeting = 'Hello', punc = '!'): print '%s, %s%s' %(greeting, name, punc) >>> hello('Sun') Hello, Sun! >>> hello('Sun', 'Hi') Hi, Sun! >>> hello('Sun', punc = '..') Hello, Sun.. >>> hello() #因为name是必须要有,若有默认值,则可没有 Traceback (most recent call last): File "<pyshell#385>", line 1, in <module> hello() TypeError: hello() takes at least 1 argument (0 given) >>>
4. 收集参数——在定义时使用*或**,用来收集参数,允许使用不定数量的参数
*:收集其余的位置参数并作为元组 返回
>>> def print_params2(title, *params): print title print params >>> print_params2('Param:', 1, 2, 3) Param: (1, 2, 3) #以元组形式返回 >>> print_params2('Param:') #不提供收集元素时,返回空元组 Param: () >>> print_params2('Param:', 1) Param: (1,) #只有一个元素时,仍为元组
**:收集其余的关键字参数并作为字典 返回,可与其他混用
>>> def print_params3(x, y, z = 3, *pospar, **keypar): print x, y, z print pospar print keypar >>> print_params3(1,2,3,4,5,6,7, fool = 1, bar = 2) 1 2 3 (4, 5, 6, 7) {'fool': 1, 'bar': 2} >>> print_params3(1,2) 1 2 3 () {}
5. 收集参数的翻转过程——在调用时使用*或**,将参数分配到定义的参数中,用于字典或列表分割时
用于列表
>>> def add(x,y): return x + y >>> params = (1,2) >>> add(*params) 3
用于字典
>>> def hello(name, greeting): print '%s, %s!' %(greeting, name) >>> params = {'name': 'Sir Robin', 'greeting': 'Welcome'} >>> hello(**params) Welcome, Sir Robin!
参数使用实例
#模拟步长大于0的range() >>> interval(10) start = 0 stop = 10 step = 1 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> def interval(start, stop=None, step=1): 'Imitates range() for step > 0' if stop is None: #若未给stop指定值 start, stop = 0, start #多个赋值,0赋值给start,start的值赋值给stop result = [] i = start while i < stop: result.append(i) i += step return result # >>> def story(**kwds): return '%(job)s called %(name)s.' %kwds >>> def power(x, y ,*others): if others: print 'Received redundant parameters:',others return pow(x,y) #使用 >>> params = {'job':'language','name':'python'} >>> print story(**params) #调用时分割字典,定义中收集 language called python. >>> del params['job'] >>> print story(job='test', **params) >>> power(2,3,'test') Received redundant parameters: test >>> params = (5,) * 2 #即(5,5) >>> power(*params) #先分割,在赋给x,y 3125
6.作用域
x = 1, 将名字x引用到值1上,类似字典
内建函数vars()返回这个字典
>>> x = 1 >>> scope = vars() >>> scope['x'] 1 >>> scope['x'] += 1 #一般情况下,vars()返回的字典不能修改 >>> x 2
局部变量,全局变量
函数内部访问全局变量,慎用!
>>> def com(para): print para + external >>> external = 'external' >>> com('param ') param external
若全局变量与局部变量名字相同,会被局部变量覆盖,可使用global()类似vars(),获得全局变量的字典
>>> def com(para): print para + globals()['para'] >>> para = 'berry' >>> com('test ') test berry
重绑定全局变量,将变量引用到其他新值——函数内部声明全局变量
>>> x = 1 >>> def change_global(): global x x = x + 1 >>> change_global() >>> x 2
嵌套作用域——函数中定义函数,例如闭包
外部作用域中的变量一般不能被改变,但是用闭包,每次调用外层函数,内部函数都会被重新绑定,也即外部作用域factor每次都有一个新值
>>> def multiplier(factor): def multiplyByFactor(number): return number * factor return multiplyByFactor #返回一个函数,这时并未调用 >>> double = multiplier(2) #double是一个函数 >>> double #double是一个函数 <function multiplyByFactor at 0x0214C6F0> >>> double(5) #调用multiplyByFactor(number) 10 >>> multiplier(2)(5) #效果同上 10
7. 递归——每调用一个函数,都会创建一个新的命名空间,意味着当函数调用自身时,实际上调用的是两个不同的函数
阶乘
>>> 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,3) 8
递归实例——二元搜索
前提:排好序
若上下限相同,则那就是数字所在位置,返回;
否则,找到两者的中间,查找数字是在左侧还是右侧,继续查找数字所在的那半部分。
>>> def search(sequence, number, lower = 0, upper = None): if upper is None: upper = len(sequence) - 1 if lower == upper: assert number == 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) >>> seq = [34, 67, 8, 123, 4, 100, 95] >>> seq.sort() >>> seq [4, 8, 34, 67, 95, 100, 123] >>> search(seq, 34) 2
总结:
元组输出格式化,直接使用键,而不需要加引号
>>> d = {'a':1, 'b':2} >>> print '%(a)s corresponds to %(b)s.' %d #注意a有括号,无引号 1 corresponds to 2.
发表评论
-
python读写文件
2011-12-06 21:43 1727#--------------readwrite.py---- ... -
【转】python入门
2011-11-04 11:11 828转自:http://wenku.baidu.com/vi ... -
【转】python教程
2011-11-04 11:07 0转自:http://wenku.baidu.com/ ... -
python学习笔记10——构造方法、属性和迭代器
2011-09-11 23:31 1528第九章 构造方法、属性和迭代器 1. 构造方法__init ... -
python学习笔记9——第八章 异常
2011-09-11 11:59 2926第八章 异常 1. (1)捕捉异常,try ... -
python学习笔记8——第七章 面向对象
2011-09-09 13:39 4157第七章 更加抽象—— ... -
python学习笔记6——第五章 条件、循环和其他语句
2011-09-07 17:17 3300第五章 条件、循环和其他语句 注意:注意代码的缩进,否 ... -
python学习笔记5——第四章 字典
2011-09-06 21:31 2291第四章 字典 1. 映射mapping——通过名字引 ... -
python学习笔记4——第三章 字符串
2011-09-06 20:43 2501第三章 字符串 1. 字符串不可修改,无法进行分片赋值 ... -
python学习笔记3——第二章 序列
2011-09-05 21:44 9400第二章 序列 1. ... -
python学习笔记2——第一章 语法入门
2011-09-05 17:47 3668为了方便学习,从今天 ... -
python学习笔记1
2011-08-20 22:52 4464前言 鉴于目前python相当流行,所以开始自学,在win系 ...
相关推荐
Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip Python 笔记源码——内含python后端&机器学习等.zip ...
Python深度学习实战——基于Pytorch全书电子教案完整版ppt整套教学课件最全教学教程.pptx
Python学习笔记——运算符 运算符: 赋值运算符 算术运算符 关系运算符 逻辑运算符 位运算
Python学习笔记——输入input(),input()使用,两个练习。
"[实训解析]Python 计算思维训练——SAR图像处理-第2关:读入一个目录下所有图像_5307.pdf" 该标题表明,这是一个 Python 计算思维训练的实践解析,重点在于SAR图像处理,并且是第二关,主题是读取一个目录下所有...
用Python学习线性代数——向量在Jupyter Notebook下运行的文件,内容包括行列向量的基本表示,向量的基本运算等。详情请见https://tuenity.blog.csdn.net/article/details/104070768。
《Python学习笔记(干货) 中文PDF完整版.pdf》是一份全面且深入的Python学习资源,旨在帮助初学者和有经验的程序员进一步提升Python技能。这份资料覆盖了Python的多个核心概念,包括环境搭建、基本语法、数据类型、...
**标题与描述解析:** "Python学习笔记.pdf" 的标题直接指出了文档的主题——Python的学习资料,而描述的重复表明该文档的主要内容即为Python的学习笔记。标签 "Python" 进一步强调了主题。 **知识点:** 1. **...
Python基础入门教程,适合Python初学者,文档内容包括, 目录 前言 i 第一章 程序 1 1.1 程序 . . . . . ....1.2 什么是调试 ....1.3 调试 ....1.4 程序语言和自然语言 ....1.5 第一个程序 ....第二章 变量,表达式和语句 6
Python高效开发实战——Django、Tornado、Flask、Twisted 本书源代码 Python高效开发 实战 也许你听说过全栈工程师,他们善于设计系统架构,精通数据库建模、通用网络协议、后端并发处理、前端界面设计,在学术研究...
在“Python训练营Python学习笔记”中,我们将会探讨一些基本的编程概念和操作,包括变量、运算符、数据类型以及位运算。 1. **变量、运算符与数据类型** 变量是存储数据的容器,你可以将其想象为一个可以改变的...
python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园考试系统.zip python项目——智慧校园...
《Python期末大作业——采用Neo4j的基于协同过滤电影推荐系统》是一个综合性的项目,旨在教授学生如何利用Python编程语言、大数据处理技术以及Neo4j图数据库来构建一个电影推荐系统。该项目不仅包含了完整的源代码,...
python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目——Word助手.zip python项目...
清华大学精品Python学习PPT课件-第6章 Python函数.pptx 清华大学精品Python学习PPT课件-第7章 Python模块.pptx 清华大学精品Python学习PPT课件-第8章 Python类和对象.pptx 清华大学精品Python学习PPT课件-第9章 ...
Python学习笔记--皮大庆
本篇笔记将深入探讨Python中的socket通信,并结合提供的资源文件进行讲解。 首先,让我们了解什么是socket。Socket是操作系统为网络通信提供的一种接口,可以理解为两台计算机之间通信的通道。在Python中,我们可以...