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学习日记day10------函数的命名空间、作用域与闭合函数的更多相关文章

  1. Python学习日记(二十三) 类命名空间和组合

    类命名空间 在一个类中它的函数(方法)属于动态属性,直接定义的变量属于静态属性 首先先定义一个类,并在这个类里面加入静态变量.属性等然后将一个对象实例化 class Fighter: #定义一个战机的 ...

  2. day24 python学习 类 画元,命名空间作用域,组合,人狗大战升级

    类命名空间与对象.实例的命名空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变量 动态属性就 ...

  3. Python 学习日记(第三周)

    知识回顾 在上一周的学习里,我学习了一些学习Python的基础知识下面先简短的回顾一些: 1Python的版本和和安装 Python的版本主要有2.x和3.x两个版本这两个版本在语法等方面有一定的区别 ...

  4. Python学习日记 --day2

    Python学习日记 --day2 1.格式化输出:% s d  (%为占位符 s为字符串类型 d为数字类型) name = input('请输入姓名') age = int(input('请输入年龄 ...

  5. python学习日记(基础数据类型及其方法01)

    数字 int 主要是用于计算的,常用的方法有一种 #既十进制数值用二进制表示时,最少使用的位数i = 3#3的ASCII为:0000 0011,即两位 s = i.bit_length() print ...

  6. python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)

    一.动态参数 def func(a,b,c,d,e,f,g): pass func(1,2,3,4,5,6,7) 如果加30个参数呢?有没有万能的参数,可以代表一切参数呢? *args 动态参数,万能 ...

  7. Python学习5——抽象,涉及抽象和结构、函数的自定义、参数、作用域、递归

    此处将抽象和结构.自定义函数.参数的使用.作用域.递归放在一起学习,看起来很怪是不是? 但实际上这几者之间是有紧密联系的,不然Python基础教程(第三版)的作者为什么会把它们放在一起哪?手动滑稽 好 ...

  8. python学习日记(函数进阶)

    命名空间 内置命名空间 存放了python解释器为我们提供的名字:print,input...等等,他们都是我们熟悉的,拿过来就可以用的方法. 内置的名字在启动解释器(程序运行前)的时候被加载在内存里 ...

  9. Python:函数的命名空间、作用域与闭合函数

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

随机推荐

  1. JIT——即时编译的原理

     介绍 java 作为静态语言十分特殊,他需要编译,但并不是在执行之前就编译为本地机器码. 所以,在谈到 java的编译机制的时候,其实应该按时期,分为两个部分.一个是 javac指令 将java源码 ...

  2. 记录项目版本升级angular4 ~ angular5

    前言: 在上一篇ng4文章<angular4--实际项目搭建总结>中说过,等到ng5正式发布,并且蚂蚁的NG ZORRO兼容ng5之后,我会对ng4项目进行升级.这篇文章就是大概说下升级的 ...

  3. 自学python笔记(二)

    一:在Python的交互式命令行写程序,好处是一下就能得到结果,坏处是没法保存,下次还想运行的时候,还得再敲一遍.所以,实际开发的时候,我们总是使用一个文本编辑器来写代码,写完了,保存为一个文件,这样 ...

  4. 变位词(0029)-swustoj

    变位词(0029)水题 变位词如果两个单词的组成字母完全相同,只是字母的排列顺序不一样,则它们就是变位词,两个单词相同也被认为是变位词.如tea 与eat , nic 与cin, ddc与dcd, a ...

  5. mysql的复杂查询,连接数据库

    1.MySQL的工具:Navicat 优点:方便2.数据库的导入 mysqldump -u用户名 -p密码 数据库名称 > 导出文集路径 #结构+数据 mysqldump -u用户名 -p密码 ...

  6. web更改AD用户密码

    web更改AD用户密码 #web更改AD密码 #网站配置 绑定域名ad.test.cn 功能,更改AD用户密码 #参考http://bbs.51cto.com/thread-1379675-1.htm ...

  7. heartbeat+DRBD 高可用 双机热备

    heartbeat+DRBD 高可用 双机热备 原创博文http://www.cnblogs.com/elvi/p/7658109.html ## heartbeat+DRBD 高可用 双机热备 # ...

  8. iBeacon硬件厂商和产品

    最近项目比较忙,也没有时间写Blog. 这几天因为项目需要采购为数不小的iBeacon,所以花了点时间对市面上主要的iBeacon简单的调研总结了一下. 分享给需要买相关设备进行试验的小伙伴,数据不权 ...

  9. 【hdu3367】Pseudoforest(伪森林)

    http://acm.hdu.edu.cn/showproblem.php?pid=3367 题目大意 伪森林就是一个无向图,这个无向图有多个连通块且每个连通块只有一个简单环. 给你一个无向图,让你找 ...

  10. 从源代码到Runtime发生的重排序

     源代码和Runtime时执行的代码很可能不一样,这是因为编译器.处理器常常会为了追求性能对改变执行顺序.然而改变顺序执行很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时.  从源 ...