Python全栈开发day3-函数

一、函数

1. 使用函数的好处

代码重用;保持一致性,易维护;可扩展性

2. 定义函数

def func(x):    # def 关键字,func 函数名,x 形参(可以不传入)
    """ This function document"""   # 函数说明
    y = x+1     # 函数体
    return y    # 返回值

print(func(4))

3. 函数参数

位置参数、默认参数、关键字参数、参数组

def func(x, y, z=7, *args):
    print(args)
    return x+1, y*2, z**2

print(func(3, 4, 5))    # (4, 8, 25)    # 位置参数:形参与实参一一对应
print(func(3, 5))       # (4, 10, 49)   # 默认参数:未传入对应实参时默认使用值
print(func(x=3, z=5, y=3))   # (4, 6, 25)   # 关键字参数:不需要一一对应
print(func(3, z=5, y=3))   # (4, 6, 25) # 位置参数必须在关键字参数的左边
print(func(1, 2, 3, 4, 5, 6, 7))      # 参数组:将4,5,6,7传递给 *args,可传递字典、列表
print(func(1, 2, 3, [4, 5, 6, 7]))     # 参数组:传递列表
print(func(1, 2, 3, {"name": "zhangsan"}))    # 参数组:传递字典
def func(x, **kwargs):
    print(x)
    print(kwargs)
func(2, y=3, z=6)
def func(x, *args, **kwargs):
    print(x)
    print(args)
    print(kwargs)
func(2, *[3, 5, 6], **{"name":"zhangsan"})
func(2, 3, 5, 6, y="34", z=34)

4. 函数返回值

(1)无返回值

def func():
    """ """
    pass    # 无返回值时默认返回 None

(2)一个返回值

def func(x):
    """ """
    return x+1    # 一个返回值时返回对应的Object

(3)多个返回值

def func(x):
    """ """
    return x+1, x*2, x**2    # 多个返回值时返回一个元组

print(func(3))  # (4, 6, 9)

5. 函数作用域

def func():
    print("func")

def func2():
    print("func2")
    return func   # 返回func在内存中的地址

res = func2()
print(res)
print(res())

二、局部变量和全局变量

name = "zhangsan"  # 全局变量

def func():
    # name = "lisi"  # 局部变量:只在函数内部起作用
    global name     # 引入全局变量,若没有global,优先读取局部变量,没有则读全局变量(只能读,不能修改)
    name = "哈哈"
func()
print(name)

 

三、递归函数

在一个函数内部调用函数自身,则为递归函数。

特性:

(1)必须有一个明确的结束条件

(2)每进入一次递归,问题规模相比上一次都应该有所减少

(3)递归效率不高,递归层次过多会导致栈溢出

# 示例
def func(n):
    print(n)
    if int(n/2) == 0:
        return n
    return func(int(n/2))
func(10)

四、匿名函数

func = lambda x: x+1    # 匿名函数:关键字lambda,x为形参,x+1为返回值
print(func(10))

func1 = lambda x, y: x if x > y else y
print(func1(67, 3))

func2 = lambda x, y, z: (x+1, y*2, z**2)
print(func2(7, 3, 4))

五、函数式编程

1. 特性:

(1)不可变:不用变量保存状态,不修改变量(没有任何赋值操作)。

(2)第一类对象:函数即变量,函数名可以当做参数传递,也可以当做返回值。

(3)尾调用:在函数的最后一步调用另一个函数(最后一步不一定是最后一行)。

六、高阶函数

高阶函数:一个函数接收另一个函数作为形参,或者一个函数把另一个函数当做返回值返回,那么这个函数就称为高阶函数。

def foo(n):
    return n*2
def foo1(n):
    print(n)
foo1(foo(2))    # 把函数当做参数传递给另一个函数

def foo2():
    return foo  # 把函数当做返回值
n = foo2()
print(n(3))

七、常用内置函数

print(abs(-6))      # 求绝对值
print(all([34, 4, -1, 3]))  # 判断可迭代对象的所有元素是否都为True
print(bin(4))       # 返回整数的二进制

# 空、None、0 的bool值为false
print(bool(""))
print(bytes("你好", encoding="utf-8"))    # 转换成字节
print(chr(98))      # 返回整数对应的字符
print(dict(a='a', b='b', t='t'))    # 创建一个字典

# 把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b),可用于分页处理
print(divmod(10, 3))
# 用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标
print(list(enumerate(["苹果", "香蕉", ""])))
# 不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表
print(dir())

# 执行一个表达式,并返回结果;把字符串的表达式进行运算
print(eval('pow(2,3)'))
print(eval("3+4*(6-2)"))
print(hash('test')) # 获取一个对象(不可变数据类型)的hash值

1. map()

根据提供的函数对指定序列做映射。

def square(n):
    return n**2
res = map(square, [1, 2, 3, 4, 5])
for i in res:
    print(i, end=", ")
print()
res = map(lambda x:x**2, [1, 2, 3, 4, 5, 6])
print(list(res))

2. filter()

过滤序列,过滤掉不符合条件的元素,符合条件的元素组成一个新的列表返回(Python 2.7返回列表,Python3返回迭代器对象)。

def is_odd(n):
    return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(list(newlist))

3. reduce()

from functools import reduce

# reduce() 在 Python3 已被移除到 functools 模块
def add(x, y) :            # 两数相加
    return x + y

# 必须传入有两个参数的函数,将前两个元素的执行结果和第三个元素作为参数传递给函数
print(reduce(add, [1, 2, 3, 4, 5]))

猜你喜欢

转载自www.cnblogs.com/sharef/p/9418153.html