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

企鹅博客
企鹅博客
企鹅博客
25193
文章
0
评论
2020年8月30日12:14:24 评论 24 views

本文会介绍如何将语句组织成函数,还会详细介绍参数和作用域的概念,以及递归的概念及其在程序中的用途。


一. 创建函数
函数是可以调用,它执行某种行为并且返回一个值。用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
  • 本文原创发布php教程 ,转载请注明出处,感谢您的尊重!
    • 上一篇:python爬取网站数据保存使用的方法
    • 下一篇:python列表与元组详解实例

    相关文章

    相关视频

    • 在Django框架中运行Python应用全攻略
    • 在Python的Django框架中创建和使用模版
    • python获取元素在数组中索引号的方法
    • 浅谈python中截取字符函数strip,lstr...
    • 讲解python参数和作用域的使用
    • Python 简介
    • Python 环境搭建
    • Python 中文编码
    • Python 基础语法
    • Python 变量类型

    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论

  • 立即提交

    专题推荐

    • 独孤九贱-php全栈开发教程

      全栈 100W+

      主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门

    • 玉女心经-web前端开发教程

      入门 50W+

      主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门

    • 天龙八部-实战开发教程

      实战 80W+

      主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习

    作者信息

    php教程

    认证0级讲师

    最近文章

    发布技术文章

    • 最新文章
    • 热门排行

    • python之禅怎么打出来
    • python怎么学
    • boosting和bootstrap区别
    • python库是什么意思
    • python卸载后怎么也安装不上
    • python安装后怎么不见了
    • python怎么卸载模块
    • python能做什么?是什么?

    • pickle库的使用详解
    • Anaconda的新手使用大全
    • python爬虫是什么?为什么把python叫做爬虫?
    • Python微信库:itchat的用法详解
    • 关于python3学习基础知识总结
    • python爬虫是什么
    • 使用Python可以做什么
    • python如何实现可视化热力图

    推荐视频教程

  • javascript初级视频教程
  • jquery 基础视频教程
  • 视频教程分类

    • php视频教程
    • html视频教程
    • css视频教程
    • JS视频教程
    • jQuery视频教程
    • mysql视频教程
    • Linux视频教程
    • Python视频教程
    • 网站首页
    • PHP视频
    • PHP实战

    PHP中文网:独家原创,永久免费的在线php视频教程,php技术学习阵地!

    Copyright 2014-2019 http://www.php.cn/ All Rights Reserved | 皖B2-20150071-9 皖公网安备 34010402701654号 免责申明赞助与捐赠

    继续阅读
    企鹅博客
    • 本文由 发表于 2020年8月30日12:14:24
    • 转载请务必保留本文链接:https://www.qieseo.com/338226.html
    新手python用什么版本好? python教程

    新手python用什么版本好?

    想学习Python的人都会有一个困惑,那就是Python目前有两个版本Python2和Python3,Python2与Python3有何区别,两个版本该学习哪个好呢? python3 和 python...
    python中队列的实现方法(代码示例) python教程

    python中队列的实现方法(代码示例)

    本篇文章给大家带来的内容是关于python中队列的实现方法(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 对于python来说,要实现一个队列的类根据已经有的方法,是很简...
    匿名

    发表评论

    匿名网友 填写信息

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: