day15 名称空间与作用域
一、参数补充
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 名称空间与作用域的更多相关文章
- python全栈开发-Day9 函数对象、函数嵌套、名称空间与作用域
一 .函数对象 一 .函数是第一类对象,即函数可以当作数据传递 可以被引用 可以当作参数传递 返回值可以是函数 可以当作容器类型的元素 二. 利用该特性,优雅的取代多分支的if def foo(): ...
- Python--day12(三元表达式、函数对象、名称空间与作用域、函数嵌套定义)
今日主要内容 1. 函数默认值细节(*) 2. 数据类型补充:三元表达式.列表推导式.字典推导式 (***) 3. 函数对象:函数名的各种应用场景 (*****) 4. 名称空间与作用域:解释 ...
- day12(表达式,推导式,名称空间与作用域,函数的嵌套定义)
一,复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascll进行比较 # print('a' > 'A') #True # print('ac' > 'ab' ...
- python第十二天, 三元表达式, 函数对象,名称空间与作用域,函数的嵌套定义
复习 1. 字符串的比较: 2. 函数的参数:形参与实参 3. 实参的分类:位置实参与关键字实参 4. 形参分类: 1.无值位置形参 2.有值位置形参 3.可变长位置形参 4.有无值关键字形参 5.可 ...
- day12 函数对象,名称空间与作用域
""" 今日内容: 1.函数参数传值细节 2.三元表达式 3.列表及字典推导式 4.函数对象 5.名称空间与作用域 6.函数的嵌套定义初识 ""&qu ...
- 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数
一.函数的对象 函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用 def func():# func=函数的内地址 print('from func') print(func) ag ...
- python之函数对象、函数嵌套、名称空间与作用域、装饰器
一 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if de ...
- 周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)
一,复习 字符编码 文件头:py2—ASCII,py3—UTF-8 三种字符串:u' ' b ' ' r ' ' u' ' .endcode(' utf-8 ') b' '.deconde(' utf ...
- day12函数,三元表达式 ,列表推导式 ,字典推导式,函数对象,名称空间与作用域,函数的嵌套定义
复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 # 函数的参数 # 1)实参与形参: # -- 形参:在函数定义时()中出现的参数 # -- 实参:在函 ...
随机推荐
- 「从零单排canal 02」canal集群版 + admin控制台 最新搭建姿势(基于1.1.4版本)
canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据 订阅 和 消费.应该是阿里云DTS(Data Transfer Service)的开 ...
- TCP最简单的服务程序
#include <time.h>#include <stdio.h>#include <stdlib.h>#include <stdarg.h>#in ...
- 如何使用PHP生成图片
/** * 从图片文件创建Image资源 * @param $file 图片文件,支持url * @return bool|resource 成功返回图片image资源,失败返回false */ fu ...
- HTML的简介和历史发展过程
HTML的简介和历史发展过程 前言 这次写一篇对于HTML以及CSS的简介,平常我们大家都知道的编程语言有很多种,比如Java.C++.Python等等,每种编程语言都有其独具的特色,不论是语法格式还 ...
- 浅淡i.MX8M Mini处理器的效能以及平台对比
i.MX 8M Mini是恩智浦首款嵌入式多核应用处理器,定位在任何通用工业和物联网的应用,是一款针对边缘计算应用的芯片,也是恩智普i.MX系列中第一个加了机器学习核的产品线.这颗芯片采用先进的14L ...
- iOS开发实践-OOM治理
概览 说起iOS的OOM问题大家第一想到的应该更多的是内存泄漏(Memory Leak),因为无论是从早期的MRC还是2011年Apple推出的ARC内存泄漏问题一直是iOS开发者比较重视的问题,比如 ...
- cb50a_c++_STL_算法_局部排序partial_sort
cb50a_c++_STL_算法_局部排序partial_sort partial_sort(b,se,e)排序一部分,begin,source end,endcout << " ...
- 【K8s学习笔记】K8s是如何部署应用的?
本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...
- Blazor带我重玩前端(一)
写在前面 曾经我和前端朋友聊天的时候,我说我希望有一天可以用C#写前端,不过当时更多的是美好的想象,而现在这一切正变得真实…… 什么是Blazor 我们知道浏览器可以正确解释并执行JavaScript ...
- oracle包package的使用
创建包 包头: CREATE OR REPLACE PACKAGE test_pkg IS PROCEDURE update_sal(e_name VARCHAR2,newsal NUMBER); ...