天天看点

python——函数式编程,引用全解

9.函数式编程

  • 函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
  • 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

    函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

  • 关键字def
  • 定义如下
def function(参数1,参数2,...):
代码块
return ???

# 调用 
function(参数1,参数2,...)
      

参数传

在 python 中,类型属于对象,变量是没有类型的:

def sayHello():
print("hello")

sayHello()

def func2(i):
print(type(i))

func2(1)  # <class 'int'>
func2("1")  # <class 'str'>
func2(1.0)  # <class 'float'>
func2(True)  # <class 'bool'>
func2([1, 2, 3, 4])  # <class 'list'>
func2((1, 2, 3))  # <class 'tuple'>
func2({1, 2, 3})  # <class 'set'>
func2({1: "你好", 2: "吃了嘛", 3: "在干啥"})  # <class 'dict'>
      

返回值

在python中返回值可以没有也可以有多个!没有返回值时默认为None

# 以 *开头的参数叫不定长参数,一个函数的不定长参数只能有一个且只能是最后一个参数,调用时会以元组的形式传入
def func1(a, *args):
print(args)
return a, args


def func2():
return


ret = func1(1, 2)  # (2,)
print(ret)  # (1, (2,))


def func3(*args):
return args


a, b, c = func3(1, 2, 3)  # 可以通过这种方式取出元组里的值

print(a)
print(b)
print(c)
      

作用域

  • 直接卸载外边的变量和函数等等的一切的命名空间称之为全局作用域
  • 函数内部定义的变量函数等,命名空间称之为函数作用域或局部作用域
  • 函数内部可以直接访问全局作用域的变量和函数
a = 10
b = 20


def func1():
b = 10
# print(a)  # 直接访问外部的
print(b)  # 当函数内部有这个变量时会优先使用内部的变量
print(globals())  # 查看命名空间全局作用域的命名空间

# 如果 要在函数里顶一个全局变量或者使用全局变量覆盖要先声明
global c  # 一般不会在这里定义全局变量
c = 10

# 如果我们希望在函数里直接修改全局作用的变量需要先声明否则无法修改,
global a  # 一般放在开头
a = a - 10


func1()
print(c)
print(a)
      

值传递与引用传递

  • 值传递是指将数值传递给参数
  • 引用传递是指把变量的引用传递给参数
  • 在python中是值传递
a = 10

def test(a):
print("修改前a", a)
a = a - 10  # 
print("修改后a", a)

test(a)
print(a)  # 函数内部并不会改变外部的变量
      

函数的引用

  • 函数的引用就是把函数本身作传递给某个变量
def function():
print("我是fun1")

a = function  # 函数的引用,将function这个函数像变量一样赋值给a

a()  # 调用 function
      

lambda函数

  • lambda 函数是匿名函数
  • 定义如下
lambda 参数1,参数2...: 语句
      
  • 用法
a = 10
b = 10

fun = lambda x, y: x > 1 and y < 10 

c = fun(a, b)  # False
print(c)

print((lambda x: x > 10)(a))  # False