Python学习笔记(七)函数的使用

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 [email protected] 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语言中的*解引用操作语义一致。

时间: 2024-12-26 17:42:44

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

python学习笔记七:条件&循环语句

1.print/import更多信息 print打印多个表达式,使用逗号隔开 >>> print 'Age:',42 Age: 42   #注意个结果之间有一个空格符 import:从模块导入函数 import 模块 from 模块 import 函数 from 模块 import * 如果两个模块都有open函数的时候, 1)使用下面方法使用: module1.open()... module2.open()... 2)语句末尾增加as子句 >>> import ma

python学习笔记之函数总结--高阶函数以及装饰器

python学习笔记之函数总结--高阶函数以及装饰器 Python特点: 1.不是纯函数式编程(允许变量存在): 2.支持高阶函数(可以传入函数作为变量): 3.支持闭包(可以返回函数): 4.有限度的支持匿名函数: 高阶函数: 1.变量可以指向函数: 2.函数的参数可以接收变量: 3.一个函数可以接收另一个函数作为参数: 下面我将示例一些函数的写法以及使用,并说明python中函数的特性: 1.基本的高阶函数示例: #!/usr/bin/env python def func():      

Python学习笔记003_函数

>>> # 函数>>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!") print("Python你好吗?") >>> #调用函数>>> >>> myFirstFunction()这是我的第一个函数!Python你好吗? >>>  # 函数的返回值  return #函数文档, 就是函数

Python学习笔记6-python函数补充、装饰器、模块

本文主要学习内容有 函数知识的补充 装饰器(无参.有参.非固定参数.有返回值) 函数知识的补充 稍后待续...

Python学习笔记七:函数

1. 定义一个函数 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数.参数值和参数名称是按函数声明中定义的的顺序匹配起来的. 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明. 函数内容以冒号起始,并且缩进. Return[expression]结束函数,选择性地返回一个值给调用方.不带表达式的return相当于返回 None. 1 def functionname( parameters ): 2 "函数_文档字符串" 3 function_suite

Python学习笔记:函数

Python函数 先来看下面代码: def welcome_info(): "显示欢迎信息" print("Hello World!") return 0 如上代码,就定义了一个函数. 调用后的结果为: welcome_info() #调用函数 Hello World! #调用结果 这里,我们引用一下Python官方文档对Python函数的定义: The keyword def introduces a function definition. It must be

python学习笔记(四):函数

一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method. 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可. 二.使用函数的好处: 1.简化代码2.提高代码的复用性3.代码可扩展 三.p

python学习笔记(七) - 面向对象高级编程

一. 为类动态添加属性和方法: 1. 动态给一个实例添加属性和方法: 给一个实例绑定的方法,对另一个实例是不起作用的. class Student(object): pass s = Student() s.name = 'Michael' # 动态给实例绑定一个属性 print s.name def set_age(self, age): # 定义一个函数作为实例方法 self.age = age from types import MethodType s.set_age = MethodT

python学习笔记(二) - 函数

一. 调用函数 python内置了一些数据类型转换函数,比如int()函数可以把其他数据类型转换为整形 >>> int('123') 123 >>> int(12.34) 12 >>> float('12.34') 12.34 >>> str(1.23) '1.23' >>> unicode(100) u'100' >>> bool(1) True >>> bool('') Fal

Python学习笔记七-错误和异常

程序员总是和各种错误打交道,学习如何识别并正确的处理程序错误是很有必要的. 7.1错误和异常 1.错误 从软件方面来看,错误分为语法错误和逻辑错误两种.这两种错误都将导致程序无法正常进行下去,当Python检测到一个错误时就出现了异常. 2.异常 当编译器检测到错误并且意识到错误条件.解释器会引发一个异常(程序员也可以自己引发一个异常,后面会说到). 以下是7种Python中常见的错误. 1.NameError,尝试访问一个未申明的例子. 2.ZeroDivisionError,零除错误. 3.