day10:函数进阶

1,函数的命令空间(内置命名空间,全局命名空间,局部命名空间),内置大于全局大于局部

2,内置命名空间,就是Python解释器一启动就可以使用的名字,存储在内置命名空间中,内置的名字(print,input,list,tuple等等),启动解释器的时候加载到内存里面;

3,全局命令空间,是在程序从上到下被执行的过程中一次加载到内存的,放置了我们所有的变量名和函数名;

4,局部命名空间,就是函数内部定义的名字,当调用函数的时候,才会产生这个名称空间,随着函数执行的结束,这个名称空间就又消失了

5,在局部,可以使用全局,内置空间中的名字;在全局,可以使用内置空间中的名字,但是不能用局部中中的名字;在内置空间,不能使用局部或者全局的名字

6,在正产改的情况下,直接使用内置的名字,当我在全局中定义了和内置名字空间中同名的名字时,我们会使用全局的名字

7,当我自己有的时候,我就不找上一级要了,当我自己没有的时候,就找上一级要,上一级也没有,再找上一级,都没有,就报错

8,函数名的本质是函数的内存地址,函数名加上括号,是函数的调用,函数的内存地址加上括号也是函数的调用,估计没人会这么用

9,作用域有两种:全局作用域(内置和全局命名空间中的名字术语全局作用域),局部作用域,作用在局部(函数,局部名字空间中的名字术语局部作用域)

10,对于不可变数据类型,在局部可以直接查看全局作用域中的变量,但是不能修改,如果想要修改,需要在程序一开始的时候添加global声明。

11,如果一个局部函数内声明了一个global的变量,那么这个变量在局部的所有操作,都是对全局变量的操作

12,locals和globals 查看全局和局部变量,加上global就不在是局部变量了,globals()永远打印全局变量,locals根据所在位置输出

a = 1
def func():c =1a = 2# global a# a = 2print(locals())func()运行结果:
{'c': 1, 'a': 2}a = 1
def func():c =1# a = 2global aa = 2print(locals())func()
运行结果:
{'c': 1}

13,上一小节复习,所有的函数只定义不调用就一定不执行,先定义后调用,直接写函数名() 这样不接收返回值,返回值=函数名() 接收返回值 ,只写一个return是巍峨结束一个函数,返回一个值,结束了函数,且返回一个值

14,复习,形参来说,位置参数必须传,*args 可以接收零到多个按位置传入的参数,默认参数,可以不传,**kwargs:动态参数,可以接收任意多个按照关键字传递的参数。

15,复习,实参来说,调用的时候,按照位置传参数,按照关键字传参数,可以混用,但是位置必须在关键字之前,不能对一个参数重复赋值。

16,默认参数的陷阱问题,如果默认参数是一个可变的数据类型,那么每一次调用函数,的时候,如果不传值,就公用这个数据类型的资源

