一。命名关键字参数。(了解)

  1.在函数阶段,写在*与** 可变长参数之间的形参称为命名关键字参数。

  在给命名关键字参数传值时,只能用关键字为其传值。诸如以下函数的形参

def func(x,y=,*args,z=,m,**kwargs):
print(x,y)
print(args)
print(z,m)
print(kwargs)

  z=3,m,这些函数型参看似会报错,因为关键字参数写在了位置参数的前面,但其实是在*args和**kwargs之间的位置参数。所以,给其传参时统一使用关键字传参

func(1,2,1,2,3,4,5,6,7,78,8,9,0,z=69,m=999,o=666999,l = 999666)

二。函数对象

  1.函数是第一类对象:函数名指向的值可以被当成参数传递。

  如同变量名一样,函数的名字也指向一个地址,打印变量名就是打印其地址

def func():
print('from func')
# print(func)
print(id(func))
f = func
func()
print(f)
f()

  像函数名被print时,输出的就是它的详细内存地址,而当函数名接触到()时会被优先执行,包括使用另一变量指向该函数名,如f。运行结果如下

1982808399520
from func
<function func at 0x000001CDA8971EA0>
from func

  2.函数名可以被当做参数传递给其他函数

def func():
print('from func') def index(args):
print(args)
args()
print('from index')
# index(1)
index(func)

  上代码中在函数调用阶段,func就被以函数名的方式赋值给index的参数,而index将其函数名打印,输出的也就是func的内存地址,再运行该函数,最后输出自己的打印,所以输出的结果应该是:

<function func at 0x000001E05AB91EA0>
from func
from index

  3.函数名可以 被当作函数的返回值。

def index():
print('index') def func():
print('func')
return index
res = func()
print(res)
res()

  上述代码中,func将index函数名返回给func函数,所以func()所代表的返回值 就是index并执行,将index赋值额、给res并打印,其结果必定是index的内存地址。res()代表的是执行index函数所以结果如下:

func
<function index at 0x000002238A071EA0>
index

  4.函数名可以作为容器类型的参数

def func():
print('func')
print(func())
l = [1,2,func,func()] # [1,2,<function func at 0x000001F7D79899D8>,None]
print(l)

  函数名所代表的集合到列表中 ,可以被用来调用。运行结果如下

func
None
func
[1, 2, <function func at 0x00000267F2071EA0>, None]

  这种特性可以被用来编写可添加式菜单,如

func_dict = {
'':register,
'':login,
'':transfer,
'':shopping,
'':pay,
}
while True:
print(msg)
choice = input('请现在你想要执行的功能>>>:').strip()
if choice in func_dict:
func_dict.get(choice)() # 函数名()

  将各个函数模块都添加到字典,然后根据用户输入的key值获取其 存储的函数名,在以函数名()的形式执行代码。如此实现可添加的菜单。

三。函数的嵌套调用

  在函数的编写中,也可以调另外一个函数,只要在调用主函数之前定义该函数即可正常运行:

def my_max(x,y):
if x > y:
return x
return y def my_max4(a,b,c,d):
res1 = my_max(a,b)
res2 = my_max(res1,c)
res3 = my_max(res2,d)
return res3
print(my_max4(1,2,10,4))
#输出结果>>>10

四.函数的嵌套定义

  在函数的定义阶段,也可以通过其他函数的定义来实现某种功能。

def outer():
x = 1
print('outer')
def inner():
print('inner')
# print(inner)
return inner res = outer()
print(res)
res()
#输出结果>>>outer
#<function outer.<locals>.inner at 0x000001875EBBC9D8>
#inner

五。名称空间:

  名称空间里存放了变量名与变量值的内存地址的绑定关系的地方。

  想要访问一个变量的值,必须先去名称空间中拿到对应的名字,才能够访问该变量的值。

  名称空间有很多种:

x = 1
if 1 ==1 :
y = 2
# print(y)
# while True:
# z = 3
for i in [1,2,3]:
print(i)
print(i)
def func():
username = 'jason'
print(x)
func()

  名称空间分3类:

  1.内置名称空间:python解释器提前给你定义好的名字(已经存放到内置名称空间里)

  如len,max min 等内置函数的名字都在内置名称空间

  2.全局名称空间:文件级别的代码

  如上函数所示,x,y,等都可以说是全局变量。

  3.局部名称空间:函数体内创建的名字都属于局部名称空间的。

  如上所示代码中username等。

  生命周期:每种名称都有他的作用时间

  1.内置名称空间:只要python解释器一启动,该名称空间就会立马创建,当解释器关闭时,内置名称空间也会自动销毁

  2.全局名称空间:只要右键运行py文件,就会自动创建全局变量空间:py程序运行结束时自动销毁

  3.局部名称空间:函数被调用的时候自动创建。函数指向结束变立即销毁,这种方式被称为动态创建,动态销毁。

六。名称的查找顺序

  在名称查找的过程中顺序如下

  当在局部函数中寻找名称时,会按照局部名称空间-》全局名称空间-》内置名称空间-》的顺序查询名称,而且值得注意的是当查询顺序确定以后就不会修改,所以

def func():
x = 1
def index():
print(x) # 获取全局找x
return index res = func()
x = 999
res()
#输出结果>>>1

七。作用域

  1.在其名称的使用时,内置名称空间,全局名称空间是全局有效的,而局部名称空间只在该局域内有效。

  修改值的时候也是如此,在局部时只能修改局部的数据,不能修改全局的数据,各个局部之间也不能修改,所以,要想实现局部修改全局的功能需要两个关键字的帮助:nonlocal,global

  global

  代表在局部修改全局的变量,如果想要修改多个值,之间用逗号隔开

