一、参数补充

1 命名关键字参数(了解)

命名关键字参数:在定义函数时,*后定义的参数,如下所示,称之为命名关键字参数

特点1:命名关键字实参必须按照key=value的形式为其传值

def func(x,y,*,a,b):
print(x,y,a,b)
func(1,2,b=123,a=321)
#a和b必须用关键字实参传值不然报错

多形式混用:

#形参混用的顺序:位置新参,默认形参,*args,命名关键字形参,**kwargs
def func(x,y=111,*args,z,**kwargs):
print(x)
print(y)
print(args)
print(z)
print(kwargs)
func(1,2,3,4,z=13,a=123,b=123)
>>>1
>>>2
>>>(3, 4)
>>>13
>>>{'a': 123, 'b': 123}

二、名称空间

名称空间是指存放名字和对象的映射关系/绑定关系的地方,例如x=3,在内存中的栈区里开辟了一个空间来存放x和x与10的绑定关系,这个空间就是名称空间。

1.内置名称空间

存放的名字:存放的python解释器内置的名字

存活周期:python解释器启动则产生,python解释器关闭则销毁

'''
>>> print
<built-in function print>
>>> input
<built-in function input>
'''

2.全局名称空间

存放的名字:只要不是函数内定义,也不是内置的,就是全局名称

存活周期:python文件执行则产生,关闭则销毁

import os #os为全局名称
x=10 #x是全局名称
if True:
y=10#y是全局名称
def func():#func是全局名称
pass
class Foo:#Foo是全局名称
pass

3.局部名称空间

存放的名字:在函数调用时,运行函数体代码的过程中产生的函数内的名字

存活周期:在调用函数时存活,函数调用完毕后则销毁

def func(x,y):
z=10
func(1,2)

4.名称空间的加载与销毁顺序

加载顺序

内置名称空间>全局名称空间>局部名称空间

销毁顺序

局部名称空间>全局名称空间>内置名称空间

名字的查找顺序

由当前位置向上一层查找

由内到外依次是局部名称空间>全局名称空间>内置名称空间

通过示范来解释名称空间的嵌套使用

注意:名称空间的嵌套关系是以函数定义阶段为准,和调用位置无关

实例1:

x=1
def func(): #第五步:执行func函数体代码
print(x) #输出x,在该名称空间找不到x,搜索全局名称空间查找到x=1
def foo(): #第二步:执行foo函数体代码
x=222 #第三步:执行第一行,定义局部变量x=10
func() #第四步:调用func函数,foo函数到此结束,销毁内部的局部变量,即x=10
foo() #第一步:调用foo函数
>>>1 #第六步:执行代码得到1

实例2:

x=10
#此处报错是因为在函数定义阶段违反了变量先定义后引用的规则
def foo():
print(x)
x=20
foo()
>>>报错

三、作用域

即名称空间的作用范围

全局作用域:内置名称空间,全局名称空间

1.全局存活

2.全局有效,被所有函数共享

x=111
def foo():
print(x,id(x))
def bar():
print(x,id(x))
foo()
bar()
>>>111 140717457109072
>>>111 140717457109072
>>>111 140717457109072

局部作用域:局部名称空间

1.临时存活

2.局部有效,函数内有效

def foo(x):
def f1():
def f2():
print(x)
f2()
f1()
foo(1)

示范1:(global)如果想在局部里修改全局对应的变量值(不可变类型),就需要用到global

x=111
def func():
global x # 声明x这个名字是全局的名字,不要再造新的名字了
x=222
func()
print(x)

示范2:(nonlocal)修改函数外层函数包含的不可变类型

x=0
def f1():
x=11
def f2():
nonlocal x#让接下来的x=22作用在外层函数
x=22
f2()
print('f1内的x:',x)
f1()
print(x)
>>>f1内的x: 22
>>>0

day15 名称空间与作用域的更多相关文章

  1. python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域

    一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...

  2. Python--day12(三元表达式、函数对象、名称空间与作用域、函数嵌套定义)

    今日主要内容 1.  函数默认值细节(*) 2.  数据类型补充:三元表达式.列表推导式.字典推导式 (***) 3.  函数对象:函数名的各种应用场景 (*****) 4.  名称空间与作用域:解释 ...

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

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

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

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

  5. day12 函数对象,名称空间与作用域

    """ 今日内容: 1.函数参数传值细节 2.三元表达式 3.列表及字典推导式 4.函数对象 5.名称空间与作用域 6.函数的嵌套定义初识 ""&qu ...

  6. 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数

    一.函数的对象 函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用 def func():# func=函数的内地址 print('from func') print(func) ag ...

  7. python之函数对象、函数嵌套、名称空间与作用域、装饰器

    一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...

  8. 周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)

    一,复习 字符编码 文件头:py2—ASCII,py3—UTF-8 三种字符串:u' ' b ' ' r ' ' u' ' .endcode(' utf-8 ') b' '.deconde(' utf ...

  9. day12函数,三元表达式 ,列表推导式 ,字典推导式,函数对象,名称空间与作用域,函数的嵌套定义

    复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 # 函数的参数 # 1)实参与形参: # -- 形参:在函数定义时()中出现的参数 # -- 实参:在函 ...

随机推荐

  1. intput子系统

    1.按键驱动程序的第一个版本:day07/04      //内核模块的基本要求   init.h module.h LICENSE      struct cdev btn_cdev;      b ...

  2. GitHub 热点速览 Vol.24:程序员自我增值,优雅赚零花钱

    摘要:升职加薪,出任 CTO,迎娶白富美/高帅富,走向人生巅峰是很多人的梦想.在本期的热点速览中你将了解自由作者 Easy 如何优雅赚取零花钱的方法,以及定投改变命运 -- 让时间陪你慢慢变富.说到程 ...

  3. drf之框架基础

    (一)drf基础 全称:django-rest framework 接口:什么是接口.restful接口规范(协议) CBV(基于FBV的基础上形成).CBV生命周期源码----基于restful规范 ...

  4. linux安装mysql使用yum安装

    安装MySQL 安装mysql客户端: yum install mysql 安装mysql 服务器端: yum install mysql-server 至此我就可以使用Yum简单地管理MySQL更新 ...

  5. cb24a_c++_STL算法简介

    算法概述 算法部分主要由头文件<algorithm>,<numeric>和<functional>组成.       <algorithm>是所有STL ...

  6. URL is not registered (Settings | Languages & Frameworks | Schemas and DTDs)

    File - Settings - Schemas and DTDS时,选中报错的地址,然后Ctrl+alt+s打开设置(或者右键 -> setting)找到 把报错的地址填入就可以了,最后应用 ...

  7. 【asp.net core 系列】13 Identity 身份验证入门

    0. 前言 通过前两篇我们实现了如何在Service层如何访问数据,以及如何运用简单的加密算法对数据加密.这一篇我们将探索如何实现asp.net core的身份验证. 1. 身份验证 asp.net ...

  8. JavaWeb网上图书商城完整项目--day02-7.提交注册表单功能之流程分析

    1.点击注册之后将提交的信息传递到UserServlet的public String regist方法进行处理,然后将东西通过service进行处理 业务流程:

  9. drf-Authentication认证

    drf-Authentication认证 ## 源码分析 ```python """ 1)APIView的dispath(self, request, *args, ** ...

  10. IOC/DI概念简述及基本应用

    早几年面试时,面试官经常问我依赖注入的概念,但有面试官自己都不是很清楚ioc和di的区别,而是草草归于一类,今天翻了翻以前写的demo,顺便把这部分概念整理出来,加深一下印象. 先科普一下,IOC是什 ...