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

 

内嵌函数

 

例如:

# coding: utf-8

def foo():
def bar():
print 'bar() called.'
print 'foo() called.' foo()
bar()

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

# coding: utf-8

def foo():
def bar():
print 'bar() called.'
print 'foo() called.'
return bar s = foo()
s()

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

 

 

装饰器

 

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

# coding: utf-8

class Test():
@staticmethod
def foo():
print 'static method' Test.foo()

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

下面看一个demo:

# coding: utf-8

from time import ctime

def 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-8

from time import ctime

def 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-8

def 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-8

def 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-8

def 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-8

def foo(a, b = 'default Value', *theList):
print 'a = ', a
print 'b = ', b
for i in theList:
print 'other argument :', i foo('abc')
foo(23, 4.56)
foo('abc', 123, 'xyz')
foo('abc', 123, 'xyz', 'haha', 'gaga', 34)

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

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

 

带关键字的可变参数

 

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

# coding: utf-8

def foo(a, b = 'default Value', **theDict):
'除了a和b外,其余的参数放入'
print 'a = ', a
print 'b = ', b
for 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-8

def foo(a, b = 'default Value', *theList, **theDict):
print 'a = ', a
print 'b = ', b
for i in theList:
print 'argument :', i
for 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语言中的*解引用操作语义一致。

Python学习笔记(七)函数的使用的更多相关文章

  1. python学习笔记(七)-函数

    函数 方法 功能说白了,函数就是把一堆代码组合到一起,变成一个整体.函数不调用不会被执行.作用在于提高代码的复用性.定义函数 def greet_user(): """关 ...

  2. Python学习笔记之函数

    这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...

  3. 小甲鱼:Python学习笔记003_函数

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

  4. Python学习笔记 - day6 - 函数

    函数 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多次执行(这叫函数的调用).函数在编程语言中有基本分为:预 ...

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

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

  6. Python学习笔记七

    面向对象编程 面向对象的特性如下: 类:具有相同属性和方法的一类事物,成为类. 对象:类的实例化后的结果,一个类可以实例化多个对象,每个对象也可以不同的属性. 封装:在类中对数据的赋值,类里面包含着类 ...

  7. Python学习笔记_week3_函数

    一.介绍 1.面向对象(华山派)--->类(独门秘籍)--->class(定义的关键字) 2.面向过程(少林派)--->过程--->def 3.函数式编程(逍遥派)---> ...

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

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

  9. python学习笔记:函数

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

  10. Python学习笔记(五)函数和代码复用

    函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Python提供了许多内建函数,比如print().同样,你也可以自己创建函数, ...

随机推荐

  1. JVM垃圾收集规则和算法

    1.垃圾收集 Garbage Collection 程序计数器.虚拟机栈.本地方法栈这三部分内存随着线程生而生,随着线程灭而自然的回收,他们的大小在编译期间就大致确定了下来,所以对这部分的回收是具备确 ...

  2. hdu5819

    补多校系列,具体见多校题解http://www.cnblogs.com/duoxiao/p/5777700.html 值得注意的是如果当前i初始向左,前i个骑士最终只有1个向右 对于f[i][1]状态 ...

  3. NOIP 2015 跳石头

    题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不 ...

  4. [BZOJ 1212] L语言

    Link: BZOJ 1212 传送门 Solution: 看到字符串的多模式匹配,正解一般就是Trie树/AC自动机 此题由于每个模式串长度都很小,于是直接在Trie树上暴力就行了 先把所有模式串建 ...

  5. [BZOJ 1912] patrol 巡逻

    Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1912 Algorithm: K=0:res=(n-1)*2   每条边恰好走2遍 K=1 ...

  6. 【记忆化搜索】bzoj1079 [SCOI2008]着色方案

    #include<cstring> #include<cstdio> using namespace std; #define MOD 1000000007 typedef l ...

  7. 【字符串哈希】bzoj3555 [Ctsc2014]企鹅QQ

    枚举每个位置,给每个串的前半部分一个哈希值,后半部分一个哈希值,若是它们均相等,则视为这两个串相似. 每次转移之后,排序一下就行了. O(L*n*log(n)). #include<cstdio ...

  8. STL之vector4

    描述 将一个n行m列矩阵元素输入存储后并输出. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. int main() { vector< vector<int> > ...

  9. NOIP模拟赛[补档]

    图论: 差分约束, 2 SAT 数据结构 字符串 数学: FFT / NTT / 线代 DP 计算几何 暴力 线性基 CF 724G 计划: D1 T1: 斜率优化DP D1 T2: 差分约束 D1 ...

  10. angular2学习资源汇总

    文档博客书籍类 官方网站: https://angular.io 中文站点: https://angular.cn Victor的blog(Victor是Angular路由模块的作者): https: ...