python函数式编程-概念理解

函数式编程-高级

一、函数的参数类型

1. 不可变类型参数
  • 不可变类型参数有:整数,字典,字符串
  • 传递不可变类型参数,不会影响参数本身。

代码:

a = 100
print(f"函数外边a的id值----->{id(a)}")
print(f"a的值为{a}")

def func(b):
    # a和b的id值相同
    print(f"函数参数传递过来的id值----->{id(b)}")
    print(f"b的值为:{b}")
    # 修改b的值
    b = 200
    print(f"修改后b的id----->{id(b)}")
    print(f"修改后b的值为:{b}")

func(a)
print(f"b值修改后,a的id值----->{id(a)}")
print(f"b值修改后,a的值:{a}")

结果:

函数外边a的id----->140729229159920
a的值为100
函数参数传递过来的id----->140729229159920
b的值为:100
修改后b的id----->140729229163120
修改后b的值为:200
b值修改后,a的id----->140729229159920
b值修改后,a的值:100
2. 可变类型参数
  • 可变类型参数有:列表、字典
  • 传递可变类型参数,如果直接重新赋值,那么也不会影响参数本身,如果直接在原对象基础上进行
    修改会影响。

代码:

list_outer = [1, 2, 3]
print("list_outer的值和id值:", list_outer, id(list_outer))

def func(list_inner):
    print("list_inner的值和id:", list_inner, id(list_inner))
    list_inner.append(4)
    print("修改后list_inner的值和id:", list_inner, id(list_inner))

func(list_outer)
print("修改后list_outer的值和id值:", list_outer, id(list_outer))

结果:

list_outer的值和id: [1, 2, 3] 1615815397768
list_inner的值和id[1, 2, 3] 1615815397768
修改后list_inner的值和id[1, 2, 3, 4] 1615815397768
修改后list_outer的值和id: [1, 2, 3, 4] 1615815397768

二、命名空间

1. 概念

命名空间指的是保存程序中变量名和值的字典。字典的key是变量的名称,value是变量的值。
如:{“name”: “zr”, “age”:18}

2. 分类
  • 局部命名空间:记录函数的变量。包括函数的参数和函数内定义的变量。
  • 全局命名空间:记录模块(一个.py文件)的变量。包括函数、类、其他导入的模块。
  • 内置命名空间:记录解释器内置的变量。任何模块都可访问它,包括内置的函数和异常。
    在这里插入图片描述
3. 访问命名空间
  • locals():访问局部命名空间:根据调用的位置有关系
  • globals():访问全局命名空间:与调用位置无关
def func1(name, age):
    """命名空间的访问"""
    num = 10
    loc = locals()  # 局部命名空间
    print(loc)      # {'name': 'tom', 'age': 18, 'num': 10}

func1("tom", 18)
glo = globals()		# 全局命名空间
print(glo)
"""
{'__name__': '__main__', '__doc__': None, '__package__': None,
 '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000001B88D974088>,
 '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 
  '__cached__': None, 'func1': <function func1 at 0x000001B88D9C3B88>, 'glo': {...}}
"""
4. 命名空间的加载顺序
  • First:内置命名空间(程序运行前加载)
  • Second:全局命名空间(程序运行时加载)
  • Third:局部命名空间(程序运行中,函数被调用时才加载,当函数返回结果或抛出异常时,被删除。每个递归调用的函数都有自己的命名空间。)
5. 命名空间的查找顺序

局部命名空间 -------> 全局命名空间 --------> 内置命名空间

三、作用域,局部变量,全局变量

1. 概念
  • 作用域:变量在程序中的可应用范围。
  • 局部变量:在函数中定义的变量,只在函数内部生效。
  • 全局变量:在程序一开始定义的变量,在整个程序中起作用。
2. 作用域的分类
  • Local(函数内部):局部作用域
  • Enclosing(嵌套函数的外层函数内部):嵌套作用域(闭包)
  • Global(模块全局):全局作用域
  • Built-in(内建):内建作用域
    作用域图解
    注意:
    在Python中,模块(module),类(class)、函数(def、lambda)会产生新的作用域。而其他代码块不会,也就是说,类似分支语句、循环语句、异常捕捉等的变量是可以全局使用的。
3.全局变量和局部变量
  • 全局变量是不可变数据类型,函数无法修改全局变量的值。
  • 全局变量是可变数据类型,函数可以修改全局变量的值。
name = "zs"  # 全局变量
def func(arg1):
    name = "ls"  # 局部变量
    age = arg1

print(name)  # zs
func(23)
# print(age)    # 报错 NameError: name 'age' is not defined

四、global 和 nonlocal关键字

1. global

global关键字可以将局部变量变成一个全局变量。

格式: global 变量名
n = 20
def func():
	global n # 将n声明为全局变量
	n = n+1
	print(n) # 21
func()
print(n) # 21
2. nonlocal

nonlocal关键字可以修改外层(非全局)变量。
注意:必须得是嵌套函数,nonlocal才会生效。

	格式: nonlocal 变量名
def func():
	age = 20
	def inner():
		# global age # 函数外无age变量,声明为全局变量会错误
		nonlocal age # 将内层变量age声明为外层age
		age = age + 1
		print(age) # 21
	inner()
	print(age) # 21
func()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值