讲解python参数和作用域的使用


Posted in Python onNovember 01, 2013

本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途。
一. 创建函数
函数是可以调用,它执行某种行为并且返回一个值。用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)
[/code]
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使用post提交数据到远程url的方法
Apr 29 Python
python简单读取大文件的方法
Jul 01 Python
浅谈Python peewee 使用经验
Oct 20 Python
对numpy中轴与维度的理解
Apr 18 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
Python学习_几种存取xls/xlsx文件的方法总结
May 03 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
Django框架使用mysql视图操作示例
May 15 Python
python实现处理mysql结果输出方式
Apr 09 Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 Python
Python  Asyncio模块实现的生产消费者模型的方法
Mar 01 Python
python列表与元组详解实例
Nov 01 #Python
python创建和使用字典实例详解
Nov 01 #Python
python分割和拼接字符串
Nov 01 #Python
python list语法学习(带例子)
Nov 01 #Python
python读取Android permission文件
Nov 01 #Python
Python读写Excel文件的实例
Nov 01 #Python
Python修改Excel数据的实例代码
Nov 01 #Python
You might like
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
ThinkPHP中U方法的使用浅析
2014/06/13 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
Zend Framework连接Mysql数据库实例分析
2016/03/19 PHP
用javascript动态调整iframe高度的方法
2007/03/06 Javascript
javaScript call 函数的用法说明
2010/04/09 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
JS限制上传图片大小不使用控件在本地实现
2012/12/19 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
2016/03/13 Javascript
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
2016/12/15 Javascript
nodejs使用express创建一个简单web应用
2017/03/31 NodeJs
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
vue动态注册组件实例代码详解
2019/05/30 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
node中短信api实现验证码登录的示例代码
2021/01/20 Javascript
[00:17]游戏风云独家报道:DD赛后说出数字秘密 吓死你们啊!
2014/07/13 DOTA
python连接mysql并提交mysql事务示例
2014/03/05 Python
Python使用bs4获取58同城城市分类的方法
2015/07/08 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
Pandas聚合运算和分组运算的实现示例
2019/10/17 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
html5视频常用API接口的实战示例
2020/03/20 HTML / CSS
美国领先的在线旅游网站:Orbitz
2018/11/05 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
动物科学专业求职信
2014/07/27 职场文书
信息与工商管理职业规划范文:为梦想而搏击
2014/09/11 职场文书
不尊敬老师检讨书范文
2014/11/19 职场文书
财务出纳岗位职责
2015/03/31 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
SQLServer权限之只开启创建表权限
2022/04/12 SQL Server
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技