一.函数名的应用
函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数
1.函数名的内存地址
1
2
3
4
|
def func():
print ( "呵呵" )
print (func)
结果: <function func at 0x1101e4ea0 >
|
2.函数名可以赋值给其他变量
1
2
3
4
|
def func():
print ( "呵呵" )
print (func) a = func # 把函数当成一个变量赋值给另一个变量
a() # 函数调用 func()
|
3.函数名可以当做容器类的元素
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.函数名可以当做函数的参数
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() # 执行上面返回的函数
|
二.闭包:闭包就是内层函数,对外层函数(非全局)的变量的引用.
好处:
1.保护变量不受外界影响
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
|
优质内容筛选与推荐>>
1、第七周
2、MATLAB 音响系统工具箱
3、什么是消息队列
4、HDU1394 Minimum Inversion Number 线段树
5、WINDOWS MOBILE下如何使用SQLLITE