函数三

函数

自定义函数
函数的参数
函数的返回值
函数的作用域
函数介绍
匿名函数
高阶函数
闭包
内置文件常用函数
递归函数
装饰器

闭包

def test_one():
    print('--1--')


test_one()  # 函数的调用     # --1--
to = test_one()              # --1--
print(id(test_one()))        # 1761933504
print(id(to))                # 1761933504    
# t_o变量指向了test_one函数的调用

# to()          # 报错

闭包的定义需要满足以下三个条件:

  • 在一个外函数中定义了一个内函数
  • 内函数里运用了外函数临时变量
  • 并且外函数返回值内函数的引用
def test(number):
    print('--1--')

    def test_in(number_in):
        print(number_in)
        print('--2--')
        return number_in + number

    print('--3--')
    return test_in


# test()执行完毕时,输出1,3。并且函数里面的变量会被释放到(number)
res = test(30)      # res = tet_in
res1 = res(25)      # tet_in()
print(res1)         # 45, 说明在外函数执行完毕时,number并没有被释放,而是继续给内层函数使用。


"""
总结:闭包它是一种现象
一般情况下,外函数执行完毕,临时变量会被释放。
但此时,外函数发现自己的临时变量会在将来被使用
所以外函数结束的时候,在返回内函数引用的同时,将外函数的临时变量与内函数进行绑定。
这也是为什么当外函数结束,但内函数仍然可以使用外函数临时变量的原因。
"""
image.png

装饰器

image.png
import time     # python内置模块,时间模块


# 计算时间的函数
def test_1():
    start = time.time()
    print('--1--')
    time.sleep(2)
    end = time.time()
    print(f'send {end - start - 2}')


def test_2():
    start = time.time()
    print('--2--')
    time.sleep(2)
    end = time.time()
    print(f'send {end - start - 2}')


def test_3():
    start = time.time()
    print('--3--')
    time.sleep(2)
    end = time.time()
    print(f'send {end - start - 2}')

test_1()
test_2()
test_3()
import time     # python内置模块,时间模块


# 计算时间的函数
def calru_time(func):
    start = time.time()
    func()
    time.sleep(2)
    end = time.time()
    print(f'send {end - start - 2}')


def test_1():
    print('--1--')
    time.sleep(2)


def test_2():
    print('--2--')
    time.sleep(2)


calru_time(test_1)
calru_time(test_2)


'''
就是在部改变函数源代码的情况下为函数添加新的功能
'''

装饰器

装饰器 (@) 是一种语法糖,主要用于在函数或类的基础上添加一些可重用的额外功
。从应用开发的角度来看的话,我们使用装饰器来对我们的应用代码进行功能性
扩展和包装,以提高代码的可重用性可维护性

image.png
# 需要给各个函数添加上打印hello world的功能
def print_hw(f):
    print('hello world')
    return f


@print_hw                      # @装饰器函数名称   test = print_hw(test)
def test():
    sum_li = sum([12, 3, 4])
    print(sum_li)
    return sum_li


@print_hw
def test2():
    print('我是老amy')

# test2 = print_hw(test)      # test函数引用作为实参 test2 = f = test
# test2()                     # test2() = f() = test()

test()
test2()

'''
1.test()函数未调用的时候,装饰器就已经执行了
'''
import time
'''
此处是问题代码,因为重复调用了test1()
'''


def calcu_time(func):       # func = test1
    start = time.time()
    func()                  # test1()
    end = time.time()
    print(f'spend {start - end}')
    return func


def test1():
    print('--1--')
    time.sleep(2)


test= calcu_time(test1)     # test = func = test1
test()

# --1--
# # spend -2.0011146068573
# # --1--
import time


# 计算时间的函数
def calcu_time(func):           # 外函数里面有内函数
    def test_in():
        start = time.time()     
        func()                  # 内函数引用内函数的临时变量
        end = time.time()
        print(f'spend {start - end}')
    return test_in              # 内函数的引用作为外函数的返回值


