博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数进阶
阅读量:7067 次
发布时间:2019-06-28

本文共 4640 字,大约阅读时间需要 15 分钟。

三元运算:

if条件成立的结果         if      条件        else        else 条件成立的结果

a=2

b=3

c= 6 if a<b esle 7

print(c)

 

 

命名空间:

全局命名空间

局部命名空间

内置命名空间

 

def n_max(a,b):

  c=a if a>b else b

  return c

n=n_max(6,5)

 

加载顺序: (从硬盘到内存里)

内置命名空间----->全局命名空间(从上到下顺序加载进来的)------->局部命名空间(调用的时候加载)

 

 

 

!!!作用域:命名空间和作用域是分不开的,作用域分两种

1:全局作用域: 全局命名空间和内置命名空间

2:局部作用域: 局部命名空间

 

站在全局看:

如果全局有,用全局的。    如果全局没有,用内置的。

 

为什么要有作用域的概念?

 是为了函数内的变量不会影响到全局

#def max():

  a=10

  b=20

a=3

b=2

#函数的嵌套调用 # def f1(): #     print('f1') # # def f2(): #     a = 10 #     f1() #函数的嵌套 #为了保护内部函数,确定内部函数只能在外部函数中被调用 def animal():     def tiger():         print('bark')     print('eat')     tiger() # animal() #函数名的本质 def func():     print('func') print(func) # print(func) # f = func # print(f) # f() # # l = [f] # print(l) # #l[0] == f # l[0]() #可以用作函数的参数 def func():     print('func') def func2(f):     print(f)     f()     print('func2') # func2(func) #可以作为函数的返回值 def func():     print('func') def func2(f):     print('func2')     return f fu = func2(func) # print(fu) # fu() #==>func() # print(fu) # print(func) #如果我想在全局使用内部的函数
def func():     print('func') print(func) f = func l = [f] f1 = l[0] #== f print(f1) print(f) print(func) func() f() f1() #函数名做参数 # def func(): #     print('func') # def func2(f): #     f() # func2(func) #函数的名字可以做返回值 def func():     def func2():         print('hello')     return func2 # f2 = func() # f2() # f = func def heiheihei():     ha = 10     heng = 20     def inner():         print(ha)         print(heng)     inner() # heiheihei() #作用域: #小范围的可以用大范围的 #但是大范围的不能用小范围的 #范围从大到小(图) #在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的 #如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。 #如果都没有,报错 #作用域链 x = 1 def heihei():     # x = 'h'     def inner1():         # x = 'i1'         def inner2():             print(x)         inner2()     inner1() # heihei() #闭包函数:内部函数,包含了对外部作用域中变量的引用 def hei():     x = 20     def inner():         '''         闭包函数         '''         print(x) #闭包 #1.闭 内部的函数 #2.包 包含了对外部函数作用域中变量的引用 #闭包的常用形式 def hei():     x = 20     def inner():         print(x)  #局部的     return inner # i = hei() # i()  #全局 from urllib.request import urlopen # def index(): #     url = "http://www.cnblogs.com/Eva-J/articles/7125925.html" #     return urlopen(url).read() # index() def index():     url = "http://www.cnblogs.com/Eva-J/articles/7125925.html"     def inner():         return urlopen(url).read()     print(inner.__closure__)     return inner # u = "http://www.baidu.com" get = index() print(get())
补充!

3、作用域链

对函数做下调整,看看下面的代码执行结果如何?

学过函数,肯定知道最后f1()执行完会输出Snor;我们先记住一个概念,Python中有作用域链,变量会由内到外找,先去自己作用域去找,自己没有再去上级去找,直到找不到报错

4、终极版作用域

好,铺垫了够了,终极版的来了~~

想想最后f2()执行结果是打印“lzl”呢,还是打印“eric”?记住自己的答案,现在先不把答案贴出来,先看看下面这段代码:

执行结果为“lzl”,分析下上面的代码,f2()执行结果为函数f1的内存地址,即ret=f1;执行ret()等同于执行f1(),执行f1()时与f2()没有任何关系,name=“lzl”与f1()在一个作用域链,函数内部没有变量是会向外找,所以此时变量name值为“lzl”;理解了这个,那么刚才没给出答案的那个终极代码你也知道答案了

是的,输出的是“lzl”,记住在函数未执行之前,作用域已经形成了,作用域链也生成了

 
def func(): print('func') print(func) f = func l = [f] f1 = l[0] #== f print(f1) print(f) print(func) func() f() f1() #函数名做参数 # def func(): #     print('func') # def func2(f): #     f() # func2(func) #函数的名字可以做返回值 def func(): def func2(): print('hello') return func2 # f2 = func() # f2() # f = func def heiheihei(): ha = 10 heng = 20 def inner(): print(ha) print(heng) inner() # heiheihei() #作用域: #小范围的可以用大范围的 #但是大范围的不能用小范围的 #范围从大到小(图) #在小范围内,如果要用一个变量,是当前这个小范围有的,就用自己的 #如果在小范围内没有,就用上一级的,上一级没有就用上上一级的,以此类推。 #如果都没有,报错 #作用域链 x = 1 def heihei(): # x = 'h' def inner1(): # x = 'i1' def inner2(): print(x) inner2() inner1() # heihei() #闭包函数:内部函数,包含了对外部作用域中变量的引用 def hei(): x = 20 def inner(): ''' 闭包函数         ''' print(x) #闭包 #1.闭 内部的函数 #2.包 包含了对外部函数作用域中变量的引用 #闭包的常用形式 def hei(): x = 20 def inner(): print(x)  #局部的 return inner # i = hei() # i()  #全局 from urllib.request import urlopen # def index(): #     url = "http://www.cnblogs.com/Eva-J/articles/7125925.html" #     return urlopen(url).read() # index() def index(): url = "http://www.cnblogs.com/Eva-J/articles/7125925.html" def inner(): return urlopen(url).read() print(inner.__closure__) return inner # u = "http://www.cnblogs.com/Eva-J/articles/7125925.html" get = index() print(get())

转载于:https://www.cnblogs.com/ugfly/p/7241713.html

你可能感兴趣的文章
我的第一篇博客 Javascript继承
查看>>
PHP观察者模式的简单实现
查看>>
Trivial File Transfer Protocol (TFTP)
查看>>
剑指offer有关链表的面试题
查看>>
C++版 - LeetCode 144. Binary Tree Preorder Traversal (二叉树先根序遍历,非递归)
查看>>
前端开发之旅-zopim在线即时聊天客服
查看>>
c++模板实现抽象工厂
查看>>
节日营销!这样搞-App运营日常
查看>>
谁是“少数幸福的人”?
查看>>
坦克大战--Java类型 ---- (2)按键设置和用户名的输入
查看>>
手机操作系统:自主力量能否崛起
查看>>
Shell在大数据时代的魅力:从一道百度大数据面试题想到的点滴
查看>>
说说參数传递(泛型托付)
查看>>
(转)大道至简,职场上做人做事做管理
查看>>
atl中控件头文件所在位置
查看>>
matlab练习程序(makelut/applylut)
查看>>
原型模式(C++)
查看>>
Cmake ,Out of Source Build
查看>>
CentOS6.10下安装mysql-5.7.24
查看>>
【C#公共帮助类】 ToolsHelper帮助类
查看>>