x = 1  # 不可变类型
username = 'jason'
def func():
# x.append('嘿嘿嘿')
global x,username # 修改全局变量 而不是创建局部名称空间
x = 999
username = 'egon'
func()
print(x)
print(username)
#输出结果>>>999
#egon

  像这样的修改如在函数中修改全局变量x,和username的值。使用的就是global

  nonlocal

  当想要在函数中定义的函数里改变原来定义的函数中的变量时,,就是使用nonlocal关键字实现,如果想改变多个值,值与值之间要加逗号。

  

def func():
x = 1
def index():
nonlocal x
x = 2
index()
print(x)
func()
#输出结果>>>2

day10_7.10 函数的嵌套等的更多相关文章

  1. python函数知识二 动态参数、函数的注释、名称空间、函数的嵌套、global,nonlocal

    6.函数的动态参数 *args,**kwargs:能接受动态的位置参数和动态的关键字参数 *args -- tuple *kwargs -- dict 动态参数优先级:位置参数 > 动态位置参数 ...

  2. 10 - 函数嵌套-作用域-闭包-LEGB-函数销毁

    目录 1 函数嵌套 2 作用域 2.1 global关键字 3 闭包 3.1 nonlocal关键字 4 默认值的作用域 5 变量名解析原则LEGB 6 函数的销毁 1 函数嵌套         一个 ...

  3. day 10 函数命名空间、函数嵌套和作用域

    1. day 09 内容复习 # 函数 # 可读性强 复用性强 # def 函数名(): # 函数体 #return 返回值 # 所有的函数 只定义不调用就一定不执行 #先定义后调用 #函数名() # ...

  4. python --- 10 *args **kwargs 命名空间 作用域 函数的嵌套

    函数进阶 1.   "*"  和  "**" ① 在形参位置时   都是聚合的作用 *args    位置参数→元组 **kwargs   关键字参数→字典 混 ...

  5. python之路---10 *args **kwargs 命名空间 作用域 函数的嵌套

    二十八.函数进阶 1.   "*"  和  "**" ① 在形参位置时   都是聚合的作用 *args    位置参数→元组 **kwargs   关键字参数→ ...

  6. python中函数的定义,调用,全局变量,局部变量,函数的嵌套使用-初级篇

    函数的基本概述 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,可以思考一下如果有某个功能的代码是在多个地方使用的是否可以只写一次?此时的代码该如何定义.先观察以下的案例: ...

  7. day12(表达式,推导式,名称空间与作用域,函数的嵌套定义)

    一,复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascll进行比较 # print('a' > 'A') #True # print('ac' > 'ab' ...

  8. python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义

    复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...

  9. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

随机推荐

  1. SpringBoot 全局异常配置

    在日常web开发中发生了异常,往往是需要通过一个统一的异常处理来保证客户端能够收到友好的提示. 一.默认异常机制 默认异常处理(SpringBoot 默认提供了两种机制,一种是针对于web浏览器访问的 ...

  2. CF707D Persistent Bookcase

    CF707D Persistent Bookcase 洛谷评测传送门 题目描述 Recently in school Alina has learned what are the persistent ...

  3. CocoaPods 升级1.8.4的坑 CDN: trunk Repo update failed

    之前升级了cocoaPods 版本1.8.4,今天pod install,然后问题就来了: 1.出现了下边的问题: Adding spec repo `trunk` with CDN `https:/ ...

  4. 聊一下,前后分离后带来的跨域访问和cookie问题

    在谈前后分离前,我们先看看什么是前后一体的.当我们用javaweb开发网站时,最终我们渲染的jsp或者springthymeleaf.我们的页面其实是WEB-INFO或者templates下.当用户请 ...

  5. CodeForce 222C Reducing Fractions

    To confuse the opponents, the Galactic Empire represents fractions in an unusual format. The fractio ...

  6. mysql批量更新数据(性能优化)--第二种方式

    Spring+Mybatis 手动控制事务 参考: https://blog.csdn.net/qq_41750175/article/details/87621170 public boolean ...

  7. MySQL for OPS 08:MHA 高可用

    写在前面的话 主从架构在一般情况下只能满足我们小公司业务并非一刻都不能中断服务.但是对于大型公司而言,对然数据丢失,数据库挂了,我们可以通过技术找回,修复.但是其中修复过程所消耗的时间是不被允许的.此 ...

  8. 【01】Nginx:编译安装/动态添加模块

    写在前面的话 说起 Nginx,别说运维,就是很多开发人员也很熟悉,毕竟如今已经 2019 年了,Apache 更多的要么成为了历史,要么成为了历史残留. 我们在提及 Nginx 的时候,一直在强调他 ...

  9. 专栏《Elasticsearch 7.x从入门到精通》的相关源代码

    新版Elasticsearch 7.3 和 Spring Boot 2.1.7 集成演示项目       第一个项目:演示Elasticsearch 6.4.3 和Spring Boot 2.1.7集 ...

  10. 特征金字塔网络Feature Pyramid Networks

    小目标检测很难,为什么难.想象一下,两幅图片,尺寸一样,都是拍的红绿灯,但是一副图是离得很近的拍的,一幅图是离得很远的拍的,红绿灯在图片里只占了很小的一个角落,即便是对人眼而言,后者图片中的红绿灯也更 ...