关闭

Python的函数

标签: 函数
181人阅读 评论(0) 收藏 举报
分类:

Python的函数

定义函数

def function_name(param, param, ...):
    function_suite
    return [expression]

or

def function_name(param, param, ...):
    pass

变量作用域

局部变量 / 全局变量:

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。

传参方式=按引用传递参数

参数在Python里都是按引用传递(而不是按值传递)。

# coding=utf-8
__author__ = 'zyt'


def modify_num_value(x):
    print 'inner1:', x, id(x)
    x = 10
    print 'inner2:', x, id(x)
    return


def modify_list_value(x):
    print 'inner3:', x, id(x)
    x[2] = 100
    print 'inner4:', x, id(x)
    return


a = 1
print 'main1:', a, id(a)
modify_num_value(a)
print 'main2:', a, id(a)

b = [1, 2, 3, 4, 5]
print 'main3:', b, id(b)
modify_list_value(b)
print 'main4:', b, id(b)



运行结果:
main1: 1 34209536
inner1: 1 34209536
inner2: 10 34209428
main2: 1 34209536
main3: [1, 2, 3, 4, 5] 41602784
inner3: [1, 2, 3, 4, 5] 41602784
inner4: [1, 2, 100, 4, 5] 41602784
main4: [1, 2, 100, 4, 5] 41602784

参数传入

# coding=utf-8
__author__ = 'zyt'


def my_function(name, age, height=180):
    print "name:", name
    print 'age:', age
    print 'height:', height  # 缺省参数
    print '------'
    return


my_function(age=20, name='Jack')  # 命名参数的顺序已不再重要
my_function('Peter', 25, 175)  # 参数默认按位置顺序传入



运行结果:
name: Jack
age: 20
height: 180
------
name: Peter
age: 25
height: 175
------
  • 使用缺省参数时的注意:

先看下面代码:

# coding=utf-8
__author__ = 'zyt'


def my_add_end(L=[]):  # 使用缺省参数
    L.append('end')
    # print 'inner:', L
    return L


a = ['hello', 'world']
print 'main1:', a
print 'main2:', my_add_end(a)
print 'main3:', my_add_end(a)

print 'main4:', my_add_end()
print 'main5:', my_add_end()
print 'main6:', my_add_end()



运行结果:
main1: ['hello', 'world']
main2: ['hello', 'world', 'end']
main3: ['hello', 'world', 'end', 'end']
main4: ['end']
main5: ['end', 'end']
main6: ['end', 'end', 'end']

看到上面运行结果中,main5、main6结果并不是预期中的只有一个['end']
这是因为,在函数被定义的时候,默认参数L的值就被计算出来了,即指向[]这个对象,那么当调用该函数时,如果改变了L的内容,则下次调用时,就不再是[]了,而是改变后的内容。所以,定义缺省参数时要注意:缺省参数指向不变对象!避免无意中改变对象内容。

对上面程序修改,使用None不变对象:

def my_add_end(L=None):
    if L is None:
        L = []
    L.append('end')
    # print 'inner:', L
    return L

......



运行结果:
main1: ['hello', 'world']
main2: ['hello', 'world', 'end']
main3: ['hello', 'world', 'end', 'end']
main4: ['end']
main5: ['end']
main6: ['end']

匿名函数(lambda)

偏函数

The partial() is used for partial function application which “freezes” some portion of a function’s arguments and/or keywords resulting in a new object with a simplified signature.
参考库模块functools

# coding=utf-8
__author__ = 'zyt'

import functools

int2to10 = functools.partial(int, base=2)
int16to10 = functools.partial(int, base=16)

print int2to10('1010')
print int16to10('E')
print int('B', base=16)


运行结果:
10
14
11

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:58850次
    • 积分:1582
    • 等级:
    • 排名:千里之外
    • 原创:79篇
    • 转载:3篇
    • 译文:11篇
    • 评论:1条
    最新评论