Python自学之路之函数一些补充

一、函数何时被创建,注意分析以下两个例子的结果:

题1:
info = []
def func():
    print(item)

for item in range(10):
    info.append(func)
print(info)
info[0]()
info[1]()
info[2]()

打印结果:
9
9
9


题2:

info = []

def func(i):
    def inner():
        print(i)
    return inner

for item in range(10):
    info.append(func(item))

info[0]()
info[1]()
info[4]()

打印结果:
0
1
4

 二、函数不被调用,永远不会执行

例1:
def func():
    return i
func_list = []
for i in range(10):
    func_list.append(func)

print(i) # 9
v1 = func_list[4]()
v2 = func_list[0]()
print(v1,v2)
打印结果:
9
9 9

例2:
func_list = []
for i in range(10):
    # func_list.append(lambda :x) # 函数不被调用,内部永远不执行(不知道是什么。)
    func_list.append(lambda :i) # 函数不被调用,内部永远不执行(不知道是什么。)

print(func_list)

v = func_list[2]()
print(v)
打印结果:
[<function <lambda> at 0x00000230B63E1E18>, <function <lambda> at 0x00000230B80C0AE8>, <function <lambda> at 0x00000230B80C0EA0>, <function <lambda> at 0x00000230B80C0B70>, <function <lambda> at 0x00000230B80C0F28>, <function <lambda> at 0x00000230B80D8048>, <function <lambda> at 0x00000230B80D80D0>, <function <lambda> at 0x00000230B80D8158>, <function <lambda> at 0x00000230B80D81E0>, <function <lambda> at 0x00000230B80D8268>]
9

三、执行函数时,会新创建一块内存保存自己函数执行的信息 => 闭包

例1:
def base():
    return i

def func(arg):
    def inner():
        return arg

    return inner

base_list = []  # [base,base,]
func_list = []  # [由第一次执行func函数的内存地址,内部arg=0 创建的inner函数,有arg=1的inner函数 ]
for i in range(10):  # i = 0 ,1
    base_list.append(base)
    func_list.append(func(i))
print(base_list)
print(func_list[2]())
print(func_list[3]())

# 1. base_list 和 func_list中分别保存的是什么?
"""
base_list中存储都是base函数。
func_list中存储的是inner函数,特别要说的是每个inner是在不同的地址创建。
"""
打印结果:

[<function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>, <function base at 0x000001B2944C1E18>]
2
3
# 2. 如果循环打印什么?
for item in base_list:
    v = item()  # 执行base函数
print(v)  # 都是9
for data in func_list:
    v = data()
    print(v)  # 0 1 2 3 4
打印结果:
9
0
1
2
3
4
5
6
7
8
9

 四、匿名函数

lambda函数也叫匿名函数,即没有具体名称的函数,他允许快速定义单行函数,可以用在任何需要函数的地方。

简单看几个lambda函数实例:

## 1、
def fn(x,y):
    return x + y
v = fn(2,3)

v2 = lambda x,y:x + y
print(v2(2,3))

## 2、
fn = [lambda j:i*j for i in range(6)]
print([f(2) for f in fn])

注意点:函数不被调用,永远不会执行,所以打印出的结果如下:
[10, 10, 10, 10, 10, 10]

## 3、
fn = map(lambda i:(lambda j: i*j), range(6)) # 0 1 2 3 4 5
print([f(2) for f in fn])

打印结果;
fn = map(lambda i:(lambda j: i*j), range(6)) # 0 1 2 3 4 5
print([f(2) for f in fn])

## 4、
lst = []
for i in range(6): # 0...5
    lst.append(lambda j:i*j)
    if i==3:
        break
print([f(2) for f in lst])

打印结果:
[6, 6, 6, 6]

## 5、
fn = [(lambda i:lambda j:i*j)(i) for i in range(6)]
print([f(2) for f in fn])

五、高级一点内置函数

  • map 循环每个元素(第二个参数),然后让每个元素执行函数(第一个参数),将每个函数执行的结果保存到新的列表中,并返回。 
v = map( lambda x : x + 1, [1, 2, 3] )
print(list(v))
打印结果:
[2, 3, 4]
  • filter
v1 = [11,22,33,'asd',44,'xf']

def func(x):
    if type(x) == int:
        return True
    return False
result = filter(func,v1) # [11,]
print(list(result))


result = filter(lambda x: True if type(x) == int else False ,v1)
print(list(result))

result = filter(lambda x: type(x) == int ,v1)
print(list(result))

打印结果:
[11, 22, 33, 44]
[11, 22, 33, 44]
[11, 22, 33, 44]
  • reduce
import functools
v1 = ['wo','hao','e']

def func(x,y):
    return x+y
result = functools.reduce(func,v1) 
print(result)

result = functools.reduce(lambda x,y:x+y,v1)
print(result)

打印结果:
wohaoe
wohaoe

 

posted @ 2019-08-26 11:39  小哥boy  阅读(85)  评论(0)    收藏  举报