1.三元運算
if條件成立的結果 if 條件 else 條件不成立的結果 例如:
a=20
b=10
c=a if a>b else b
print(c)
複製程式碼
2.名稱空間
**全域性名稱空間:**建立的儲存“變數名與值的關係”的空間叫做全域性名稱空間 **區域性名稱空間:**在函式的執行中開闢的臨時的空間叫做區域性名稱空間 **內建名稱空間:**內建名稱空間中存放了python直譯器為我們提供的名字:input,print,str,list,tuple...它們都是我們熟悉的,拿過來就可以用的方法。 三種名稱空間之間的載入順序和取值順序: **載入順序:**內建(程式執行前載入)-->全域性(從上到下順序載入進來的)-->區域性(呼叫的時候載入)--->內建 **取值:**在區域性呼叫:區域性名稱空間--->全域性名稱空間--->內建名稱空間 站在全域性範圍找:全域性----內建----區域性 使用: 全域性不能使用區域性的 區域性的可以使用全域性的
3.作用域:就是作用範圍
1.名稱空間和作用域是分不開的 2.作用域分為兩種: 全域性作用域: 全域性名稱空間與內建名稱空間的名字都屬於全域性範圍 在整個檔案的任意位置都能被引用,全域性有效 區域性作用域: 區域性名稱空間,只能在區域性範圍內生效 3.站在全域性看: 使用名字的時候:如果全域性有,用全域性的 如果全域性沒有,用內建的 4.為什麼要有作用域? 為了函式內的變數不會影響到全域性 5.globals方法: 檢視全域性作用域的名字【print(globals())】 locals方法:檢視區域性作用域的名字【print(locals())】
在區域性呼叫locals()和globals()
def func():
a = 12
b = 20
print(locals())
print(globals())
func()
複製程式碼
global關鍵字:強制轉換為全域性變數
x=1
def foo():
global x #強制轉換x為全域性變數
x=10000000000
print(x)
foo()
print(x)
複製程式碼
nonlocal讓內部函式中的變數在上一層函式中生效,外部必須有
x = 1
def f1():
x = 2
def f2():
## x=3
def f3():
## global x#修改全域性的
nonlocal x ## 修改區域性的(當用nonlocal時,修改x=3為x=100000000,當x=3不存在時,修改x=2為100000000 )
## 必須在函式內部
x = 10000000000
f3()
print('f2內的列印', x)
f2()
print('f1內的列印', x)
f1()
print(x)
複製程式碼
4.函式的巢狀定義
def animal():
def tiger():
print('nark')
print('eat')
tiger()
animal()
複製程式碼
5.函式的作用域鏈
x=1
def heihei():
x='h'
def inner():
x='il'
def inner2():
print(x)
inner2()
inner()
heihei()
複製程式碼
6.函式名的本質:就是函式的記憶體地址
def func():
print('func')
print(func)#指向了函式的記憶體地址
複製程式碼
7.函式名可以用做函式的引數
def func():
print('func')
def func2(f):
f()
print('func2')
func2(func)
複製程式碼
8,函式名可以作為函式的返回值
def func():
def func2():
print('func2')
return func2
f2=func()
f2()
複製程式碼
def f1(x):
print(x)
return '123'
def f2():
ret = f1('s') #f2呼叫f1函式
print(ret)
f2()
複製程式碼
def func():
def func2():
return 'a'
return func2 #函式名作為返回值
func2=func()
print(func2())
複製程式碼
9,閉包:
閉包:1.閉 :內部的函式 2.包 :包含了對外部函式作用域中變數的引用
閉包的常用形式:
def hei():
x = 20
def inner():
#閉包函式
print(x)
return inner()
複製程式碼
判斷閉包函式的方法:closure
#輸出的__closure__有cell元素 :是閉包函式
def func():
name = 'eva'
def inner():
print(name)
print(inner.__closure__)
return inner
f = func()
f()
複製程式碼
#輸出的__closure__為None :不是閉包函式
name = 'egon'
def func2():
def inner():
print(name)
print(inner.__closure__)
return inner
f2 = func2()
f2()
複製程式碼
閉包獲取網路應用
from urllib.request import urlopen
def index(url):
def inner():
return urlopen(url).read()
return inner
u='http://www.cnblogs.com/Eva-J/articles/7156261.html#_label1'
get = index(u)
print(get())
複製程式碼
9.總結
作用域: 小範圍的可以用大範圍的,但是大範圍的不能用小範圍的
如果在小範圍內,如果要用一個變數,是當前這個小範圍有的,就用自己的 如果在小範圍內沒有,就用上一級的,上一級沒有的,就用上上級的,以此類推 如果都沒有,報錯