python学习(6)- 函数

147 阅读2分钟

1.函数

# 函数  def 实现代码复用

# 声明函数
def print_name():
    print('我叫老李')


# 调用函数
print_name()


def add(x, y, z=4):  # x,y形参   z 默认参数
    print(x, y, z)


# 可变参数 *args,**kwargs
def demo(x, y, z=2, *args, **kwargs):
    isum = 0
    isum = x + y + z
    for i in args:  # (3, 4, 5, 6, 7)
        isum += i
    for j in kwargs.values():  # {'a': 1, 'b': 2}
        isum += j
    print(isum)
    # print(x)
    # print(y)
    # print(*args)  #拆包 3 4 5 6 7
    # print(args)   #未拆包 (3, 4, 5, 6, 7)   元组
    # print(kwargs) #   {'a': 1, 'b': 2} 字典


demo(1, 2, 3, 4, 5, 6, 7, a=1, b=2)


# 组合参数
def demo2(x, y, z=2, *args, **kwargs):
    print(x)


# 函数嵌套调用
def test1():
    print('test1')
    test2()
    print('test2 调用完毕')


def test2():
    print('test2')
    test3()


def test3():
    print('test3')


if __name__ == '__main__':
    test1()

# 全局变量,局部变量
name = '老王'  # 全局变量
age = 12
sex = '男'


def show():
    global age, sex  # global声明 age,sex参数是修改的全局变量
    age = 100  # 全局变量
    sex = '女'  # 全局变量
    name = '老三'  # 局部变量 只针对函数内部有效
    print(name, age, sex)


if __name__ == '__main__':
    show()
    print(name, age, sex)


# 返回值
def fn(x, y):
    z = x + y
    return z  # 函数结束


if __name__ == '__main__':
    result = fn(1, 2)
    print(result + 1)


# 返回多个值 是元组类型
def fn1(name, age):
    name = "我叫%s" % name
    age = "今年%s岁" % age
    return name, age


result1 = fn1('老王', 12)
print(result1)  # 元组 ('我叫老王', '今年12岁')
name1, age1 = fn1('老王', 12)
print(name1, age1)  # 拆包 我叫老王 今年12岁


# 递归函数
# 66*5*4*3*2*! = 720

def six(num):
    if num == 1:
        return num
    return num * six(num - 1)


result2 = six(6)
print(result2)

# 匿名函数 lambda a,b:a+b   没有名字的函数,只能有一个式子


def fun(a, b): return a + b


result3 = fun(1, 2)
print(result3)


# 高阶函数
"""
map()函数接收两个参数,一个是函数,一个是Iterable,
map将传入的函数依次作用到序列的每个元素,
并把结果作为新的Iterator返回。 (可以用next()使用)
"""

def f(x):
    return x * x


r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(r))  # [1, 4, 9, 16, 25, 36, 49, 64, 81]


lmap = list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
print(lmap)  # ['1', '2', '3', '4', '5', '6', '7', '8', '9']


"""
reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,
reduce把结果继续和序列的下一个元素做累积计算
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
"""
from functools import reduce

def fn_reduce(x, y):
    return x*10 + y


print(reduce(fn_reduce, [1, 3, 5, 7, 9]))  # 13579


# 编写一个prod()函数,可以接受一个list并利用reduce()求积
def prod(L):
    return reduce(v_fn, L)


def v_fn(x, y):
    return x*y


print('3 * 5 * 7 * 9 =', prod([3, 5, 7, 9]))
if prod([3, 5, 7, 9]) == 945:
    print('测试成功!')
else:
    print('测试失败!')