def func(li = []):li.append(1)print(li)func()
func()
func()
func()
func([])  # 这儿因为传入了新的参数列表,不共用,所有其他的使用默认参数的,都共用那一个列表
func()运行结果:
[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
[1]
[1, 1, 1, 1, 1]

17,对于字典也是一样的,因为key 不能重复,所以每次值是可以更新的,同样有陷阱

def func(k,dict1={}):dict1[k]='v'print(dict1.items())func(1)
func(3)
func(4)
func(5)
func(6,{})
func(7)运行结果:
dict_items([(1, 'v')])
dict_items([(1, 'v'), (3, 'v')])
dict_items([(1, 'v'), (3, 'v'), (4, 'v')])
dict_items([(1, 'v'), (3, 'v'), (4, 'v'), (5, 'v')])
dict_items([(6, 'v')])
dict_items([(1, 'v'), (3, 'v'), (4, 'v'), (5, 'v'), (7, 'v')])

18,三元运算符

# 定义函数找出两个数中的最大值
def max_of_two(a,b):return a if a>b else b#定义函数,找出三个数中的最大值
def max_of_three(a,b,c):z = max_of_two(a,b)  # 函数的嵌套调用return max_of_two(z,c)print(max_of_three(3,4,5))

19,函数的嵌套定义

def outer():def inner():print("i am inner")outer()   # 这样写并不会打印里面的那句话,因为只是定义了然,然后没有调用,就结束了
def outer():def inner():print("i am inner")inner()  # 加上这句话才会打印的

outer()   # 这样写并不会打印里面的那句话,因为只是定义了然,然后没有调用,就结束了

20,内部函数虽然不能直接修改外部函数的变量,但是可以看和使用

def outer():a = 1def inner1():b = 2print(a)print("i am inner")def inner2():print(a,b)print("i am inner2")inner2()inner1()  # 加上这句话才会打印的
outer()运行结果:
1
i am inner
1 2
i am inner2

21,本空间有的变量,不会向上一层去找了就,申明了global的变量,只会对全局里面的变量进行操作

a =1
def outer():a = 10def inner1():a = 100 # 本空间有的变量,不会向上去找了就print(a)print("i am inner")def inner2():global a # 不可变数据类型的修改,这样定义只是修改全局变量的a 并不会修改函数内的aa +=1  # 不可以这样修改print(a)print("i am inner2")inner2()inner1()  # 加上这句话才会打印的
outer()运行结果:
100
i am inner
2
i am inner2

22,不可变数据类型的修改,如果想要修改上层函数内部的变量,而不是全局变量,可以用nonlocal,会一层层往上找,但是不会用全局空间里面的变量

nonlocal只应用于局部变量,找上层中离当前函数最近的一层的局部变量,声明了nonlocal的内部函数的变量修改会影响到离当前函数最近一层的局部变量

对全局无效,对局部也只是对最近的有这个变量的一层有效。

a =1
def outer():a = 10def inner1():a = 100 # 本空间有的变量,不会向上去找了就print(a)print("i am inner1")def inner2():nonlocal aa +=1  print(a)print("i am inner2")inner2()inner1()  # 加上这句话才会打印的
outer()运行结果:
100
i am inner1
101
i am inner2
a =1
def outer():a = 10def inner1():# a = 100 # 本空间有的变量,不会向上去找了就print(a)print("i am inner1")def inner2():nonlocal aa +=1print(a)print("i am inner2")inner2()inner1()  # 加上这句话才会打印的
outer()运行结果:
10
i am inner1
11
i am inner2
a =1
def outer():# a = 10 #注释掉def inner1():# a = 100 # 注释掉print(a)print("i am inner1")def inner2():nonlocal aa +=1print(a)print("i am inner2")inner2()inner1()  # 加上这句话才会打印的
outer()运行结果:File "/Users/guolixiao/PycharmProjects/lisa's_practise/boys/10.2.py", line 28nonlocal a^
SyntaxError: no binding for nonlocal 'a' found

23,后端语言有好多种,Python/java/C/C++/JAVA/PHP,每个语言占得分量差不多,前端语言有HTML/CSS/JS, 其中JS占据着举足轻重的地位。

24,函数名就是变量地址,函数名可以赋值,函数名可以作为容器类的元素

def func():print("happy day")func2 = func # 注意不加括号才表示地址,加了括号表示调用
li = [func2,func]
for i in li:print(i)i()# 其实就理解为普通变量用
运行结果:
<function func at 0x10638e840>
happy day
<function func at 0x10638e840>
happy day

25,函数名可以作为函数的参数

def func():print("happy day")def wahaha(f):f()wahaha(func)
运行结果:
happy day

26,函数名可以作为返回值

def func():print("happy day")def wahaha(f):f()return f  #函数名可以作为返回值
qqxing=wahaha(func)
qqxing()运行结果:
happy day

27,函数名可以在运行是创建,可以当函数参数或者返回值,可以做容易类型的元素,可存入变量的实体

28,闭包:嵌套函数,内层函数使用外层函数的变量,不适用的话,就不是闭包

def outer():a = 1def inner():print(a)# 这就是一个闭包

29,双下函数决定是否是闭包 __clousure__

def outer():a = 1def inner():print(a)print(inner.__closure__)
outer()运行结果:
(<cell at 0x10c269e88: int object at 0x10c01ec00>,)def outer():a = 1def inner():print(1)  #不再调用a print(inner.__closure__)
outer()运行结果:
None
def outer():a = 1def inner():print(a)print(inner.__closure__)
outer()
print(outer.__closure__)运行结果:
(<cell at 0x10edb6e88: int object at 0x10eb6ac00>,)
None

30,如何在外部使用内部的函数?return

def outer():a = 1def inner():print("inner")print(a)return innerinn = outer()
inn()运行结果:
inner
1

31,写一个闭包的简单例子

from urllib.request import urlopendef get_url():url = "http://www.xiaohuar.com/"def get():ret=urlopen(url).read()print(ret)return getget_func = get_url()
get_func()
get_func()# 实现了一个简单的闭包

 

转载于:https://www.cnblogs.com/lisa-blog/p/10067898.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql导入source注意点

mysql的导入导出要注意字符集&#xff0c;防止查询乱码&#xff01; 导入前设置字符集 set names utf8; //导入指定编码source /xxx.sqlcommit;

哔哩哔哩修改视频速度

按住f12,打开控制台&#xff0c;先输入 const video document.querySelector("video"); video.play() // 开始 video.pause() // 暂停 video.playbackRate3 // 三倍速

编译预处理

C语言编译中&#xff0c;什么时候应该使用32位编译程序? 32位编译程序应该在32位操作系统上使用。由32位编译程序生成的32位程序比16位程序运行得更快&#xff0c;这正是任何32位的东西都很热门的原因。有那么多不同版本的Microsoft Windows&#xff0c;它们和哪种编译程序组成…

去除List集合中的重复值(四种好用的方法)

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 最近项目中需要对list集合中的重复值进行处理&#xff0c;大部分是采用两种方法&#xff0c;一种是用遍历list集合判断后赋给另一个list…

jQuery---过滤选择器

4、过滤选择器 过滤选择器主要是通过特定的过滤规则来筛选出所需的DOM元素&#xff0c;过滤规则与CSS 中的伪类选择器语法相同&#xff0c;即选择器都以一个冒号(:)开头。按照不同的过滤规则&#xff0c; 过滤选择器可以分为基本过滤、内容过滤、可见性过滤、属性过滤、子元素过…

安装Frida抓包工具

curl https://bootstrap.pypa.io/get-pip.py | python3 pip install frida pip install frida-tools

正则介绍_grep

2019独角兽企业重金招聘Python工程师标准>>> 10月16日任务 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 grep基本用法 grep [-cinvABC] word filename centos7.x版本的grep实则为grep --colorauto-c 显示匹配到的行数[rootlocalhost ~]# cp /etc/passwd /tmp [rootl…

[国家集训队]middle

嘟嘟嘟 有谁能想到这题会用到主席树呢&#xff1f;&#xff08;不愧是WJMZBMR出的题&#xff09; 首先考虑如果区间是固定的话&#xff0c;中位数该怎么求。 没错&#xff0c;二分。如果大于当前二分值\(mid\)的数比小于\(mid\)的数多&#xff0c;说明\(mid\)还可以再变大&…

Java List<Object>去掉重复对象-java8

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 public List<String> removeStringListDupli(List<String> stringList) {Set<String> set new LinkedHashSet<&g…

Vue + webpack 项目配置化、接口请求统一管理

准备工作 需求由来&#xff1a; 当项目越来越大的时候提高项目运行编译速度、压缩代码体积、项目维护、bug修复......等等成为不得不考虑而且不得不做的问题。 又或者后面其他同事接手你的模块&#xff0c;或者改你的bug时避免人家看的眼痛以及心里千百句mamaipi...问候。 并且…

Python实现Adaboost

1.Adaboost概念 提升方法的思路是综合多个分类器&#xff0c;得到更准确的分类结果。 即“三个臭皮匠顶个诸葛亮”。《统计学习方法》称AdaBoost是提升算法的代表&#xff0c;所谓提升算法&#xff0c;指的是一种常用的统计学习方法&#xff0c;应用广泛且有效。在分类问题中&a…

Java List<T>去重方法,引用类型集合去重

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 一、实体类中要重写比较方法equals&#xff0c;最好也重写hashcode方法 public class WorkWeightDto implements Serializable {privat…

MyBatis知识点

一、MyBatis简介 1.1 框架概念 框架&#xff0c;就是软件的半成品&#xff0c;完成了软件开发过程中的通用操作&#xff0c;程序员只需很少或者不用进行加工就能够实现特定的功能&#xff0c;从而简化开发人员在软件开发中的步骤&#xff0c;提高开发效率。 1.2 常用框架 MVC…

android studio : clang++.exe: error: invalid linker name in argument '-fuse-ld=bfd

公司jenkins上的C编译器最近换成了clang&#xff0c;今天更新了代码发现本地的C/C代码用NDK编译不过了&#xff0c;提示&#xff1a; “clang.exe: error: invalid linker name in argument -fuse-ldbfd” 解决办法&#xff1a; 将Android.mk文件中的“LOCAL_LDFLAGS -fuse-ld…

Git知识点

一、Git简介 1.1 项目的版本管理 在项目开发过程中&#xff0c;项目没开发到一个节点就会对当前项目进行备份&#xff0c;这个备份就是项目的一个版本&#xff1b;当我们继续开发一个阶段后&#xff0c;再次进行备份&#xff0c;就生成新的版本——多个版本的集合就是项目的版…

(1)初始化项目

2019独角兽企业重金招聘Python工程师标准>>> &#xff08;1&#xff09;初始化项目 1 使用vue-cli初始化项目 vue init webpack my-renren得到以下输出&#xff1a; ? Project name my-renren ? Project description A Vue.js project ? Author neumeng <4048…

C语言变量

C语言二进制、八进制、十六进制详解 什么是二制制? 在数学计算中&#xff0c;二进制计数系统的公分母是最小的&#xff0c;它以2为基数。你还记得在小学或中学时所学的不同的计数系统吗?笔者在上小学时&#xff0c;曾在一堂数学课中学过以6为基数的计数系统&#xff1b;你先…

Spring Data JPA - 参考文档 地址

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Spring Data JPA - 参考文档 文档地址

JS内置方法(Array)

concat() 用于连接两个或多个数组&#xff0c;该方法不会改变现有的数组&#xff0c;而是返回被连接数组的一个副本。join() 把数组中的所有元素放入一个字符串&#xff0c;元素是通过指定的分隔符进行分隔的。若省略了分隔符参数&#xff0c;则使用逗号作为分隔符。push() 向…

模切ERP和免费OA系统是互相结合提高效率

模切ERP和免费OA系统是互相结合提高效率在模切行业中&#xff0c;模切ERP在管理上的作用占了很大的比重&#xff0c;但是免费OA在管理上的地位都不容忽视的。点晴OA的核心问题是如何提高日常的办公效率问题。因此点晴OA系统里包含的功能是非常全面&#xff0c;如&#xff1a;办…