函数式编程-高级

一、函数的参数类型

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>,

'__spec__': None, '__annotations__': {}, '__builtins__': ,

'__cached__': None, 'func1': , '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()

python的函数式编程_Python函数式编程-概念理解,python相关推荐

  1. 从零学python黑马程序员_Python实战编程--从零学Python/Python应用编程丛书

    导语 内容提要 黑马程序员编著的<Python实战编程--从零学Python>涵盖了Python开发的核心知识.其中,第1-13章主要讲解的是Python的核心语法,包括基本概念和语句.风 ...

  2. python完全支持面向对象编程_Python 面向对象编程概要

    面向对象三大特性 面向对象的三大特性是指:封装.继承和多态. 封装 封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容. 所以,在使用面向对象的封装特性时,需要: 将内容封装到某处 ...

  3. python游戏使用教程_PYTHON游戏编程入门_IT教程网

    资源名称:PYTHON游戏编程入门 内容简介: Python是一种解释型.面向对象.动态数据类型的高级程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Py ...

  4. python socket编程_Python Socket编程实现网络编程

    对于有经验的开发人员来说,掌握的编程语言应该是不少的.在这些编程语言中,网络编程的应用时必不可少的.其中Python也是这样的编程语言.我们今天将会在这里为大家详细介绍一下Python Socket编 ...

  5. python课设代码_python课程编程题汇总(上)

    python编程题汇总 众所周知,由于疫情的原因,大家都在上网课,我也不例外啦~ 用这个贴子来记录也和大家分享一下我们课上的编程讨论题 中篇在此→python课程编程题汇总(中) 下篇在此→pytho ...

  6. python多进程编程_python并发编程中的多进程(代码实现)

    一.multipricessing模块的介绍 python中的多线程无法利用多核优势,如果想要充分的使用多核CPU资源,在python中大部分情况下需要用多线程,python提供了multiproce ...

  7. python 窗体编程_python窗体编程

    广告关闭 云服务器1核2G首年99年,还有多款热门云产品满足您的上云需求 python里的图形化界面(gui)模块主要有tkinter(python自带).pyqt.wxpython,我们这节主要讲解 ...

  8. python 网络编程_Python网络编程(原书第2版)

    Python网络编程(原书第2版) 作者:(美)埃里克·周(Eric Chou) 著 出版日期:2019年06月 文件大小:54.50M 支持设备: ¥68.00 适用客户端: 言商书局 iPad/i ...

  9. python类详解_python面向对象编程:python类和实例讲解

    东尧爱分享 这是东尧每天一篇文章的第51天 东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福. 1 什么是对象 在python里面,一切皆为对象.也就是说python里的所有数据都 ...

  10. python采用面向对象编程模式吗_如何理解 Python 中的面向对象编程?

    现如今面向对象编程的使用非常广泛,本文我们就来探讨一下Python中的面向对象编程. 作者 | Radek Fabisiak 译者 | 弯月,责编 | 郭芮 以下为译文: Python支持多种类型的编 ...

最新文章

  1. 神经网络基础知识总结
  2. 01.The Introduction of Linux
  3. mysql触发器 存储过程_mysql触发器和存储过程
  4. mask rcnn算法分析_在modelarts上部署mask-rcnn模型
  5. Linux 网卡相关操作
  6. Android开发中StackOverflowError错误实例分析
  7. 前端:根据类型获取正则表达式字符串​
  8. WPF 实现大转盘抽奖~
  9. C语言SetConsoleCursorPosition()函数来定位光标位置
  10. GitHub使用教程
  11. 数据挖掘期末论文要求
  12. mysql 客户端命令行_强大的工具 MySQL客户端命令行应用技巧
  13. 东汉十三州以及各个郡的说明
  14. 如何用两个栈实现一个队列
  15. 发送短信工具类(亿美短信平台接口)
  16. KOD: Linux 命令行安装
  17. Spring Cloud Ribbon 详解
  18. linux和windows认证sssd,linux – 使用sssd和Active Directory集成的麻烦
  19. html table内边框线条,HTML_TABLE内外边框
  20. Centos6.5离线安装中文输入法

热门文章

  1. 特别实用的 6 款 Python 特殊文本格式处理库推荐
  2. python 小波去噪,用Pywavelet去噪信号?
  3. 2020年电大c语言程序设计作业1答案,2019年最新电大C语言程序设计作业答案.doc
  4. samba 问题Windows能看到文件夹但是不能打开(路径写错了)
  5. 计算机组成原理(哈工大刘宏伟)135讲(一)
  6. 王道计算机考研 数据结构 (图-上)
  7. linux环境下安装mysql 8.0
  8. mysql匹配数据结构_MySQL索引背后的数据结构及原理
  9. oracle+restore+pfile,RAC(11gR2) OCR BACKUP RESTORE
  10. 页码太靠上怎么办_有些宝宝到了二岁不会说话怎么办