@calcu_time                     # test = calcu_time(test1)
def test1():
    print('--1--')
    time.sleep(2)


@calcu_time
def test2():
    print('--2--')
    time.sleep(2)


# test = calcu_time(test1)      # test + test_in
# test()                        # test_in()

# test = calcu_time(test2)      # test = test_in
# test()                        # test_in()
test1()
test2()

'''
此处,形成闭包的现象。
1.嵌套函数
2.内层函数引用外层函数变量-->函数名本质也是变量
3.内函数引用作为外层函数的返回值
'''

推导式

推导式介绍
Python 中有一种特有的语法,就是推导式(又称为解析式)。推导式是可以从一个数据
序列构建另一个新的数据序列的结构体。
共有三种推导:

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式
image.png
"""
生成一个[0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0] 的列表
"""
# print(range(0, 11 ,0.5))        # 报错 步长不能未浮点数

li=[]
for i in range(1, 21):
    li.append(i/2)

print(li)

# 列表推导式的便利之处
li1 = [i/2 for i in range(1, 21)]
print(li1)
"""
有列表如:li = [6, 2, 6, 7, -15, 8, -17, -10, -15, -4]。
需求:将li列表 <0 的数进行平方 生成新列表
"""

li = [6, 2, 6, 7, -15, 8, -17, -10, -15, -4]
li1 = []
for i in li:
    if i < 0:
        i = i ** 2
        li1.append(i)

print(li1)

# 将小于0的过滤出来 filter()
# 将过滤出来的元素 映射做平方操作
fi1 = list(filter(lambda x: x<0, li))
print(list(map(lambda x: x**2 ,fi1)))

# 注意:此处不是三目运算符!!!
li2 = [i ** 2 for i in li if i < 0]
for i in '123':
    for j in 'abc':
        for k in 'qwe':
            print(i + j + k)

# 列表推导式的镶嵌
print([i + j+ k for i in '123' for j in 'abc' for k in 'qwe'])
# 实现:一下列表中的元素 与索引 --> {key:value} 的形式
li = ['age', 'name', 'gender']
dic = {i: li.index(i) for i in li}
print(dic)# 实现:一下列表中的元素 与索引 --> {key:value} 的形式
li = ['age', 'name', 'gender']
dic = {i: li.index(i) for i in li}
print(dic)
# 实现生成10个1-100之间的袁术,取进行去重
# 集合推导式
import random
s1 = {random.randint(1, 100) for i in range(10)}
print(s1)
# 注意:没有元组推导式,而是生成器
tu = (i for i in range(3))
print(tu)           # generator
print(type(tu))     # generator
print(tuple(tu))    # (0, 1, 2)  转为 tuple 类型
image.png
image.png
image.png
image.png
"""
ü 作业 1
过滤掉该列表 names = ["jerry","hansen","Amy","Wendy","Tom","Bob"]
长度小于或等于 3 的字符串列表,并将剩下的转换成大写字母。
"""
names = ["jerry","hansen","Amy","Wendy","Tom","Bob"]
res = [name.upper() for name in names if len(name)<=3]
print(res)
"""
ü 作业 2
求 (x,y), 其中 x 是 0-5 之间的偶数, y 是 0-5 之间的奇数组成的元组列表。
效果如下: [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
"""
data = [(x,y) for x in range(0, 5, 2) for y in range(1, 5, 2)]
print(data)

data2 = [(x,y)for x in range(0, 5) if x%2==0 for y in range(0 ,5) if y%2==1]
print(data2)
"""
ü 作业 3
[ 'Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob','JAMES','jAMeS' ]
该列表很紊乱,实现去重 , 以及将名字格式统一成首字母大写 (str.capitalize())
"""

names_02 = [ 'Bob', 'JOHN', 'alice', 'bob', 'ALICE', 'James', 'Bob','JAMES','jAMeS' ]
print({name.capitalize() for name in names_02})
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容