1,参数陷阱

如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源。

2,三元运算

c=a if a>b else b#如果a》b返回a,否则,返回b
变量 =条件返回True的结果 if 条件 else 条件返回False的结果
必须要有结果
必须要有if和else
只能是简单的情况
def func(a,b):
    a if a>b else b
print(func(5,1))

3,命名空间与作用域

3.1命名空间的种类

    命名空间有三种
    内置、全局与局部
 
3.1.1#内置命名空间-----python解释器
    #就是python解释器一启动就可以使用的名字存储在内置命名空间中
    #内置的名字在启动解释器的时候被加载进内存里
 
3.1.2#全局命名空间----我们写的代码但不是函数中的代码
    #是在程序从上到下被执行的过程中一次被执行进内存的
    #放置了我们设置的所有变量名和函数名
3.1.3#局部命名空间----函数
     #就是函数内部定义的名字(定义在函数里的名字)
     #当调用函数的时候在会产生这个名称空间,随着函数执行的结束,这个命名空间就又消失了。
  #在局部:可以使用全局、也可以使用内置命名空间中的名字
  #在全局:可以使用内置命名空间中的名字,但不能使用局部命名空间中的名字
  #在内置:不能使用局部和全局的名字的
 3.1.4内置命名空间、全局命名空间与局部命名空间的关系:

依赖倒置原则:上层模块应该依赖下层模块,不能反向依赖

在正常情况下,直接使用内置的名字。
当我们在全局定义了和内置名字空间中同名的名字时,会使用全局的名字。
当只有的时候,就不会找上一级要
如果自己没有就找上一级要
如果上一级没有,就再向上一级要
多个函数拥有多个独立的局部明明空间,不互相共享
def input():
print('in input now')
def func():
input() func()

4,作用域有两种

  全局作用域与局部作用域

  #全局作用域--->作用在全局----内置和全局名字空间中的名字都属于全局作用域--globals()
       #局部作用域--->作用在局部----函数(局部名字空间中的名字属于局部作用域-----locals()
a =1
def func():
global a
a+=1
func()
print(a)
#对于不可变数据类型在局部可以查看全局作用域中的变量,但是不能直接修改
#如果想要修改需要在程序的一开始添加global声明
#如果在一个局部内(函数)内声明了一个global变量,这个变量在局部的所有操作将对全局变量有效
# a = 1
# b = 2
# def func():
# x = 'aaa'
# y = 'bbb'
# print(locals())
# print(globals())
#
# func()
# print(globals())
# print(locals()) #本地的--->在函数体的外部使用locals,作用与globals是相同的
 
#globals 永远打印全局的名字
#locals输出什么 根据locals所以在的位置
a =1
b =2
print(globals())
print(locals())

5,函数的嵌套调用

def max(a,b)
return a if a>b else b
def the_max(x,y,z):
c =max(x,y)
return max(c,z)
print(the_max(1,2,3))

在一个函数的函数体内调用另一个函数叫做函数的嵌套调用

6,函数的嵌套定义

内部函数可以使用外部函数的变量叫做函数的嵌套

def outer():
def inner():
print('inner')
def inner2():
a+=1 #不可变数据类型的修改
print(a,b)
print('inner2')
inner2()
inner()
outer()

def outer():
a =1
def inner():
b =2
print(a)
print('inner')
def inner2():
a+=1
print('inner2')
inner2()
inner()
print('**a**:',a)
outer()

6.1nonlocal a #声明了一个上面第一层局部变量
a =1
def outer():
a=1
def inner():
b=2
print(a)
print('inner')
def inner2():
nonlocal a
a+=1
inner2()
inner()
print('**a**:',a)
outer()
print('全局:',a)
#nonlocal 只能用于局部变量,找上层中离当前函数最近一层的局部变量
#声明了nonlocal的内部函数的变量修改会影响到离当前函数最近一层的局部变量
对全局无效
对局部也只对最近的一层有影响

7,作用域链

在内部函数适用变量的时候,是从小局部到大局部到全局到内置名字的过程,一级一级往上找,找到最近的一个就使用一一作用域链
a =0
def outer():
def inner():
def inner2():
print(a)
inner2()
inner()
outer()
函数名的本质--------第一类对象
7.1函数名可以赋值
def func():
  print(123)
func2 =func
func2()
7.2函数名可以作为容器类型的元素
def func():
print(123)
func() #函数名就是内存地址
func2 = func #函数名可以赋值
func2()
l = [func,func2] #函数名可以作为容器类型的元素
print(l)
for i in l:
i()
7.3函数名可以作为函数的参数和返回值:
def func():
print(123)
def wahaha(f)
f()
wahaha(func)
7.4函数名可以作为函数的返回值
def func():
print(123)
def wahaha(f)
f()
return f
qqxing =wahaha(func)
qqxing()

8,闭包:嵌套函数,且内部函数要调用外部函数的变量

