4. 函数

乙醇 创建于 大约 1 个月 之前

最后更新时间 2018-12-12

本文内容基本上翻译自http://cheat.sh/python/:learn)

非原创, 非原创, 非原创!!!

感谢原文社区作者

####################################################
# 4. 函数
####################################################

# 用"def" 来定义函数
def add(x, y):
    print "x is {0} and y is {1}".format(x, y)
    return x + y  # 用return语句来从函数中返回具体的值


# 调用函数并传入参数
add(5, 6)  # => 打印出 "x is 5 and y is 6" 并返回 11

# 另一种调用函数的方式,使用关键字参数
add(y=6, x=5)  # 使用关键字参数的话,参数出现的顺序是可以随意的


# 可以定义不定长的固定位置参数
# 使用 * 加参数名的形式
# 参数将被解析成元组
def varargs(*args):
    return args


varargs(1, 2, 3)  # => (1, 2, 3)


# 可以定义不定长的关键字参数
# 使用 * 加参数名的形式
# 参数将被解析成字典
def keyword_args(**kwargs):
    return kwargs


# 调用一下看会发生什么
keyword_args(big="foot", loch="ness")  # => {"big": "foot", "loch": "ness"}


# 也可以将两种方式结合起来使用
def all_the_args(*args, **kwargs):
    print args
    print kwargs


"""
all_the_args(1, 2, a=3, b=4) prints:
    (1, 2)
    {"a": 3, "b": 4}
"""

# 调用函数的时候其实就是对args/kwargs做反向操作
# 使用 * 来展开固定位置参数args, 使用 ** 去展开关键字参数kwargs
args = (1, 2, 3, 4)
kwargs = {"a": 3, "b": 4}
all_the_args(*args)  # 等于是调用了 foo(1, 2, 3, 4)
all_the_args(**kwargs)  # 等于 foo(a=3, b=4)
all_the_args(*args, **kwargs)  # 等于 foo(1, 2, 3, 4, a=3, b=4)


# 你可以将函数参数里的args/kwargs传到其他函数里去
# 分别使用 * 和 **
def pass_all_the_args(*args, **kwargs):
    all_the_args(*args, **kwargs)
    print varargs(*args)
    print keyword_args(**kwargs)


# 函数作用域
x = 5


def set_x(num):
    # 本地变量x跟全局变量x的值是不一样的,尽管同名
    x = num  # => 43
    print x  # => 43


def set_global_x(num):
    global x
    print x  # => 5
    x = num  # 全局变量 x 现在被设为 6
    print x  # => 6


set_x(43)
set_global_x(6)


# Python has first class functions
def create_adder(x):
    def adder(y):
        return x + y

    return adder


add_10 = create_adder(10)
add_10(3)  # => 13

# 这是匿名函数
(lambda x: x > 2)(3)  # => True
(lambda x, y: x ** 2 + y ** 2)(2, 1)  # => 5

# 这是内置的高阶函数
map(add_10, [1, 2, 3])  # => [11, 12, 13]
map(max, [1, 2, 3], [4, 2, 1])  # => [4, 2, 3]

filter(lambda x: x > 5, [3, 4, 5, 6, 7])  # => [6, 7]

# 可以使用列表表达式去实现优雅的maps和filters
[add_10(i) for i in [1, 2, 3]]  # => [11, 12, 13]
[x for x in [3, 4, 5, 6, 7] if x > 5]  # => [6, 7]

# 也可以用字典表达式来构造集合和字典
{x for x in 'abcddeef' if x in 'abc'}  # => {'a', 'b', 'c'}
{x: x ** 2 for x in range(5)}  # => {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

上一篇: 3. 控制流下一篇: 5. 类

我要留言

暂无评论