Python16_函数-续

函数的参数类型

  • 引用类型与普通类似
  • 引用类型:存储的时候存的不是值,而是地址
l1 = [1, 2, 3, 4]
l2 = l1  # 将l1的地址赋予l2

# 普通类型:浮点、bool、字符串,整数
# 除了这些之外,都是引用类型
# 普通类型赋值的时候传的是值本身,而引用类型赋值的时候传的是地址
# 注意引用类型和普通类型作为参数时,引用类型操作为原数据,可以直接改变,而普通类型操作的是拷贝,所以如果要对普通类型在函数体内更改数据,要注意返回,或者如果是全局变量,注意用global声明(如果局部没有同名的变量,这里的global只是起到方便阅读的作用)

a = 1
b = a
print(id(a), id(b))
b = 3
print(id(a), id(b))


def power(numbers):
    numbers = [x ** 2 for x in numbers]
    return numbers


numbers = [1, 2, 3, 4, 5]
numbers = power(numbers)
print(numbers)


# caution:为了避免在函数内改变函数外的数据,往往在函数内部复制一份,然后用复制后的数据进行操作

闭包

def fun():
    print("hello woirld")

fun()
print(fun)
f = fun
f()


# 函数名就是函数的地址,函数相当与一个变量

# 函数的嵌套
# 闭包的前提是函数的嵌套
# 闭包的作用:
# 建议:对于全局变量,加g_,eg:如果有全局变量a,则命名为g_a
# caution:如果是列表或者字典等作为全局变量,则在函数中可以不加关键字,直接进行使用

def outer():
    a = 10
    def inner():
        # 在python中内部函数不能直接修改外部的数,但是可以读;内层函数访问变量时会先从自己查找,如果找不到,就会层层向上查找
        print("hello inner")
        global a  # 说明使用的是全局变量,此时就可以对全局变量进行修改
        # nonlocal 表明非局部变量
        # 建议:如果使用的是全局变量或非局部变量,建议加上关键字,便于阅读;或在函数的文档说明里面进行说明
        a = 10
        print(a)

    return inner


f = outer()
f()

递归

def factorial(n):
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)


print(factorial(10))

print("-" * 50)


# 斐波拉契数列
def fib(n):
    if n == 1 or n == 2:
        return 1
    else:
        pre = fib(n - 1)
        rail = fib(n - 2)
        return pre + rail


def fib_cycle(n):
    pre_number = 1
    rail_number = 1
    print(pre_number, end=" ")
    if n == 1 or n == 2:
        return 1
    for _ in range(n - 2):
        pre_number, rail_number = rail_number, pre_number + rail_number  # 元组的操作
        print(pre_number, end=" ")
    return rail_number


print(fib(6))
print(fib_cycle(6))

高阶函数

  • 函数的参数或函数的返回值是函数的函数
def handle(func, *param):
    return func(*param)

def my_sum(*param):
    sum = 0
    for i in param:
        sum += i
    return sum

print(handle(my_sum, 1, 2, 3, 4, 5))
  • 系统中自带的高阶函数
# map(func,interable)   #该函数会把iterable中的数据一次传递给func函数处理,最后把处理的结果返回
# 需求:将列表[1,2,3,4,5]中的每个元素平方
def power(n):
    return n ** 2


res = map(power, [1, 2, 3, 4, 5])

print(list(res))
print("-" * 50)
res = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
for v in res:  # res是一个迭代器,内部相当于一个指针,用一次指针往后移一次,所以遍历后print(list(res))为空
    print(v, end=" ")
print()
print(res)

# reduce(func, iteralbe) # 需要 from functools import reduce 。累积操作,func函数必须接收两个参数,reduce会把运行结果当作一个参数,然后从iterable再取出一个数据当作另一个参数
# 工作原理:最开始把列表中的1和2当作参数传入,然后将1*2的结果当作参数1,列表中的3当作参数2,依次迭代
from functools import reduce

mylist = [1, 2, 3, 4, 5]
res = reduce(lambda x, y: x * y, mylist)
print(res)

# filter(func,iteralbe) 过滤器,根据func来过滤iterable,将iterable中的数据传入函数,如果函数返回True,就保留该数据,否则就不保留,即func的返回值为bool类型
list_one = [1, 2, 3, 4, 5, 6, 7, 8, 9]
res = list(filter(lambda x: x % 2 == 1, list_one))
print(res)

# sorted(iterable,key=None,reverse=False) #对数据进行排序,key用来制定排序的规则,值是一个函数,reverse用来指定是否降序
list_two = [1,3,234,-34,1,24,-234,3,3,6,]
# res = list_two.sort()   #就地排序,会对原数据进行更改
# print(res)
new_list = sorted(list_two,key=abs) 


ps:可变类型与不可变类型
a = 100
def test(num):
	num += num
	print(num)
test(a)	#会发现两次的输入不一样,因为整数是不可变类型,所以在函数内部新建了个变量
print(a)

a = [100]
test(a)	#会发现两次的输出一样,因为列表是可变类型,所以直接改变原数据
print(a)

猜你喜欢

转载自blog.csdn.net/qq_34873298/article/details/90350011