def outer():
a =1
def inner():#--->inner是一个闭包
print(a)
print(inner._closure_)
outer
常见的闭包函数形式
def outer():
a =1
def inner():#--->inner是一个闭包
print(a)
return inner
outer
inn =outer()
inn()
在一个函数的外部调用内部的函数
 
闭包函数应用:
def get_url():
urlopen('http://www.xiaohua100.cn/index.html').read()
def inner():
ret = urlopen(url)
print(ret)
return inner
get_func =get_url()
get_func()

Python:函数的命名空间、作用域与闭合函数的更多相关文章

  1. 九. Python基础(9)--命名空间, 作用域

    九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...

  2. Python学习日记day10------函数的命名空间、作用域与闭合函数

    1,参数陷阱 如果默认参数的只是一个可变数据类型,那么每一次调用的时候,如果不传值就共用这个数据类型的资源. 2,三元运算 c=a if a>b else b#如果a>b返回a,否则,返回 ...

  3. python函数对象-命名空间-作用域-02

    函数对象 函数是第一对象: # 函数名指向的值可以被当做参数传递 函数对象的特性(*****灵活运用,后面讲装饰器会用到) 函数名可以像变量一样被传递 # 变量可以被传递 name = 'jason' ...

  4. day10 python学习 函数的嵌套命名空间作用域 三元运算 位置参数 默认参数 动态参数

    1.三元运算 #1.三元运算 利用已下方法就可以实现一步运算返回a b中大的值 def my_max(a,b): c=0 a=int(input('请输入')) b=int(input('请输入')) ...

  5. python之路day10-命名空间和作用域、函数嵌套,作用域链、闭包

    楔子 假如有一个函数,实现返回两个数中的较大值: def my_max(x,y): m = x if x>y else y return mbigger = my_max(10,20)print ...

  6. Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器

    目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...

  7. python 函数的作用域,闭包函数的用法

    一.三元表达式 if条件成功的值    if  条件   else else条件成功的值 #if条件成立的结果 if 条件 else else条件成立的结果 # a = 20 # b = 10 # c ...

  8. 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)

    假设我们要设计一个包含以下操作的 Sales_data 类: 1.一个 isbn 成员函数,用于返回对象的 book_no 成员变量 2.一个 combine 成员函数,用于将一个 Sales_dat ...

  9. python变量的命名空间

    首先必须要提一下python程序执行过程中变量的查找规则 较官方的查找机制是: 局部作用域--外部函数作用域--全局作用域--内建函数作用域 其实一般内建函数中的作用域很少会涉及到,因为内建函数其实是 ...

随机推荐

  1. shell 实现文件改名

    修改文件名可以有不同的命令方式,mv 可以实现,但是使用rename 这种专业的改名字很好 对于单个的文件,可以直接使用以上的命令,那如果有大量的类似格式的文件名需要修改成其他格式的,该如何呢? 创建 ...

  2. 【3dsMax安装失败,如何卸载、安装3dMax 2013?】

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  3. How to fix the issue that GEM_HOME and/or GEM_PATH not set issue for rvm in mac version 10.12

    add following lines below "export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for s ...

  4. Windows 那些坑

    Windows Qt搭建 安装Qt 选择MinGW或者MSVC(建议VC), qt自动检测编译器, 基本上不用配置 去掉UWP(Windows通用平台开始, 不同于传统的exe, 它可以运行在所有的W ...

  5. java 读写操作大文件 BufferedReader和RandomAccessFile

    一 老问这问题,两个都答出来算加分项? 二 具体代码如下,没什么好说的直接说对比. BufferedReader和RandomAccessFile的区别RandomAccessFile 在数据越大,性 ...

  6. Oracle 数据类型详解

    数据类型(datatype)是列(column)或存储过程中的一个属性. Oracle支持的数据类型可以分为三个基本种类:字符数据类型.数字数据类型以及表示其它数据的数据类型. 字符数据类型 CHAR ...

  7. ASP.NET复习笔记(1)

    今天是个好日子,伴着早上八点的朝阳,我背上书包,提上电脑,带上一根网线,风风火火的冲向教室,因为,我终于想好博客内容写啥了——这不是快期末了么,我就写复习,虽然有些课程还没讲完,但并不影响我做复习,正 ...

  8. guava的限流工具RateLimiter使用

    guava限流工具使用 非常详细的一篇使用博客:https://www.cnblogs.com/yeyinfu/p/7316972.html 1,原理:Guava RateLimiter基于令牌桶算法 ...

  9. 隐藏 google 地图 Logo 隐藏 百度 地图 Logo

    Google 地图 var isFirstLoad=true; //地图瓦片加载完成之后的回调 google.maps.event.addListener(map, 'tilesloaded', fu ...

  10. Centos6安装oracle10g

    刚刚开始学OCP.第一关,安装,被折腾得稀碎...查询了大量资料,多次失败后终于总结出一些经验,简单整理如下.[2014-12-11 重新整理了一下顺序,修改了脚本!] 需要注意的是:如果想尝试我提供 ...