一.函數名的應用python
函數名是一個變量,但它是一個特殊的變量,與括號配合能夠執行函數閉包
1.函數名的內存地址函數
1
2
3
4
|
def
func():
print
(
"呵呵"
)
print
(func)
結果: <function func at
0x1101e4ea0
>
|
2.函數名能夠賦值給其餘變量post
1
2
3
4
|
def
func():
print
(
"呵呵"
)
print
(func) a
=
func
# 把函數當成一個變量賦值給另外一個變量
a()
# 函數調用 func()
|
3.函數名能夠當作容器類的元素spa
1
2
3
4
5
6
7
8
9
10
11
|
def
func1():
print
(
"呵呵"
)
def
func2():
print
(
"呵呵"
)
def
func3():
print
(
"呵呵"
)
def
func4():
print
(
"呵呵"
)
lst
=
[func1, func2, func3]
for
i
in
lst:
i()
#調用函數
|
4.函數名能夠當作函數的參數code
1
2
3
4
5
6
7
|
def
func():
print
(
"吃了麼"
)
def
func2(fn):
print
(
"我是func2"
)
fn()
# 執行傳遞過來的fn
print
(
"我是func2"
)
func2(func)
# 把函數func當成參數傳遞給func2的參數fn.
|
5.函數名能夠做爲函數的返回值對象
1
2
3
4
5
6
7
8
9
|
def
func_1():
print
(
"這裏是函數1"
)
def
func_2():
print
(
"這裏是函數2"
)
print
(
"這裏是函數1"
)
return
func_2
fn
=
func_1()
# 執行函數1. 函數1返回的是函數2, 這時fn指向的就是上面函數2
fn()
# 執行上面返回的函數
|
二.閉包:閉包就是內層函數,對外層函數(非全局)的變量的引用.blog
好處: 內存
1.保護變量不受外界影響ci
2.能夠讓變量常駐內存
1
2
3
4
5
6
7
|
def
func1():
name
=
"alex"
def
func2():
print
(name)
# 閉包
func2()
func1()
結果: alex
|
能夠使用__closure__來檢測函數是不是閉包.返回cell就是閉包,返回None就不是閉包.
1
2
3
4
5
6
7
|
def
func1():
name
=
"alex"
def
func2():
print
(name)
# 閉包
func2()
print
(func2.__closure__)
# (<cell at 0x10c2e20a8: str object at 0x10c3fc650>,)
func1()
|
在函數外部調用內部函數
1
2
3
4
5
6
7
|
def
outer():
name
=
"alex"
# 內部函數
def
inner():
print
(name)
return
inner
fn
=
outer()
# 訪問外部函數, 獲取到內部函數的函數地址
fn()
# 訪問內部函數
|
多層嵌套時,一層一層返回便可
1
2
3
4
5
6
7
|
def
func1():
def
func2():
def
func3():
print
(
"嘿嘿"
)
return
func3
return
func2
func1()()()
|
Python中規定,若是你在內部函數中訪問了外層函數中的變量,那麼這個變量將不會消亡,將會常駐內存中.
三.迭代器
可迭代對象:Iterable,裏面有__iter__()能夠獲取迭代器,沒有__next__()
迭代器: Iterator,裏面有__iter__()能夠獲取迭代器,還有__next__()
迭代器的特色:
1.只能向前
2.惰性機制
3.省內存(生成器)
能夠經過dir函數查看類中定義好的方法
1
2
3
4
|
s
=
"個人哈哈哈"
print
(
dir
(s))
# 能夠打印對象中的方法和函數
print
(
dir
(
str
))
# 也能夠打印類中聲明的方法和函數
|
可迭代對象能夠使用for循環
打印的結果中能找到__iter__函數,則是可迭代對象
也能夠經過isinstance()函數查看對象是否是可迭代對象
1
2
|
from
collections
import
Iterable
# 可迭代對象
from
collections
import
Iterator
# 迭代器
|
lst = ["alex爲何這麼帥","我不信","大家信嗎?"]
1
|
print
(
isinstance
(lst, Iterable)) <br>
print
(
isinstance
(lst, Iterator))
|
可迭代對象能夠經過.__iter__()獲取迭代器
for循環的內部機制
1.首先獲取到迭代器.
2.使用while循環獲取數據
3.it.__next__()獲取數據
4.處理異常 try: xxx except StopIteration:
1
2
3
4
5
6
7
8
|
lst
=
[
"alex"
,
"wusir"
,
"taibai"
,
"ritian"
]
it
=
lst.__iter__()
# 獲取迭代器
while
1
:
try
:
# 嘗試執行
el
=
it.__next__()
# 獲取下一個元素
print
(el)
except
StopIteration:
# 處理錯誤
break
|