python中的函数使用较简单,这里列出值得注意的几点:

内嵌函数

例如:

# coding: utf-8def foo():def bar():print 'bar() called.'print 'foo() called.'foo()
bar()

对bar的调用是非法的,因为bar的作用域仅限于foo内,除非使用闭包将其返回。

# coding: utf-8def foo():def bar():print 'bar() called.'print 'foo() called.'return bars = foo()
s()

此时对s的调用就是合法的,因为我们在外部引用了bar。

装饰器

我们在类中编写static函数时,就使用了static包装器,如下:

# coding: utf-8class Test():@staticmethoddef foo():print 'static method'Test.foo()

实际上,包装器就是函数。

下面看一个demo:

# coding: utf-8from time import ctimedef testfunc(func):def wrappedFunc():print '[%s] %s() called.' % (ctime(), func.__name__)return func()return wrappedFunc@testfunc
def foo():print 'foo called.'foo()

运行结果如下:

5:34:25 wing@ubuntu func python 2.py
[Fri Nov 14 05:36:31 2014] foo() called.
foo called.

上面如果不对foo添加装饰器,还可以这样调用:

# coding: utf-8from time import ctimedef testfunc(func):def wrappedFunc():print '[%s] %s() called.' % (ctime(), func.__name__)return func()return wrappedFunc#@testfunc
def foo():print 'foo called.'foo = testfunc(foo)
foo()

效果相同。

函数的参数

在C++中,参数的位置是绝对不可以更改的,但是python中如果指定参数名,那么可以更改,例如:

# coding: utf-8def foo(a, b):print 'a = %d, b = %d' % (a, b)foo(4, 3)
foo(a = 4, b = 3)
foo(b = 3, a = 4)

最后一行调用,a和b就更换了位置。

函数的缺省参数

# coding: utf-8def foo(a, b = 20):print 'a = %d, b = %d' % (a, b)foo(23)
foo(a = 12)
foo(4, 3)
foo(a = 4, b = 3)
foo(b = 3, a = 4)

存在缺省参数时,也可以指定参数名,这样就可以调换位置

再比如:

# coding: utf-8def foo(name, age = 20, sex = 'male'):print 'name = %s, age = %d, sex = %s' % (name, age, sex)foo('zhangsan', 23, 'male')
foo('lisi')
foo('lisi', sex = 'female')
foo(sex = 'male', name = 'gaga')
foo('haha', 34)
foo(age = 23, name = 'lucy')
foo(sex = 'female', age = 88, name = 'wangwu')

不带关键字的可变参数

C语言中的printf函数,可以使用可变参数,意思就是参数的个数和类型是不确定的,Python同样支持这种用法。

# coding: utf-8def foo(a, b = 'default Value', *theList):print 'a = ', aprint 'b = ', bfor i in theList:print 'other argument :', ifoo('abc')
foo(23, 4.56)
foo('abc', 123, 'xyz')
foo('abc', 123, 'xyz', 'haha', 'gaga', 34)

我们在参数的最后一个位置写入*theList,意思就是多余的参数写入一个元组中。

注意这里的参数都是不带关键字的,如果我们使用了c = 5,那么导致运行错误。

带关键字的可变参数

如果我们真的需要使用c = 5这种额外的参数,可以使用**theRest,将多余的参数放入字典。

# coding: utf-8def foo(a, b = 'default Value', **theDict):'除了a和b外,其余的参数放入'print 'a = ', aprint 'b = ', bfor eachKey in theDict.keys():print 'Other argument %s: %s' % (eachKey, theDict[eachKey])foo('abc')
foo(23, 4.56)
foo('abc', 123, c = 'xyz')
foo('abc', 123, c = 'xyz', d = 'haha', e = 'gaga')
foo(c = 'xyz', a = 'haha', b = 'gaga')
foo('xyz', c = 'haha', b = 'gaga')
foo('hehe', c = 'c')

二者还可以结合使用:

# coding: utf-8def foo(a, b = 'default Value', *theList, **theDict):print 'a = ', aprint 'b = ', bfor i in theList:print 'argument :', ifor eachKey in theDict.keys():print 'Other argument %s: %s' % (eachKey, theDict[eachKey])foo('abc', 123, 'zhangsan', c = 'xyz', d = 'haha', e = 'gaga')

对于上面的代码,尝试调用:

foo(2, 4, *(6, 8), **{'foo' : 12, 'bar' : 24})

运行结果为:

a =  2
b =  4
argument : 6
argument : 8
Other argument foo: 12
Other argument bar: 24

这与我们手工列出各项变量,结果是一致的。

注意不带关键字的集合未必是元组,只要是序列就可以,于是:

foo(2, 4, *"abcdefg", **{'foo' : 12, 'bar' : 24})

打印结果为:

a =  2
b =  4
argument : a
argument : b
argument : c
argument : d
argument : e
argument : f
argument : g
Other argument foo: 12
Other argument bar: 24

如果我们将元组和字典提前定义,如下:

aTuple = (6, 8)
bDict = {'foo' : 12, 'bar' : 24}
foo(2, 4, *aTuple, **bDict)

结果与上面是一致的。

不过值得注意的是:

foo(1, 2, 3, x = 4, y = 5, *aTuple, **bDict)

结果为:

a =  1
b =  2
argument : 3
argument : 6
argument : 8
Other argument y: 5
Other argument x: 4
Other argument foo: 12
Other argument bar: 24

解释器自动帮我们进行了合并。

这里我们应该认识到,*和**在函数调用时的作用就是讲元组或者字典展开,这与C语言中的*解引用操作语义一致。

转载于:https://www.cnblogs.com/inevermore/p/4098271.html

Python学习笔记(七)函数的使用相关推荐

  1. Python学习笔记:函数(Function)

    Python学习笔记:函数(Function) 一.函数基本概念 函数是Python里组织与重用代码最重要的方法.一般来说,如果你期望多次重复相同或相似的代码,写一个可重用的函数可能是值得的.函数通过 ...

  2. Python学习笔记12_函数

    Python学习笔记12_函数 文章目录 Python学习笔记12_函数 1.函数定义 2.函数调用 3.函数的参数 3.1.可更改对象和不可更改对象参数 3.2.必需参数(位置参数) 3.3.关键字 ...

  3. Python学习笔记——一些函数

    本文对应头歌上的Python练习:https://www.educoder.net/paths/pn7qklv9 基础知识1: input( )函数 input()函数从控制台获得用户输入,无论用户在 ...

  4. 小甲鱼python003答案_小甲鱼:Python学习笔记003_函数

    >>> # 函数 >>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!" ...

  5. Python学习笔记系列——函数

    今年下半年的计划主要是Python和Mysql了,公司不方便看书和视频,就照着廖雪峰的Python网站开始看了.以下纯为个人笔记记录,若是想系统学习的小伙伴还是看这里的好一些,毕竟系统.https:/ ...

  6. Python学习笔记:匿名函数

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. Python学习笔记:函数

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  8. python学习笔记三一 函数学习

    函数学习 range函数 •生成有序的序列 •生成数字队列可以定制 # range函数案例1 # 生成一个从1到10的数字序列 # range的生成序列的两个面数字是左包括,右不包括(如下所示只包括1 ...

  9. python学习笔记(四):函数

    一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...

  10. Python学习笔记之函数(四)

    1.传递任意数量的实参,可以在形参的参数底下加个 * 符号,在我们预先不知道要函数要接受多少实参的时候,就可以使用这种方式,函数就可以从调用语句中收集任意数量的实参. 示例代码如下: #传递任意数量的 ...

最新文章

  1. 删除DataTable中列重复的行
  2. 这是我的2018年终总结,你的呢?
  3. Hbase 2.0 RegionObserver使用
  4. BZOJ3784树上的路径
  5. win7 / mysql-8.0.11-winx64 安装的测坑步骤
  6. VBA学习过程中遇到的问题(主要针对Excel)
  7. Hibernate的执行流程——SessionFactory的创建
  8. 使用Google zxing生成二维码
  9. c++ 实现一个object类_一个Java类就能实现微服务架构的权限认证
  10. 第一二三章 PMP第六版读书笔记
  11. Linux kernel 配置选项
  12. 计算机专业英语常用词汇整理
  13. 数据分析-ARIMA方法建模步骤总结
  14. 【视频教程】Win10系统需要关闭的功能,常规隐私 win10电脑怎么关闭隐私选项
  15. springcloud + oauth2
  16. 这可能是2021年GDPR的最大罚单
  17. Nginx LVS 阿里云SLB
  18. 使用expression design制作silverlight LOGO那种烟雾效果教程(翻译)
  19. custom_filter
  20. CONCATENATE示例

热门文章

  1. 你必须会的--Dijkstra算法--单源最短路径问题
  2. 分布式工具的一次小升级⏫
  3. pycharm 基本设置
  4. 文件的时间属性(摘自网友的博客)
  5. 为什么开发人员从Java转到Go
  6. Android WebView 与 JS 交互
  7. MySQL EXPLAIN Extra列的信息
  8. 如何使盘ISO图像文件
  9. Android文档-开发者指南-第一部分:入门-中英文对照版
  10. eclipse 如何使用svn